summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.dir-locals.el133
-rw-r--r--.dockerignore41
-rw-r--r--.gitignore7
-rw-r--r--.pylintrc444
-rw-r--r--.travis.yml36
-rw-r--r--AUTHORS.rst27
-rw-r--r--CHANGELOG.rst38
-rw-r--r--Dockerfile106
-rw-r--r--Makefile89
-rw-r--r--README.rst16
-rwxr-xr-xdockerfiles/docker-entrypoint.sh132
-rw-r--r--dockerfiles/uwsgi.ini37
-rw-r--r--docs/_themes/searx/static/searx.css130
-rw-r--r--docs/_themes/searx/theme.conf6
-rw-r--r--docs/admin/api.rst96
-rw-r--r--docs/admin/arch_public.dot33
-rw-r--r--docs/admin/architecture.rst24
-rw-r--r--docs/admin/buildhosts.rst103
-rw-r--r--docs/admin/engines.rst71
-rw-r--r--docs/admin/filtron.rst148
-rw-r--r--docs/admin/index.rst16
-rw-r--r--docs/admin/installation.rst349
-rw-r--r--docs/admin/morty.rst26
-rw-r--r--docs/admin/plugins.rst39
-rw-r--r--docs/admin/settings.rst181
-rw-r--r--docs/blog/admin.rst43
-rw-r--r--docs/blog/index.rst10
-rw-r--r--docs/blog/intro-offline.rst77
-rw-r--r--docs/blog/python3.rst68
-rw-r--r--docs/blog/searx-admin-engines.pngbin0 -> 50840 bytes
-rw-r--r--docs/blog/searxpy3.pngbin0 -> 30947 bytes
-rw-r--r--docs/conf.py114
-rw-r--r--docs/dev/contribution_guide.rst180
-rw-r--r--docs/dev/csv_table.txt6
-rw-r--r--docs/dev/engine_overview.rst267
-rw-r--r--docs/dev/hello.dot3
-rw-r--r--docs/dev/index.rst15
-rw-r--r--docs/dev/makefile.rst221
-rw-r--r--docs/dev/plugins.rst54
-rw-r--r--docs/dev/quickstart.rst132
-rw-r--r--docs/dev/reST.rst1428
-rw-r--r--docs/dev/search_api.rst120
-rw-r--r--docs/dev/svg_image.svg10
-rw-r--r--docs/dev/translation.rst71
-rw-r--r--docs/index.rst32
-rw-r--r--docs/static/img/searx_logo_small.pngbin0 -> 6472 bytes
-rw-r--r--docs/user/index.rst10
-rw-r--r--docs/user/own-instance.rst77
-rw-r--r--docs/user/public_instances.rst318
-rw-r--r--docs/user/search_syntax.rst42
-rwxr-xr-xmanage.sh85
-rw-r--r--requirements-dev.txt11
-rw-r--r--requirements.txt3
-rw-r--r--searx/__init__.py3
-rw-r--r--searx/answerers/random/answerer.py2
-rw-r--r--searx/autocomplete.py4
-rw-r--r--searx/data/useragents.json15
-rw-r--r--searx/engines/__init__.py57
-rw-r--r--searx/engines/arxiv.py3
-rw-r--r--searx/engines/bing.py56
-rw-r--r--searx/engines/bing_images.py67
-rw-r--r--searx/engines/bing_videos.py50
-rw-r--r--searx/engines/btdigg.py39
-rw-r--r--searx/engines/dailymotion.py6
-rw-r--r--searx/engines/deviantart.py47
-rw-r--r--searx/engines/dictzone.py10
-rw-r--r--searx/engines/digg.py36
-rw-r--r--searx/engines/doku.py15
-rw-r--r--searx/engines/duckduckgo.py43
-rw-r--r--searx/engines/duckduckgo_definitions.py19
-rw-r--r--searx/engines/duden.py28
-rw-r--r--searx/engines/dummy-offline.py12
-rw-r--r--searx/engines/fdroid.py29
-rw-r--r--searx/engines/flickr_noapi.py73
-rw-r--r--searx/engines/framalibre.py5
-rw-r--r--searx/engines/genius.py1
-rw-r--r--searx/engines/gigablast.py43
-rw-r--r--searx/engines/google.py52
-rw-r--r--searx/engines/google_images.py16
-rw-r--r--searx/engines/google_videos.py20
-rw-r--r--searx/engines/ina.py9
-rw-r--r--searx/engines/invidious.py100
-rw-r--r--searx/engines/microsoft_academic.py2
-rw-r--r--searx/engines/openstreetmap.py2
-rw-r--r--searx/engines/qwant.py1
-rw-r--r--searx/engines/scanr_structures.py2
-rw-r--r--searx/engines/seedpeer.py78
-rw-r--r--searx/engines/soundcloud.py12
-rw-r--r--searx/engines/spotify.py14
-rw-r--r--searx/engines/startpage.py35
-rw-r--r--searx/engines/vimeo.py2
-rw-r--r--searx/engines/wikidata.py240
-rw-r--r--searx/engines/wikipedia.py9
-rw-r--r--searx/engines/wolframalpha_noapi.py2
-rw-r--r--searx/engines/www1x.py35
-rw-r--r--searx/engines/xpath.py33
-rw-r--r--searx/engines/yahoo.py18
-rw-r--r--searx/engines/youtube_api.py2
-rw-r--r--searx/engines/youtube_noapi.py17
-rw-r--r--searx/exceptions.py1
-rw-r--r--searx/plugins/https_rewrite.py3
-rw-r--r--searx/plugins/oa_doi_rewrite.py3
-rw-r--r--searx/plugins/tracker_url_remover.py27
-rw-r--r--searx/preferences.py49
-rw-r--r--searx/query.py24
-rw-r--r--searx/results.py110
-rw-r--r--searx/search.py188
-rw-r--r--searx/settings.yml148
-rw-r--r--searx/settings_robot.yml8
-rw-r--r--searx/static/css/bootstrap.min.css2
-rw-r--r--searx/static/plugins/js/infinite_scroll.js20
-rw-r--r--searx/static/plugins/js/vim_hotkeys.js12
-rw-r--r--searx/static/themes/courgette/css/style-rtl.css2
-rw-r--r--searx/static/themes/courgette/css/style.css2
-rw-r--r--searx/static/themes/courgette/less/style.less4
-rw-r--r--searx/static/themes/legacy/css/style.css2
-rw-r--r--searx/static/themes/legacy/less/autocompleter.less122
-rw-r--r--searx/static/themes/legacy/less/style.less4
-rw-r--r--searx/static/themes/oscar/css/logicodev-dark.css732
-rw-r--r--searx/static/themes/oscar/css/logicodev-dark.min.css2
-rw-r--r--searx/static/themes/oscar/css/logicodev.css931
-rw-r--r--searx/static/themes/oscar/css/logicodev.min.css2
-rw-r--r--searx/static/themes/oscar/css/pointhi.css562
-rw-r--r--searx/static/themes/oscar/gruntfile.js6
-rw-r--r--searx/static/themes/oscar/img/icons/invidious.pngbin0 -> 3427 bytes
-rw-r--r--searx/static/themes/oscar/js/searx.js356
-rw-r--r--searx/static/themes/oscar/js/searx.min.js4
-rw-r--r--searx/static/themes/oscar/js/searx_src/00_requirejs_config.js46
-rw-r--r--searx/static/themes/oscar/js/searx_src/01_init.js30
-rw-r--r--searx/static/themes/oscar/js/searx_src/autocompleter.js74
-rw-r--r--searx/static/themes/oscar/js/searx_src/element_modifiers.js198
-rw-r--r--searx/static/themes/oscar/js/searx_src/leaflet_map.js334
-rw-r--r--searx/static/themes/oscar/less/logicodev-dark/oscar.less6
-rw-r--r--searx/static/themes/oscar/less/logicodev/code.less4
-rw-r--r--searx/static/themes/oscar/less/logicodev/infobox.less2
-rw-r--r--searx/static/themes/oscar/less/logicodev/navbar.less1
-rw-r--r--searx/static/themes/oscar/less/logicodev/results.less12
-rw-r--r--searx/static/themes/oscar/less/pointhi/code.less2
-rw-r--r--searx/static/themes/oscar/less/pointhi/infobox.less2
-rw-r--r--searx/static/themes/oscar/package.json9
-rw-r--r--searx/static/themes/pix-art/css/style.css2
-rw-r--r--searx/static/themes/simple/css/searx-rtl.css2
-rw-r--r--searx/static/themes/simple/css/searx-rtl.min.css2
-rw-r--r--searx/static/themes/simple/css/searx.css2
-rw-r--r--searx/static/themes/simple/css/searx.min.css2
-rw-r--r--searx/static/themes/simple/gruntfile.js49
-rw-r--r--searx/static/themes/simple/js/searx.head.js40
-rw-r--r--searx/static/themes/simple/js/searx.head.min.js4
-rw-r--r--searx/static/themes/simple/js/searx.head.min.js.map1
-rw-r--r--searx/static/themes/simple/js/searx.js12
-rw-r--r--searx/static/themes/simple/js/searx.min.js10
-rw-r--r--searx/static/themes/simple/js/searx.min.js.map2
-rw-r--r--searx/static/themes/simple/js/searx_head/00_init.js40
-rw-r--r--searx/static/themes/simple/js/searx_src/00_searx_toolkit.js10
-rw-r--r--searx/static/themes/simple/js/searx_src/searx_search.js2
-rw-r--r--searx/static/themes/simple/leaflet/leaflet.css1272
-rw-r--r--searx/templates/courgette/result_templates/key-value.html13
-rw-r--r--searx/templates/courgette/result_templates/torrent.html2
-rw-r--r--searx/templates/courgette/results.html4
-rw-r--r--searx/templates/legacy/result_templates/key-value.html13
-rw-r--r--searx/templates/legacy/result_templates/torrent.html2
-rw-r--r--searx/templates/legacy/results.html4
-rw-r--r--searx/templates/oscar/advanced.html9
-rw-r--r--searx/templates/oscar/base.html31
-rw-r--r--searx/templates/oscar/categories.html18
-rw-r--r--searx/templates/oscar/infobox.html33
-rw-r--r--searx/templates/oscar/languages.html18
-rw-r--r--searx/templates/oscar/macros.html40
-rw-r--r--searx/templates/oscar/navbar.html16
-rw-r--r--searx/templates/oscar/preferences.html72
-rw-r--r--searx/templates/oscar/result_templates/code.html36
-rw-r--r--searx/templates/oscar/result_templates/default.html62
-rw-r--r--searx/templates/oscar/result_templates/images.html75
-rw-r--r--searx/templates/oscar/result_templates/key-value.html19
-rw-r--r--searx/templates/oscar/result_templates/map.html144
-rw-r--r--searx/templates/oscar/result_templates/torrent.html2
-rw-r--r--searx/templates/oscar/result_templates/videos.html54
-rw-r--r--searx/templates/oscar/results.html311
-rw-r--r--searx/templates/oscar/search.html48
-rw-r--r--searx/templates/oscar/search_full.html36
-rw-r--r--searx/templates/oscar/time-range.html22
-rw-r--r--searx/templates/simple/base.html25
-rw-r--r--searx/templates/simple/infobox.html5
-rw-r--r--searx/templates/simple/result_templates/key-value.html11
-rw-r--r--searx/templates/simple/result_templates/torrent.html2
-rw-r--r--searx/templates/simple/results.html20
-rw-r--r--searx/templates/simple/search.html1
-rw-r--r--searx/testing.py18
-rw-r--r--searx/translations/ar/LC_MESSAGES/messages.mobin14049 -> 10316 bytes
-rw-r--r--searx/translations/ar/LC_MESSAGES/messages.po150
-rw-r--r--searx/translations/bg/LC_MESSAGES/messages.mobin13778 -> 9690 bytes
-rw-r--r--searx/translations/bg/LC_MESSAGES/messages.po150
-rw-r--r--searx/translations/bo/LC_MESSAGES/messages.mobin0 -> 18914 bytes
-rw-r--r--searx/translations/bo/LC_MESSAGES/messages.po998
-rw-r--r--searx/translations/ca/LC_MESSAGES/messages.mobin12694 -> 12305 bytes
-rw-r--r--searx/translations/ca/LC_MESSAGES/messages.po152
-rw-r--r--searx/translations/cs/LC_MESSAGES/messages.mobin12146 -> 9765 bytes
-rw-r--r--searx/translations/cs/LC_MESSAGES/messages.po150
-rw-r--r--searx/translations/cy/LC_MESSAGES/messages.mobin12014 -> 7073 bytes
-rw-r--r--searx/translations/cy/LC_MESSAGES/messages.po151
-rw-r--r--searx/translations/da/LC_MESSAGES/messages.mobin12050 -> 11639 bytes
-rw-r--r--searx/translations/da/LC_MESSAGES/messages.po151
-rw-r--r--searx/translations/de/LC_MESSAGES/messages.mobin12686 -> 12265 bytes
-rw-r--r--searx/translations/de/LC_MESSAGES/messages.po159
-rw-r--r--searx/translations/el_GR/LC_MESSAGES/messages.mobin14021 -> 8236 bytes
-rw-r--r--searx/translations/el_GR/LC_MESSAGES/messages.po149
-rw-r--r--searx/translations/en/LC_MESSAGES/messages.mobin7565 -> 443 bytes
-rw-r--r--searx/translations/eo/LC_MESSAGES/messages.mobin12014 -> 11604 bytes
-rw-r--r--searx/translations/eo/LC_MESSAGES/messages.po151
-rw-r--r--searx/translations/es/LC_MESSAGES/messages.mobin12688 -> 12277 bytes
-rw-r--r--searx/translations/es/LC_MESSAGES/messages.po153
-rw-r--r--searx/translations/et/LC_MESSAGES/messages.mobin0 -> 11423 bytes
-rw-r--r--searx/translations/et/LC_MESSAGES/messages.po998
-rw-r--r--searx/translations/eu/LC_MESSAGES/messages.mobin12356 -> 11959 bytes
-rw-r--r--searx/translations/eu/LC_MESSAGES/messages.po163
-rw-r--r--searx/translations/fa_IR/LC_MESSAGES/messages.mobin14896 -> 14413 bytes
-rw-r--r--searx/translations/fa_IR/LC_MESSAGES/messages.po155
-rw-r--r--searx/translations/fi/LC_MESSAGES/messages.mobin12258 -> 11877 bytes
-rw-r--r--searx/translations/fi/LC_MESSAGES/messages.po149
-rw-r--r--searx/translations/fil/LC_MESSAGES/messages.mobin12541 -> 12151 bytes
-rw-r--r--searx/translations/fil/LC_MESSAGES/messages.po151
-rw-r--r--searx/translations/fr/LC_MESSAGES/messages.mobin12868 -> 12463 bytes
-rw-r--r--searx/translations/fr/LC_MESSAGES/messages.po152
-rw-r--r--searx/translations/gl/LC_MESSAGES/messages.mobin12353 -> 11948 bytes
-rw-r--r--searx/translations/gl/LC_MESSAGES/messages.po151
-rw-r--r--searx/translations/he/LC_MESSAGES/messages.mobin13386 -> 12736 bytes
-rw-r--r--searx/translations/he/LC_MESSAGES/messages.po185
-rw-r--r--searx/translations/hr/LC_MESSAGES/messages.mobin12434 -> 11991 bytes
-rw-r--r--searx/translations/hr/LC_MESSAGES/messages.po151
-rw-r--r--searx/translations/hu/LC_MESSAGES/messages.mobin12063 -> 11707 bytes
-rw-r--r--searx/translations/hu/LC_MESSAGES/messages.po149
-rw-r--r--searx/translations/ia/LC_MESSAGES/messages.mobin0 -> 12210 bytes
-rw-r--r--searx/translations/ia/LC_MESSAGES/messages.po998
-rw-r--r--searx/translations/it/LC_MESSAGES/messages.mobin12276 -> 11900 bytes
-rw-r--r--searx/translations/it/LC_MESSAGES/messages.po179
-rw-r--r--searx/translations/ja/LC_MESSAGES/messages.mobin13555 -> 13084 bytes
-rw-r--r--searx/translations/ja/LC_MESSAGES/messages.po154
-rw-r--r--searx/translations/lt/LC_MESSAGES/messages.mobin0 -> 12354 bytes
-rw-r--r--searx/translations/lt/LC_MESSAGES/messages.po998
-rw-r--r--searx/translations/nl/LC_MESSAGES/messages.mobin12267 -> 11863 bytes
-rw-r--r--searx/translations/nl/LC_MESSAGES/messages.po149
-rw-r--r--searx/translations/nl_BE/LC_MESSAGES/messages.mobin12378 -> 11974 bytes
-rw-r--r--searx/translations/nl_BE/LC_MESSAGES/messages.po151
-rw-r--r--searx/translations/oc/LC_MESSAGES/messages.mobin0 -> 12157 bytes
-rw-r--r--searx/translations/oc/LC_MESSAGES/messages.po999
-rw-r--r--searx/translations/pl/LC_MESSAGES/messages.mobin12768 -> 12768 bytes
-rw-r--r--searx/translations/pt/LC_MESSAGES/messages.mobin12482 -> 12068 bytes
-rw-r--r--searx/translations/pt/LC_MESSAGES/messages.po153
-rw-r--r--searx/translations/pt_BR/LC_MESSAGES/messages.mobin12417 -> 12006 bytes
-rw-r--r--searx/translations/pt_BR/LC_MESSAGES/messages.po155
-rw-r--r--searx/translations/ro/LC_MESSAGES/messages.mobin12819 -> 12380 bytes
-rw-r--r--searx/translations/ro/LC_MESSAGES/messages.po153
-rw-r--r--searx/translations/ru/LC_MESSAGES/messages.mobin15970 -> 15439 bytes
-rw-r--r--searx/translations/ru/LC_MESSAGES/messages.po151
-rw-r--r--searx/translations/sk/LC_MESSAGES/messages.mobin12395 -> 10764 bytes
-rw-r--r--searx/translations/sk/LC_MESSAGES/messages.po153
-rw-r--r--searx/translations/sl/LC_MESSAGES/messages.mobin12146 -> 11768 bytes
-rw-r--r--searx/translations/sl/LC_MESSAGES/messages.po149
-rw-r--r--searx/translations/sr/LC_MESSAGES/messages.mobin15151 -> 14618 bytes
-rw-r--r--searx/translations/sr/LC_MESSAGES/messages.po154
-rw-r--r--searx/translations/sv/LC_MESSAGES/messages.mobin12035 -> 11633 bytes
-rw-r--r--searx/translations/sv/LC_MESSAGES/messages.po159
-rw-r--r--searx/translations/ta/LC_MESSAGES/messages.mobin0 -> 16267 bytes
-rw-r--r--searx/translations/ta/LC_MESSAGES/messages.po1003
-rw-r--r--searx/translations/te/LC_MESSAGES/messages.mobin13839 -> 6648 bytes
-rw-r--r--searx/translations/te/LC_MESSAGES/messages.po149
-rw-r--r--searx/translations/tr/LC_MESSAGES/messages.mobin12108 -> 7189 bytes
-rw-r--r--searx/translations/tr/LC_MESSAGES/messages.po149
-rw-r--r--searx/translations/uk/LC_MESSAGES/messages.mobin15440 -> 13914 bytes
-rw-r--r--searx/translations/uk/LC_MESSAGES/messages.po152
-rw-r--r--searx/translations/vi/LC_MESSAGES/messages.mobin13433 -> 12934 bytes
-rw-r--r--searx/translations/vi/LC_MESSAGES/messages.po151
-rw-r--r--searx/translations/zh_CN/LC_MESSAGES/messages.mobin11590 -> 11157 bytes
-rw-r--r--searx/translations/zh_CN/LC_MESSAGES/messages.po159
-rw-r--r--searx/translations/zh_Hant_TW/LC_MESSAGES/messages.mobin11622 -> 11622 bytes
-rw-r--r--searx/translations/zh_TW/LC_MESSAGES/messages.mobin11608 -> 11162 bytes
-rw-r--r--searx/translations/zh_TW/LC_MESSAGES/messages.po156
-rw-r--r--searx/utils.py84
-rw-r--r--searx/version.py2
-rw-r--r--searx/webapp.py92
-rw-r--r--setup.py12
-rw-r--r--tests/unit/engines/__init__.py0
-rw-r--r--tests/unit/engines/pubmed.py37
-rw-r--r--tests/unit/engines/seedpeer_fixture.html110
-rw-r--r--tests/unit/engines/test_acgsou.py78
-rw-r--r--tests/unit/engines/test_archlinux.py111
-rw-r--r--tests/unit/engines/test_arxiv.py58
-rw-r--r--tests/unit/engines/test_base.py91
-rw-r--r--tests/unit/engines/test_bing.py121
-rw-r--r--tests/unit/engines/test_bing_images.py118
-rw-r--r--tests/unit/engines/test_bing_news.py147
-rw-r--r--tests/unit/engines/test_bing_videos.py100
-rw-r--r--tests/unit/engines/test_btdigg.py384
-rw-r--r--tests/unit/engines/test_currency_convert.py56
-rw-r--r--tests/unit/engines/test_dailymotion.py112
-rw-r--r--tests/unit/engines/test_deezer.py57
-rw-r--r--tests/unit/engines/test_deviantart.py95
-rw-r--r--tests/unit/engines/test_digbt.py61
-rw-r--r--tests/unit/engines/test_digg.py101
-rw-r--r--tests/unit/engines/test_doku.py79
-rw-r--r--tests/unit/engines/test_duckduckgo.py106
-rw-r--r--tests/unit/engines/test_duckduckgo_definitions.py255
-rw-r--r--tests/unit/engines/test_duckduckgo_images.py75
-rw-r--r--tests/unit/engines/test_duden.py41
-rw-r--r--tests/unit/engines/test_dummy.py26
-rw-r--r--tests/unit/engines/test_faroo.py113
-rw-r--r--tests/unit/engines/test_fdroid.py49
-rw-r--r--tests/unit/engines/test_flickr.py142
-rw-r--r--tests/unit/engines/test_flickr_noapi.py329
-rw-r--r--tests/unit/engines/test_framalibre.py103
-rw-r--r--tests/unit/engines/test_frinkiac.py50
-rw-r--r--tests/unit/engines/test_genius.py231
-rw-r--r--tests/unit/engines/test_gigablast.py119
-rw-r--r--tests/unit/engines/test_github.py61
-rw-r--r--tests/unit/engines/test_google.py237
-rw-r--r--tests/unit/engines/test_google_images.py27
-rw-r--r--tests/unit/engines/test_google_news.py102
-rw-r--r--tests/unit/engines/test_google_videos.py79
-rw-r--r--tests/unit/engines/test_ina.py64
-rw-r--r--tests/unit/engines/test_kickass.py397
-rw-r--r--tests/unit/engines/test_mediawiki.py130
-rw-r--r--tests/unit/engines/test_mixcloud.py67
-rw-r--r--tests/unit/engines/test_nyaa.py124
-rw-r--r--tests/unit/engines/test_openstreetmap.py199
-rw-r--r--tests/unit/engines/test_pdbe.py109
-rw-r--r--tests/unit/engines/test_photon.py166
-rw-r--r--tests/unit/engines/test_piratebay.py166
-rw-r--r--tests/unit/engines/test_qwant.py339
-rw-r--r--tests/unit/engines/test_reddit.py71
-rw-r--r--tests/unit/engines/test_scanr_structures.py175
-rw-r--r--tests/unit/engines/test_searchcode_code.py75
-rw-r--r--tests/unit/engines/test_searchcode_doc.py70
-rw-r--r--tests/unit/engines/test_soundcloud.py192
-rw-r--r--tests/unit/engines/test_spotify.py124
-rw-r--r--tests/unit/engines/test_stackoverflow.py106
-rw-r--r--tests/unit/engines/test_startpage.py140
-rw-r--r--tests/unit/engines/test_tokyotoshokan.py110
-rw-r--r--tests/unit/engines/test_torrentz.py87
-rw-r--r--tests/unit/engines/test_twitter.py502
-rw-r--r--tests/unit/engines/test_unsplash.py38
-rw-r--r--tests/unit/engines/test_vimeo.py36
-rw-r--r--tests/unit/engines/test_wikidata.py506
-rw-r--r--tests/unit/engines/test_wikipedia.py263
-rw-r--r--tests/unit/engines/test_wolframalpha_api.py166
-rw-r--r--tests/unit/engines/test_wolframalpha_noapi.py224
-rw-r--r--tests/unit/engines/test_www1x.py57
-rw-r--r--tests/unit/engines/test_yacy.py96
-rw-r--r--tests/unit/engines/test_yahoo.py190
-rw-r--r--tests/unit/engines/test_yahoo_news.py150
-rw-r--r--tests/unit/engines/test_youtube_api.py111
-rw-r--r--tests/unit/engines/test_youtube_noapi.py124
-rw-r--r--tests/unit/engines/unsplash_fixture.json241
-rw-r--r--tests/unit/test_preferences.py20
-rw-r--r--tests/unit/test_query.py42
-rw-r--r--tests/unit/test_search.py108
-rw-r--r--tests/unit/test_utils.py21
-rw-r--r--tests/unit/test_webapp.py33
-rw-r--r--utils/makefile.include128
-rw-r--r--utils/makefile.python290
-rw-r--r--utils/makefile.sphinx216
-rwxr-xr-xutils/standalone_searx.py2
361 files changed, 20976 insertions, 15195 deletions
diff --git a/.dir-locals.el b/.dir-locals.el
new file mode 100644
index 000000000..d7ec87921
--- /dev/null
+++ b/.dir-locals.el
@@ -0,0 +1,133 @@
+;;; .dir-locals.el
+;;
+;; If you get ``*** EPC Error ***`` (even after a jedi:install-server) in your
+;; emacs session, mostly you have jedi-mode enabled but the python enviroment is
+;; missed. The python environment has to be next to the
+;; ``<repo>/.dir-locals.el`` in::
+;;
+;; ./local/py3
+;;
+;; In Emacs, some buffer locals are referencing the project environment:
+;;
+;; - prj-root --> <repo>/
+;; - python-environment-directory --> <repo>/local
+;; - python-environment-default-root-name --> py3
+;; - python-shell-virtualenv-root --> <repo>/local/py3
+;; When this variable is set with the path of the virtualenv to use,
+;; `process-environment' and `exec-path' get proper values in order to run
+;; shells inside the specified virtualenv, example::
+;; (setq python-shell-virtualenv-root "/path/to/env/")
+;;
+;; To setup such an environment build target 'pyenv' or 'pyenvinstall'::
+;;
+;; $ make pyenvinstall
+;;
+;; Alternatively create the virtualenv, source it and install jedi + epc
+;; (required by `emacs-jedi <https://tkf.github.io/emacs-jedi>`_)::
+;;
+;; $ virtualenv --python=python3 "--no-site-packages" ./local/py3
+;; ...
+;; $ source ./local/py3/bin/activate
+;; (py3)$ # now install into the activated 'py3' environment ..
+;; (py3)$ pip install jedi epc
+;; ...
+;;
+;; Here is what also I found useful to add to my .emacs::
+;;
+;; (global-set-key [f6] 'flycheck-mode)
+;; (add-hook 'python-mode-hook 'my:python-mode-hook)
+;;
+;; (defun my:python-mode-hook ()
+;; (add-to-list 'company-backends 'company-jedi)
+;; (require 'jedi-core)
+;; (jedi:setup)
+;; (define-key python-mode-map (kbd "C-c C-d") 'jedi:show-doc)
+;; (define-key python-mode-map (kbd "M-.") 'jedi:goto-definition)
+;; (define-key python-mode-map (kbd "M-,") 'jedi:goto-definition-pop-marker)
+;; )
+;;
+
+((nil
+ . ((fill-column . 80)
+ ))
+ (python-mode
+ . ((indent-tabs-mode . nil)
+
+ ;; project root folder is where the `.dir-locals.el' is located
+ (eval . (setq-local
+ prj-root (locate-dominating-file default-directory ".dir-locals.el")))
+
+ (eval . (setq-local
+ python-environment-directory (expand-file-name "./local" prj-root)))
+
+ ;; use 'py3' enviroment as default
+ (eval . (setq-local
+ python-environment-default-root-name "py3"))
+
+ (eval . (setq-local
+ python-shell-virtualenv-root
+ (concat python-environment-directory
+ "/"
+ python-environment-default-root-name)))
+
+ ;; python-shell-virtualenv-path is obsolete, use python-shell-virtualenv-root!
+ ;; (eval . (setq-local
+ ;; python-shell-virtualenv-path python-shell-virtualenv-root))
+
+ (eval . (setq-local
+ python-shell-interpreter
+ (expand-file-name "bin/python" python-shell-virtualenv-root)))
+
+ (eval . (setq-local
+ python-environment-virtualenv
+ (list (expand-file-name "bin/virtualenv" python-shell-virtualenv-root)
+ ;;"--system-site-packages"
+ "--quiet")))
+
+ (eval . (setq-local
+ pylint-command
+ (expand-file-name "bin/pylint" python-shell-virtualenv-root)))
+
+ ;; pylint will find the '.pylintrc' file next to the CWD
+ ;; https://pylint.readthedocs.io/en/latest/user_guide/run.html#command-line-options
+ (eval . (setq-local
+ flycheck-pylintrc ".pylintrc"))
+
+ ;; flycheck & other python stuff should use the local py3 environment
+ (eval . (setq-local
+ flycheck-python-pylint-executable python-shell-interpreter))
+
+ ;; use 'M-x jedi:show-setup-info' and 'M-x epc:controller' to inspect jedi server
+
+ ;; https://tkf.github.io/emacs-jedi/latest/#jedi:environment-root -- You
+ ;; can specify a full path instead of a name (relative path). In that case,
+ ;; python-environment-directory is ignored and Python virtual environment
+ ;; is created at the specified path.
+ (eval . (setq-local jedi:environment-root python-shell-virtualenv-root))
+
+ ;; https://tkf.github.io/emacs-jedi/latest/#jedi:server-command
+ (eval .(setq-local
+ jedi:server-command
+ (list python-shell-interpreter
+ jedi:server-script)
+ ))
+
+ ;; jedi:environment-virtualenv --> see above 'python-environment-virtualenv'
+ ;; is set buffer local! No need to setup jedi:environment-virtualenv:
+ ;;
+ ;; Virtualenv command to use. A list of string. If it is nil,
+ ;; python-environment-virtualenv is used instead. You must set non-nil
+ ;; value to jedi:environment-root in order to make this setting work.
+ ;;
+ ;; https://tkf.github.io/emacs-jedi/latest/#jedi:environment-virtualenv
+ ;;
+ ;; (eval . (setq-local
+ ;; jedi:environment-virtualenv
+ ;; (list (expand-file-name "bin/virtualenv" python-shell-virtualenv-root)
+ ;; ;;"--python"
+ ;; ;;"/usr/bin/python3.4"
+ ;; )))
+
+ ;; jedi:server-args
+
+ )))
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 000000000..f4d03376c
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,41 @@
+*~
+*/*~
+*/*/*~
+*/*/*/*~
+*/*/*/*/*~
+
+# Git
+.git
+.gitignore
+
+# CI
+.codeclimate.yml
+.travis.yml
+.taskcluster.yml
+
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*/__pycache__/
+*/*/__pycache__/
+*/*/*/__pycache__/
+*.py[cod]
+*/*.py[cod]
+*/*/*.py[cod]
+*/*/*/*.py[cod]
+
+# to sync with .gitignore
+.coverage
+coverage/
+.installed.cfg
+engines.cfg
+env
+searx-ve
+robot_log.html
+robot_output.xml
+robot_report.html
+test_basic/
+setup.cfg
+
+node_modules/
+
+.tx/ \ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 3da4d0386..069dfd35b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+# to sync with .dockerignore
.coverage
coverage/
.installed.cfg
@@ -17,3 +18,9 @@ setup.cfg
node_modules/
.tx/
+
+build/
+dist/
+local/
+gh-pages/
+searx.egg-info/
diff --git a/.pylintrc b/.pylintrc
new file mode 100644
index 000000000..3b4adb2ca
--- /dev/null
+++ b/.pylintrc
@@ -0,0 +1,444 @@
+# -*- coding: utf-8; mode: conf -*-
+# lint Python modules using external checkers.
+#
+# This is the main checker controlling the other ones and the reports
+# generation. It is itself both a raw checker and an astng checker in order
+# to:
+# * handle message activation / deactivation at the module level
+# * handle some basic but necessary stats'data (number of classes, methods...)
+#
+[MASTER]
+
+# A comma-separated list of package or module names from where C extensions may
+# be loaded. Extensions are loading into the active Python interpreter and may
+# run arbitrary code
+extension-pkg-whitelist=
+
+# Add files or directories to the blacklist. They should be base names, not
+# paths.
+ignore=CVS, .git, .svn
+
+# Add files or directories matching the regex patterns to the blacklist. The
+# regex matches against base names, not paths.
+ignore-patterns=
+
+# Python code to execute, usually for sys.path manipulation such as
+# pygtk.require().
+#init-hook=
+
+# Use multiple processes to speed up Pylint.
+jobs=1
+
+# List of plugins (as comma separated values of python modules names) to load,
+# usually to register additional checkers.
+load-plugins=
+
+# Pickle collected data for later comparisons.
+persistent=yes
+
+# Specify a configuration file.
+#rcfile=
+
+# Allow loading of arbitrary C extensions. Extensions are imported into the
+# active Python interpreter and may run arbitrary code.
+unsafe-load-any-extension=no
+
+
+[MESSAGES CONTROL]
+
+# Only show warnings with the listed confidence levels. Leave empty to show
+# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
+confidence=
+
+# Disable the message, report, category or checker with the given id(s). You
+# can either give multiple identifiers separated by comma (,) or put this
+# option multiple times (only on the command line, not in the configuration
+# file where it should appear only once).You can also use "--disable=all" to
+# disable everything first and then reenable specific checks. For example, if
+# you want to run only the similarities checker, you can use "--disable=all
+# --enable=similarities". If you want to run only the classes checker, but have
+# no Warning level messages displayed, use"--disable=all --enable=classes
+# --disable=W"
+disable=bad-whitespace, duplicate-code
+
+# Enable the message, report, category or checker with the given id(s). You can
+# either give multiple identifier separated by comma (,) or put this option
+# multiple time (only on the command line, not in the configuration file where
+# it should appear only once). See also the "--disable" option for examples.
+enable=
+
+
+[REPORTS]
+
+# Python expression which should return a note less than 10 (10 is the highest
+# note). You have access to the variables errors warning, statement which
+# respectively contain the number of errors / warnings messages and the total
+# number of statements analyzed. This is used by the global evaluation report
+# (RP0004).
+evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
+
+# Template used to display messages. This is a python new-style format string
+# used to format the message information. See doc for all details
+
+# HINT: do not set this here, use argument --msg-template=...
+#msg-template={path}:{line}: [{msg_id}({symbol}),{obj}] {msg}
+
+# Set the output format. Available formats are text, parseable, colorized, json
+# and msvs (visual studio).You can also give a reporter class, eg
+# mypackage.mymodule.MyReporterClass.
+
+# HINT: do not set this here, use argument --output-format=...
+#output-format=text
+
+# Tells whether to display a full report or only the messages
+reports=no
+
+# Activate the evaluation score.
+score=yes
+
+
+[REFACTORING]
+
+# Maximum number of nested blocks for function / method body
+max-nested-blocks=5
+
+
+[BASIC]
+
+# List of builtins function names that should not be used, separated by a comma
+bad-functions=map,filter,apply,input
+
+# Naming hint for argument names
+argument-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Regular expression matching correct argument names
+argument-rgx=(([a-z][a-zA-Z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Naming hint for attribute names
+attr-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Regular expression matching correct attribute names
+attr-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*)|([A-Z0-9_]*))$
+
+# Bad variable names which should always be refused, separated by a comma
+bad-names=foo,bar,baz,toto,tutu,tata
+
+# Naming hint for class attribute names
+class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
+
+# Regular expression matching correct class attribute names
+class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
+
+# Naming hint for class names
+class-name-hint=[A-Z_][a-zA-Z0-9]+$
+
+# Regular expression matching correct class names
+class-rgx=[A-Z_][a-zA-Z0-9]+$
+
+# Naming hint for constant names
+const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$
+
+# Regular expression matching correct constant names
+const-rgx=(([a-zA-Z_][a-zA-Z0-9_]*)|(__.*__))$
+#const-rgx=[f]?[A-Z_][a-zA-Z0-9_]{2,30}$
+
+# Minimum line length for functions/classes that require docstrings, shorter
+# ones are exempt.
+docstring-min-length=-1
+
+# Naming hint for function names
+function-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Regular expression matching correct function names
+function-rgx=(([a-z][a-zA-Z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Good variable names which should always be accepted, separated by a comma
+good-names=i,j,k,ex,Run,_,log,cfg,id
+
+# Include a hint for the correct naming format with invalid-name
+include-naming-hint=no
+
+# Naming hint for inline iteration names
+inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$
+
+# Regular expression matching correct inline iteration names
+inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
+
+# Naming hint for method names
+method-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Regular expression matching correct method names
+method-rgx=(([a-z][a-zA-Z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Naming hint for module names
+module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
+
+# Regular expression matching correct module names
+#module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
+module-rgx=([a-z_][a-z0-9_]*)$
+
+# Colon-delimited sets of names that determine each other's naming style when
+# the name regexes allow several styles.
+name-group=
+
+# Regular expression which should only match function or class names that do
+# not require a docstring.
+no-docstring-rgx=^_
+
+# List of decorators that produce properties, such as abc.abstractproperty. Add
+# to this list to register other decorators that produce valid properties.
+property-classes=abc.abstractproperty
+
+# Naming hint for variable names
+variable-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Regular expression matching correct variable names
+variable-rgx=(([a-z][a-zA-Z0-9_]{2,30})|(_[a-z0-9_]*)|([a-z]))$
+
+
+[FORMAT]
+
+# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
+expected-line-ending-format=
+
+# Regexp for a line that is allowed to be longer than the limit.
+ignore-long-lines=^\s*(# )?<?https?://\S+>?$
+
+# Number of spaces of indent required inside a hanging or continued line.
+indent-after-paren=4
+
+# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
+# tab).
+indent-string=' '
+
+# Maximum number of characters on a single line.
+max-line-length=120
+
+# Maximum number of lines in a module
+max-module-lines=2000
+
+# List of optional constructs for which whitespace checking is disabled. `dict-
+# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}.
+# `trailing-comma` allows a space between comma and closing bracket: (a, ).
+# `empty-line` allows space-only lines.
+no-space-check=trailing-comma,dict-separator
+
+# Allow the body of a class to be on the same line as the declaration if body
+# contains single statement.No config file found, using default configuration
+
+single-line-class-stmt=no
+
+# Allow the body of an if to be on the same line as the test if there is no
+# else.
+single-line-if-stmt=no
+
+
+[LOGGING]
+
+# Logging modules to check that the string format arguments are in logging
+# function parameter format
+logging-modules=logging
+
+
+[MISCELLANEOUS]
+
+# List of note tags to take in consideration, separated by a comma.
+notes=FIXME,XXX,TODO
+
+
+[SIMILARITIES]
+
+# Ignore comments when computing similarities.
+ignore-comments=yes
+
+# Ignore docstrings when computing similarities.
+ignore-docstrings=yes
+
+# Ignore imports when computing similarities.
+ignore-imports=no
+
+# Minimum lines number of a similarity.
+min-similarity-lines=4
+
+
+[SPELLING]
+
+# Spelling dictionary name. Available dictionaries: none. To make it working
+# install python-enchant package.
+spelling-dict=
+
+# List of comma separated words that should not be checked.
+spelling-ignore-words=
+
+# A path to a file that contains private dictionary; one word per line.
+spelling-private-dict-file=
+
+# Tells whether to store unknown words to indicated private dictionary in
+# --spelling-private-dict-file option instead of raising a message.
+spelling-store-unknown-words=no
+
+
+[TYPECHECK]
+
+# List of decorators that produce context managers, such as
+# contextlib.contextmanager. Add to this list to register other decorators that
+# produce valid context managers.
+contextmanager-decorators=contextlib.contextmanager
+
+# List of members which are set dynamically and missed by pylint inference
+# system, and so shouldn't trigger E1101 when accessed. Python regular
+# expressions are accepted.
+generated-members=
+
+# Tells whether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+# This flag controls whether pylint should warn about no-member and similar
+# checks whenever an opaque object is returned when inferring. The inference
+# can return multiple potential results while evaluating a Python object, but
+# some branches might not be evaluated, which results in partial inference. In
+# that case, it might be useful to still emit no-member and other checks for
+# the rest of the inferred objects.
+ignore-on-opaque-inference=yes
+
+# List of class names for which member attributes should not be checked (useful
+# for classes with dynamically set attributes). This supports the use of
+# qualified names.
+ignored-classes=optparse.Values,thread._local,_thread._local
+
+# List of module names for which member attributes should not be checked
+# (useful for modules/projects where namespaces are manipulated during runtime
+# and thus existing member attributes cannot be deduced by static analysis. It
+# supports qualified module names, as well as Unix pattern matching.
+ignored-modules=
+
+# Show a hint with possible names when a member name was not found. The aspect
+# of finding the hint is based on edit distance.
+missing-member-hint=yes
+
+# The minimum edit distance a name should have in order to be considered a
+# similar match for a missing member name.
+missing-member-hint-distance=1
+
+# The total number of similar names that should be taken in consideration when
+# showing a hint for a missing member.
+missing-member-max-choices=1
+
+
+[VARIABLES]
+
+# List of additional names supposed to be defined in builtins. Remember that
+# you should avoid to define new builtins when possible.
+additional-builtins=
+
+# Tells whether unused global variables should be treated as a violation.
+allow-global-unused-variables=yes
+
+# List of strings which can identify a callback function by name. A callback
+# name must start or end with one of those strings.
+callbacks=cb_,_cb
+
+# A regular expression matching the name of dummy variables (i.e. expectedly
+# not used).
+dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
+
+# Argument names that match this expression will be ignored. Default to name
+# with leading underscore
+ignored-argument-names=_.*|^ignored_|^unused_
+
+# Tells whether we should check for unused import in __init__ files.
+init-import=no
+
+# List of qualified module names which can have objects that can redefine
+# builtins.
+redefining-builtins-modules=six.moves,future.builtins
+
+
+[CLASSES]
+
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,__new__,setUp
+
+# List of member names, which should be excluded from the protected access
+# warning.
+exclude-protected=_asdict,_fields,_replace,_source,_make
+
+# List of valid names for the first argument in a class method.
+valid-classmethod-first-arg=cls
+
+# List of valid names for the first argument in a metaclass class method.
+valid-metaclass-classmethod-first-arg=mcs
+
+
+[DESIGN]
+
+# Maximum number of arguments for function / method
+max-args=8
+
+# Maximum number of attributes for a class (see R0902).
+max-attributes=20
+
+# Maximum number of boolean expressions in a if statement
+max-bool-expr=5
+
+# Maximum number of branch for function / method body
+max-branches=12
+
+# Maximum number of locals for function / method body
+max-locals=20
+
+# Maximum number of parents for a class (see R0901).
+max-parents=7
+
+# Maximum number of public methods for a class (see R0904).
+max-public-methods=20
+
+# Maximum number of return / yield for function / method body
+max-returns=6
+
+# Maximum number of statements in function / method body
+max-statements=50
+
+# Minimum number of public methods for a class (see R0903).
+min-public-methods=2
+
+
+[IMPORTS]
+
+# Allow wildcard imports from modules that define __all__.
+allow-wildcard-with-all=no
+
+# Analyse import fallback blocks. This can be used to support both Python 2 and
+# 3 compatible code, which means that the block might have code that exists
+# only in one or another interpreter, leading to false positives when analysed.
+analyse-fallback-blocks=no
+
+# Deprecated modules which should not be used, separated by a comma
+deprecated-modules=optparse,tkinter.tix
+
+# Create a graph of external dependencies in the given file (report RP0402 must
+# not be disabled)
+ext-import-graph=
+
+# Create a graph of every (i.e. internal and external) dependencies in the
+# given file (report RP0402 must not be disabled)
+import-graph=
+
+# Create a graph of internal dependencies in the given file (report RP0402 must
+# not be disabled)
+int-import-graph=
+
+# Force import order to recognize a module as part of the standard
+# compatibility libraries.
+known-standard-library=
+
+# Force import order to recognize a module as part of a third party library.
+known-third-party=enchant
+
+
+[EXCEPTIONS]
+
+# Exceptions that will emit a warning when being caught. Defaults to
+# "Exception"
+overgeneral-exceptions=Exception
diff --git a/.travis.yml b/.travis.yml
index 08bcfaadd..e37b65864 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,19 +1,14 @@
+language: python
sudo: false
cache:
- pip
- npm
- directories:
- $HOME/.cache/pip
+
addons:
firefox: "latest"
-language: python
-python:
- - "2.7"
- - "3.5"
- - "3.6"
-before_install:
- - "export DISPLAY=:99.0"
- - "sh -e /etc/init.d/xvfb start"
+
install:
- ./manage.sh install_geckodriver ~/drivers
- export PATH=~/drivers:$PATH
@@ -27,6 +22,31 @@ script:
after_success:
- ./manage.sh py_test_coverage
- codecov
+
+stages:
+ - test
+ - name: docker
+ if: branch = master AND type != pull_request AND env(DOCKER_USERNAME) IS present
+
+jobs:
+ include:
+ - python: "2.7"
+ - python: "3.5"
+ - python: "3.6"
+ - stage: docker
+ python: "3.6"
+ git:
+ depth: false
+ services:
+ - docker
+ addons: []
+ before_install: true
+ install: true
+ script:
+ - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
+ - ./manage.sh docker_build push
+ after_success: true
+
notifications:
irc:
channels:
diff --git a/AUTHORS.rst b/AUTHORS.rst
index 674bfd758..9ab78b050 100644
--- a/AUTHORS.rst
+++ b/AUTHORS.rst
@@ -1,4 +1,4 @@
-Searx was created by Adam Tauber and is maintained by Adam Tauber, Alexandre Flament and Noémi Ványi.
+Searx was created by Adam Tauber and is maintained by Adam Tauber, Alexandre Flament, Noémi Ványi, @pofilo and Markus Heiser.
Major contributing authors:
@@ -9,6 +9,8 @@ Major contributing authors:
- @Cqoicebordel
- Noémi Ványi
- Marc Abonce Seguin @a01200356
+- @pofilo
+- Markus Heiser @return42
People who have submitted patches/translates, reported bugs, consulted features or
generally made searx better:
@@ -98,3 +100,26 @@ generally made searx better:
- @ZEROF
- Ivan Skytte Jørgensen @isj-privacore
- @miicha
+- Étienne Deparis @milouse
+- @pelag0s
+- Denis Wernert @d-tux
+- Robin Hallabro-Kokko @hallabro
+- Jonas Zohren @jfowl
+- Elias Ojala @theel0ja
+- @brunob
+- Nick Espig @nachtalb
+- Rachmadani Haryono @rachmadaniHaryono
+- Frank de Lange @yetangitu
+- Émilien Devos @unifox
+- Nicolas Gelot @nfk
+- @volth
+- Mathieu Brunot @madmath03
+- @lorddavidiii
+- @x250
+- Robby O'Connor @robbyoconnor
+- Finn @0xhtml
+- @tmikaeld
+- @hobbestigrou
+- Vipul @finn0
+- @CaffeinatedTech
+- Robin Schneider @ypid
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 70e9e415c..b921788c4 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -1,3 +1,41 @@
+0.16.0 2020.01.30
+=================
+
+- New engines
+
+ - Splash
+ - Apkmirror
+ - NPM search
+ - Invidious
+ - Seedpeer
+- New languages
+
+ - Estonian
+ - Interlingua
+ - Lithuanian
+ - Tibetian
+ - Occitan
+ - Tamil
+- Engine fixes (wolframalpha, google scholar, youtube, google images, seznam, google, soundcloud, google cloud, duden, btdigg, google play, bing images, flickr noapi, wikidata, dailymotion, google videos, arxiv, dictzone, fdroid, etymonline, bing, duckduckgo, startpage, voat, 1x, deviantart, digg, gigablast, mojeek, duckduckgo definitions, spotify, libgen, qwant, openstreetmap, wikipedia, ina, microsoft academic, scanr structures)
+- Dependency updates
+- Speed optimizations
+- Initial support for offline engines
+- Image format display
+- Inline js scripts removed
+- Infinite scroll plugin fix
+- Simple theme bugfixes
+- Docker image updates
+- Bang expression fixes
+- Result merging fixes
+- New environment variable added: SEARX_BIND_ADDRESS
+
+
+News
+~~~~
+
+- @return42 joined the maintainer team
+- This is the last release with Python2 support
+
0.15.0 2019.01.06
=================
diff --git a/Dockerfile b/Dockerfile
index 95e21813f..b0b5a609d 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,57 +1,79 @@
-FROM alpine:3.8
-LABEL maintainer="searx <https://github.com/asciimoo/searx>"
-LABEL description="A privacy-respecting, hackable metasearch engine."
+FROM alpine:3.10
+ENTRYPOINT ["/sbin/tini","--","/usr/local/searx/dockerfiles/docker-entrypoint.sh"]
+EXPOSE 8080
+VOLUME /etc/searx
+VOLUME /var/log/uwsgi
+
+ARG VERSION_GITCOMMIT=unknown
+ARG SEARX_GIT_VERSION=unknown
+
+ARG SEARX_GID=977
+ARG SEARX_UID=977
+
+RUN addgroup -g ${SEARX_GID} searx && \
+ adduser -u ${SEARX_UID} -D -h /usr/local/searx -s /bin/sh -G searx searx
+
+ARG TIMESTAMP_SETTINGS=0
+ARG TIMESTAMP_UWSGI=0
+ARG LABEL_VCS_REF=
+ARG LABEL_VCS_URL=
+
+ENV INSTANCE_NAME=searx \
+ AUTOCOMPLETE= \
+ BASE_URL= \
+ MORTY_KEY= \
+ MORTY_URL=
-ENV BASE_URL=False IMAGE_PROXY=False HTTP_PROXY_URL= HTTPS_PROXY_URL=
-EXPOSE 8888
WORKDIR /usr/local/searx
-CMD ["/sbin/tini","--","/usr/local/searx/run.sh"]
-
-RUN adduser -D -h /usr/local/searx -s /bin/sh searx searx \
- && echo '#!/bin/sh' >> run.sh \
- && echo 'sed -i "s|base_url : False|base_url : $BASE_URL|g" searx/settings.yml' >> run.sh \
- && echo 'sed -i "s/image_proxy : False/image_proxy : $IMAGE_PROXY/g" searx/settings.yml' >> run.sh \
- && echo 'sed -i "s/ultrasecretkey/`openssl rand -hex 16`/g" searx/settings.yml' >> run.sh \
- && echo 'if [ -n "$HTTP_PROXY_URL" ] || [ -n "$HTTPS_PROXY_URL" ]; then' >> run.sh \
- && echo ' sed -i "s~^# proxies :~ proxies:\\n http: ${HTTP_PROXY_URL}\\n https: ${HTTPS_PROXY_URL}\\n~" searx/settings.yml' >> run.sh \
- && echo 'fi' >> run.sh \
- && echo 'python searx/webapp.py' >> run.sh \
- && chmod +x run.sh
+
COPY requirements.txt ./requirements.txt
-RUN echo "@commuedge http://nl.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories \
- && apk -U add \
+RUN apk upgrade --no-cache \
+ && apk add --no-cache -t build-dependencies \
build-base \
- python \
- python-dev \
- py-pip \
- libxml2 \
- libxml2-dev \
- libxslt \
- libxslt-dev \
+ py3-setuptools \
+ python3-dev \
libffi-dev \
- openssl \
- openssl-dev \
- ca-certificates \
- tini@commuedge \
- && pip install --upgrade pip \
- && pip install --no-cache -r requirements.txt \
- && apk del \
- build-base \
- python-dev \
- libffi-dev \
- openssl-dev \
libxslt-dev \
libxml2-dev \
openssl-dev \
+ tar \
+ git \
+ && apk add --no-cache \
ca-certificates \
- && rm -f /var/cache/apk/*
+ su-exec \
+ python3 \
+ libxml2 \
+ libxslt \
+ openssl \
+ tini \
+ uwsgi \
+ uwsgi-python3 \
+ && pip3 install --upgrade pip \
+ && pip3 install --no-cache -r requirements.txt \
+ && apk del build-dependencies
-COPY . .
+COPY --chown=searx:searx . .
-RUN chown -R searx:searx *
+RUN su searx -c "/usr/bin/python3 -m compileall -q searx"; \
+ touch -c --date=@${TIMESTAMP_SETTINGS} searx/settings.yml; \
+ touch -c --date=@${TIMESTAMP_UWSGI} dockerfiles/uwsgi.ini; \
+ if [ ! -z $VERSION_GITCOMMIT ]; then\
+ echo "VERSION_STRING = VERSION_STRING + \"-$VERSION_GITCOMMIT\"" >> /usr/local/searx/searx/version.py; \
+ fi
-USER searx
-RUN sed -i "s/127.0.0.1/0.0.0.0/g" searx/settings.yml
+# Keep this argument at the end since it change each time
+ARG LABEL_DATE=
+LABEL maintainer="searx <https://github.com/asciimoo/searx>" \
+ description="A privacy-respecting, hackable metasearch engine." \
+ version="${SEARX_GIT_VERSION}" \
+ org.label-schema.schema-version="1.0" \
+ org.label-schema.name="searx" \
+ org.label-schema.version="${SEARX_GIT_VERSION}" \
+ org.label-schema.url="${LABEL_VCS_URL}" \
+ org.label-schema.vcs-ref=${LABEL_VCS_REF} \
+ org.label-schema.vcs-url=${LABEL_VCS_URL} \
+ org.label-schema.build-date="${LABEL_DATE}" \
+ org.label-schema.usage="https://github.com/searx/searx-docker"
diff --git a/Makefile b/Makefile
new file mode 100644
index 000000000..f35b86c41
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,89 @@
+# -*- coding: utf-8; mode: makefile-gmake -*-
+
+export GIT_URL=https://github.com/asciimoo/searx
+export SEARX_URL=https://searx.me
+export DOCS_URL=https://asciimoo.github.io/searx
+
+PYOBJECTS = searx
+DOC = docs
+PY_SETUP_EXTRAS ?= \[test\]
+
+PYDIST=./dist/py
+PYBUILD=./build/py
+
+include utils/makefile.include
+include utils/makefile.python
+include utils/makefile.sphinx
+
+all: clean install
+
+PHONY += help
+help:
+ @echo ' test - run developer tests'
+ @echo ' docs - build documentation'
+ @echo ' docs-live - autobuild HTML documentation while editing'
+ @echo ' run - run developer instance'
+ @echo ' install - developer install (./local)'
+ @echo ' uninstall - uninstall (./local)'
+ @echo ' gh-pages - build docs & deploy on gh-pages branch'
+ @echo ' clean - drop builds and environments'
+ @echo ''
+ @$(MAKE) -s -f utils/makefile.include make-help
+ @echo ''
+ @$(MAKE) -s -f utils/makefile.python python-help
+
+PHONY += install
+install: pyenvinstall
+
+PHONY += uninstall
+uninstall: pyenvuninstall
+
+PHONY += clean
+clean: pyclean
+ $(call cmd,common_clean)
+
+PHONY += run
+run: pyenvinstall
+ $(Q) ( \
+ sed -i -e "s/debug : False/debug : True/g" ./searx/settings.yml ; \
+ sleep 2 ; \
+ xdg-open http://127.0.0.1:8888/ ; \
+ sleep 3 ; \
+ sed -i -e "s/debug : True/debug : False/g" ./searx/settings.yml ; \
+ ) &
+ $(PY_ENV)/bin/python ./searx/webapp.py
+
+# docs
+# ----
+
+PHONY += docs
+docs: pyenvinstall sphinx-doc
+ $(call cmd,sphinx,html,docs,docs)
+
+PHONY += docs-live
+docs-live: pyenvinstall sphinx-live
+ $(call cmd,sphinx_autobuild,html,docs,docs)
+
+$(GH_PAGES)::
+ @echo "doc available at --> $(DOCS_URL)"
+
+# test
+# ----
+
+PHONY += test test.pylint test.pep8 test.unit test.robot
+
+# TODO: balance linting with pylint
+test: test.pep8 test.unit test.robot
+ - make pylint
+
+test.pep8: pyenvinstall
+ $(PY_ENV_ACT); ./manage.sh pep8_check
+
+test.unit: pyenvinstall
+ $(PY_ENV_ACT); ./manage.sh unit_tests
+
+test.robot: pyenvinstall
+ $(PY_ENV_ACT); ./manage.sh install_geckodriver
+ $(PY_ENV_ACT); ./manage.sh robot_tests
+
+.PHONY: $(PHONY)
diff --git a/README.rst b/README.rst
index 35d14d1b4..afe413af8 100644
--- a/README.rst
+++ b/README.rst
@@ -17,7 +17,19 @@ See the `documentation <https://asciimoo.github.io/searx>`__ and the `wiki <http
Installation
~~~~~~~~~~~~
-- clone source:
+With Docker
+-----------
+Go to the `searx-docker <https://github.com/searx/searx-docker>`__ project.
+
+Without Docker
+--------------
+For all of the details, follow this `step by step installation <https://asciimoo.github.io/searx/dev/install/installation.html>`__.
+
+Note: the documentation needs to be updated.
+
+If you are in a hurry
+---------------------
+- clone the source:
``git clone https://github.com/asciimoo/searx.git && cd searx``
- install dependencies: ``./manage.sh update_packages``
- edit your
@@ -25,8 +37,6 @@ Installation
(set your ``secret_key``!)
- run ``python searx/webapp.py`` to start the application
-For all the details, follow this `step by step
-installation <https://github.com/asciimoo/searx/wiki/Installation>`__.
Bugs
~~~~
diff --git a/dockerfiles/docker-entrypoint.sh b/dockerfiles/docker-entrypoint.sh
new file mode 100755
index 000000000..8b4c34860
--- /dev/null
+++ b/dockerfiles/docker-entrypoint.sh
@@ -0,0 +1,132 @@
+#!/bin/sh
+
+export SEARX_VERSION=$(su searx -c 'python3 -c "import six; import searx.version; six.print_(searx.version.VERSION_STRING)"')
+printf 'searx version %s\n\n' "${SEARX_VERSION}"
+
+export UWSGI_SETTINGS_PATH=/etc/searx/uwsgi.ini
+export SEARX_SETTINGS_PATH=/etc/searx/settings.yml
+
+if [ -z "${BIND_ADDRESS}" ]; then
+ export BIND_ADDRESS=":8080"
+fi
+
+# Parse command line
+FORCE_CONF_UPDATE=0
+DRY_RUN=0
+while getopts "fdh" option
+do
+ case $option in
+ f)
+ FORCE_CONF_UPDATE=1
+ ;;
+ d)
+ DRY_RUN=1
+ ;;
+ h)
+ printf "Command line:\n\n"
+ printf " -h Display this help\n"
+ printf " -d Dry run to update the configuration files.\n"
+ printf " -f Always update on the configuration files (existing files are renamed with the .old suffix)\n"
+ printf " Without this option, new configuration files are copied with the .new suffix\n"
+ printf "\nEnvironment variables:\n\n"
+ printf " INSTANCE_NAME settings.yml : general.instance_name\n"
+ printf " AUTOCOMPLETE settings.yml : search.autocomplete\n"
+ printf " BASE_URL settings.yml : server.base_url\n"
+ printf " MORTY_URL settings.yml : result_proxy.url\n"
+ printf " MORTY_KEY settings.yml : result_proxy.key\n"
+ printf " BIND_ADDRESS where uwsgi will accept HTTP request (format : host:port)\n"
+ exit 0
+ esac
+done
+
+# helpers to update the configuration files
+patch_uwsgi_settings() {
+ CONF="$1"
+
+ # Nothing
+}
+
+patch_searx_settings() {
+ CONF="$1"
+
+ # Make sure that there is trailing slash at the end of BASE_URL
+ # see http://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Shell-Parameter-Expansion
+ export BASE_URL="${BASE_URL%/}/"
+
+ # update settings.yml
+ sed -i -e "s|base_url : False|base_url : ${BASE_URL}|g" \
+ -e "s/instance_name : \"searx\"/instance_name : \"${INSTANCE_NAME}\"/g" \
+ -e "s/autocomplete : \"\"/autocomplete : \"${AUTOCOMPLETE}\"/g" \
+ -e "s/ultrasecretkey/$(openssl rand -hex 32)/g" \
+ "${CONF}"
+
+ # Morty configuration
+ if [ ! -z "${MORTY_KEY}" -a ! -z "${MORTY_URL}" ]; then
+ sed -i -e "s/image_proxy : False/image_proxy : True/g" \
+ "${CONF}"
+ cat >> "${CONF}" <<-EOF
+
+# Morty configuration
+result_proxy:
+ url : ${MORTY_URL}
+ key : !!binary "${MORTY_KEY}"
+EOF
+ fi
+}
+
+update_conf() {
+ FORCE_CONF_UPDATE=$1
+ CONF="$2"
+ NEW_CONF="${2}.new"
+ OLD_CONF="${2}.old"
+ REF_CONF="$3"
+ PATCH_REF_CONF="$4"
+
+ if [ -f "${CONF}" ]; then
+ if [ "${REF_CONF}" -nt "${CONF}" ]; then
+ # There is a new version
+ if [ $FORCE_CONF_UPDATE -ne 0 ]; then
+ # Replace the current configuration
+ printf '⚠️ Automaticaly update %s to the new version\n' "${CONF}"
+ if [ ! -f "${OLD_CONF}" ]; then
+ printf 'The previous configuration is saved to %s\n' "${OLD_CONF}"
+ mv "${CONF}" "${OLD_CONF}"
+ fi
+ cp "${REF_CONF}" "${CONF}"
+ $PATCH_REF_CONF "${CONF}"
+ else
+ # Keep the current configuration
+ printf '⚠️ Check new version %s to make sure searx is working properly\n' "${NEW_CONF}"
+ cp "${REF_CONF}" "${NEW_CONF}"
+ $PATCH_REF_CONF "${NEW_CONF}"
+ fi
+ else
+ printf 'Use existing %s\n' "${CONF}"
+ fi
+ else
+ printf 'Create %s\n' "${CONF}"
+ cp "${REF_CONF}" "${CONF}"
+ $PATCH_REF_CONF "${CONF}"
+ fi
+}
+
+# make sure there are uwsgi settings
+update_conf ${FORCE_CONF_UPDATE} "${UWSGI_SETTINGS_PATH}" "/usr/local/searx/dockerfiles/uwsgi.ini" "patch_uwsgi_settings"
+
+# make sure there are searx settings
+update_conf "${FORCE_CONF_UPDATE}" "${SEARX_SETTINGS_PATH}" "/usr/local/searx/searx/settings.yml" "patch_searx_settings"
+
+# dry run (to update configuration files, then inspect them)
+if [ $DRY_RUN -eq 1 ]; then
+ printf 'Dry run\n'
+ exit
+fi
+
+#
+touch /var/run/uwsgi-logrotate
+chown -R searx:searx /var/log/uwsgi /var/run/uwsgi-logrotate
+unset MORTY_KEY
+
+# Start uwsgi
+printf 'Listen on %s\n' "${BIND_ADDRESS}"
+exec su-exec searx:searx uwsgi --master --http-socket "${BIND_ADDRESS}" "${UWSGI_SETTINGS_PATH}"
diff --git a/dockerfiles/uwsgi.ini b/dockerfiles/uwsgi.ini
new file mode 100644
index 000000000..ecc4b394e
--- /dev/null
+++ b/dockerfiles/uwsgi.ini
@@ -0,0 +1,37 @@
+[uwsgi]
+# Who will run the code
+uid = searx
+gid = searx
+
+# Number of workers (usually CPU count)
+workers = 4
+
+# The right granted on the created socket
+chmod-socket = 666
+
+# Plugin to use and interpretor config
+single-interpreter = true
+master = true
+plugin = python3
+lazy-apps = true
+enable-threads = true
+
+# Module to import
+module = searx.webapp
+
+# Virtualenv and python path
+pythonpath = /usr/local/searx/
+chdir = /usr/local/searx/searx/
+
+# Disable logging for privacy
+disable-logging=True
+
+# But keep errors for 2 days
+touch-logrotate = /run/uwsgi-logrotate
+unique-cron = 15 0 -1 -1 -1 { touch /run/uwsgi-logrotate }
+log-backupname = /var/log/uwsgi/uwsgi.log.1
+logto = /var/log/uwsgi/uwsgi.log
+
+# No keep alive
+# See https://github.com/searx/searx-docker/issues/24
+add-header = Connection: close
diff --git a/docs/_themes/searx/static/searx.css b/docs/_themes/searx/static/searx.css
new file mode 100644
index 000000000..d6a664f0f
--- /dev/null
+++ b/docs/_themes/searx/static/searx.css
@@ -0,0 +1,130 @@
+@import url("pocoo.css");
+
+a, a.reference, a.footnote-reference {
+ color: #004b6b;
+ border-color: #004b6b;
+}
+
+a:hover {
+ color: #6d4100;
+ border-color: #6d4100;
+}
+
+p.version-warning {
+ background-color: #004b6b;
+}
+
+div.sidebar {
+ background-color: whitesmoke;
+ border-color: lightsteelblue;
+ border-radius: 3pt;
+}
+
+p.sidebar-title, .sidebar p {
+ margin: 6pt;
+}
+
+.sidebar li,
+.hlist li {
+ list-style-type: disclosure-closed;
+}
+
+
+/* admonitions
+*/
+
+div.admonition, div.topic {
+ background-color: #fafafa;
+ margin: 8px 0px;
+ padding: 1em;
+ border-radius: 3pt 0 0 3pt;
+ border-top: none;
+ border-right: none;
+ border-bottom: none;
+ border-left: 5pt solid #ccc;
+}
+
+p.admonition-title:after {
+ content: none;
+}
+
+.admonition.hint { border-color: #416dc0b0; }
+.admonition.note { border-color: #6c856cb0; }
+.admonition.tip { border-color: #85c5c2b0; }
+.admonition.attention { border-color: #ecec97b0; }
+.admonition.caution { border-color: #a6c677b0; }
+.admonition.danger { border-color: #d46262b0; }
+.admonition.important { border-color: #dfa3a3b0; }
+.admonition.error { border-color: red; }
+.admonition.warning { border-color: darkred; }
+
+.admonition.admonition-generic-admonition-title {
+ border-color: #416dc0b0;
+}
+
+
+/* admonitions with (rendered) reST markup examples (:class: rst-example)
+ *
+ * .. admonition:: title of the example
+ * :class: rst-example
+ * ....
+*/
+
+div.rst-example {
+ background-color: inherit;
+ margin: 0;
+ border-top: none;
+ border-right: 1px solid #ccc;
+ border-bottom: none;
+ border-left: none;
+ border-radius: none;
+ padding: 0;
+}
+
+div.rst-example > p.admonition-title {
+ font-family: Sans Serif;
+ font-style: italic;
+ font-size: 0.8em;
+ display: block;
+ border-bottom: 1px solid #ccc;
+ padding: 0.5em 1em;
+ text-align: right;
+}
+
+/* code block in figures
+ */
+
+div.highlight pre {
+ text-align: left;
+}
+
+/* Table theme
+*/
+
+thead, tfoot {
+ background-color: #fff;
+}
+
+th:hover, td:hover {
+ background-color: #ffc;
+}
+
+thead th, tfoot th, tfoot td, tbody th {
+ background-color: #fffaef;
+}
+
+tbody tr:nth-child(odd) {
+ background-color: #fff;
+}
+
+tbody tr:nth-child(even) {
+ background-color: #fafafa;
+}
+
+caption {
+ font-family: Sans Serif;
+ padding: 0.5em;
+ margin: 0.5em 0 0.5em 0;
+ caption-side: top;
+ text-align: left;
+}
diff --git a/docs/_themes/searx/theme.conf b/docs/_themes/searx/theme.conf
new file mode 100644
index 000000000..2d5f72e7d
--- /dev/null
+++ b/docs/_themes/searx/theme.conf
@@ -0,0 +1,6 @@
+[theme]
+inherit = pocoo
+stylesheet = searx.css
+
+[options]
+touch_icon =
diff --git a/docs/admin/api.rst b/docs/admin/api.rst
new file mode 100644
index 000000000..7804a8664
--- /dev/null
+++ b/docs/admin/api.rst
@@ -0,0 +1,96 @@
+.. _adminapi:
+
+==================
+Administration API
+==================
+
+Get configuration data
+======================
+
+.. code:: http
+
+ GET /config HTTP/1.1
+
+Sample response
+---------------
+
+.. code:: json
+
+ {
+ "autocomplete": "",
+ "categories": [
+ "map",
+ "it",
+ "images",
+ ],
+ "default_locale": "",
+ "default_theme": "oscar",
+ "engines": [
+ {
+ "categories": [
+ "map"
+ ],
+ "enabled": true,
+ "name": "openstreetmap",
+ "shortcut": "osm"
+ },
+ {
+ "categories": [
+ "it"
+ ],
+ "enabled": true,
+ "name": "arch linux wiki",
+ "shortcut": "al"
+ },
+ {
+ "categories": [
+ "images"
+ ],
+ "enabled": true,
+ "name": "google images",
+ "shortcut": "goi"
+ },
+ {
+ "categories": [
+ "it"
+ ],
+ "enabled": false,
+ "name": "bitbucket",
+ "shortcut": "bb"
+ },
+ ],
+ "instance_name": "searx",
+ "locales": {
+ "de": "Deutsch (German)",
+ "en": "English",
+ "eo": "Esperanto (Esperanto)",
+ },
+ "plugins": [
+ {
+ "enabled": true,
+ "name": "HTTPS rewrite"
+ },
+ {
+ "enabled": false,
+ "name": "Vim-like hotkeys"
+ }
+ ],
+ "safe_search": 0
+ }
+
+
+Embed search bar
+================
+
+The search bar can be embedded into websites. Just paste the example into the
+HTML of the site. URL of the searx instance and values are customizable.
+
+.. code:: html
+
+ <form method="post" action="https://searx.me/">
+ <!-- search --> <input type="text" name="q" />
+ <!-- categories --> <input type="hidden" name="categories" value="general,social media" />
+ <!-- language --> <input type="hidden" name="lang" value="all" />
+ <!-- locale --> <input type="hidden" name="locale" value="en" />
+ <!-- date filter --> <input type="hidden" name="time_range" value="month" />
+ </form>
diff --git a/docs/admin/arch_public.dot b/docs/admin/arch_public.dot
new file mode 100644
index 000000000..a46c96de3
--- /dev/null
+++ b/docs/admin/arch_public.dot
@@ -0,0 +1,33 @@
+digraph G {
+
+ node [style=filled, shape=box, fillcolor="#ffffcc", fontname="Sans"];
+ edge [fontname="Sans"];
+
+ browser [label="Browser", shape=Mdiamond];
+ rp [label="Reverse Proxy", href="url to configure reverse proxy"];
+ filtron [label="Filtron", href="https://github.com/asciimoo/filtron"];
+ morty [label="Morty", href="https://github.com/asciimoo/morty"];
+ static [label="Static files", href="url to configure static files"];
+ uwsgi [label="uwsgi", href="url to configure uwsgi"]
+ searx1 [label="Searx #1"];
+ searx2 [label="Searx #2"];
+ searx3 [label="Searx #3"];
+ searx4 [label="Searx #4"];
+
+ browser -> rp [label="HTTPS"]
+
+ subgraph cluster_searx {
+ label = "Searx instance" fontname="Sans";
+ bgcolor="#fafafa";
+ { rank=same; static rp };
+ rp -> morty [label="optional: images and HTML pages proxy"];
+ rp -> static [label="optional: reverse proxy serves directly static files"];
+ rp -> filtron [label="HTTP"];
+ filtron -> uwsgi [label="HTTP"];
+ uwsgi -> searx1;
+ uwsgi -> searx2;
+ uwsgi -> searx3;
+ uwsgi -> searx4;
+ }
+
+}
diff --git a/docs/admin/architecture.rst b/docs/admin/architecture.rst
new file mode 100644
index 000000000..7064a294b
--- /dev/null
+++ b/docs/admin/architecture.rst
@@ -0,0 +1,24 @@
+.. _architecture:
+
+============
+Architecture
+============
+
+.. sidebar:: Needs work!
+
+ This article needs some work / Searx is a collaborative effort. If you have
+ any contribution, feel welcome to send us your :pull:`PR <../pulls>`, see
+ :ref:`how to contribute`.
+
+Herein you will find some hints and suggestions about typical architectures of
+searx infrastructures.
+
+We start with a contribution from :pull:`@dalf <1776#issuecomment-567917320>`.
+It shows a *reference* setup for public searx instances.
+
+.. _arch public:
+
+.. kernel-figure:: arch_public.dot
+ :alt: arch_public.dot
+
+ Reference architecture of a public searx setup.
diff --git a/docs/admin/buildhosts.rst b/docs/admin/buildhosts.rst
new file mode 100644
index 000000000..5260da033
--- /dev/null
+++ b/docs/admin/buildhosts.rst
@@ -0,0 +1,103 @@
+.. _buildhosts:
+
+==========
+Buildhosts
+==========
+
+.. sidebar:: This article needs some work
+
+ If you have any contribution send us your :pull:`PR <../pulls>`, see
+ :ref:`how to contribute`.
+
+To get best results from build, its recommend to install additional packages
+on build hosts.
+
+.. _docs build:
+
+Build docs
+==========
+
+.. _Graphviz: https://graphviz.gitlab.io
+.. _ImageMagick: https://www.imagemagick.org
+.. _XeTeX: https://tug.org/xetex/
+.. _dvisvgm: https://dvisvgm.de/
+
+.. sidebar:: Sphinx build needs
+
+ - ImageMagick_
+ - Graphviz_
+ - XeTeX_
+ - dvisvgm_
+
+Most of the sphinx requirements are installed from :origin:`setup.py` and the
+docs can be build from scratch with ``make docs``. For better math and image
+processing additional packages are needed. The XeTeX_ needed not only for PDF
+creation, its also needed for :ref:`math` when HTML output is build.
+
+To be able to do :ref:`sphinx:math-support` without CDNs, the math are rendered
+as images (``sphinx.ext.imgmath`` extension). If your docs build (``make
+docs``) shows warnings like this::
+
+ WARNING: dot(1) not found, for better output quality install \
+ graphviz from http://www.graphviz.org
+ ..
+ WARNING: LaTeX command 'latex' cannot be run (needed for math \
+ display), check the imgmath_latex setting
+
+you need to install additional packages on your build host, to get better HTML
+output.
+
+.. _system requirements:
+
+.. tabs::
+
+ .. group-tab:: Ubuntu / debian
+
+ .. code-block:: sh
+
+ $ sudo apt install graphviz imagemagick texlive-xetex librsvg2-bin
+
+ .. group-tab:: Arch Linux
+
+ .. code-block:: sh
+
+ $ sudo pacman -S graphviz imagemagick texlive-bin extra/librsvg
+
+ .. group-tab:: Fedora / RHEL
+
+ .. code-block:: sh
+
+ $ sudo dnf install graphviz graphviz-gd texlive-xetex-bin librsvg2-tools
+
+
+For PDF output you also need:
+
+.. tabs::
+
+ .. group-tab:: Ubuntu / debian
+
+ .. code:: sh
+
+ $ sudo apt texlive-latex-recommended texlive-extra-utils ttf-dejavu
+
+ .. group-tab:: Arch Linux
+
+ .. code:: sh
+
+ $ sudo pacman -S texlive-core texlive-latexextra ttf-dejavu
+
+ .. group-tab:: Fedora / RHEL
+
+ .. code:: sh
+
+ $ sudo dnf install \
+ texlive-collection-fontsrecommended texlive-collection-latex \
+ dejavu-sans-fonts dejavu-serif-fonts dejavu-sans-mono-fonts
+
+.. _system requirements END:
+
+.. literalinclude:: ../conf.py
+ :language: python
+ :start-after: # sphinx.ext.imgmath setup
+ :end-before: # sphinx.ext.imgmath setup END
+
diff --git a/docs/admin/engines.rst b/docs/admin/engines.rst
new file mode 100644
index 000000000..4b78c8c2b
--- /dev/null
+++ b/docs/admin/engines.rst
@@ -0,0 +1,71 @@
+.. _engines generic:
+
+=======
+Engines
+=======
+
+.. sidebar:: Further reading ..
+
+ - :ref:`settings engine`
+ - :ref:`engine settings`
+ - :ref:`engine file`
+
+============= =========== ==================== ============
+:ref:`engine settings` :ref:`engine file`
+------------------------- ---------------------------------
+Name (cfg) Categories
+------------------------- ---------------------------------
+Engine .. Paging support **P**
+------------------------- -------------------- ------------
+Shortcut **S** Language support **L**
+Timeout **TO** Time range support **TR**
+Disabled **D** Offline **O**
+------------- ----------- -------------------- ------------
+Safe search **SS**
+------------- ----------- ---------------------------------
+Weigth **W**
+------------- ----------- ---------------------------------
+Disabled **D**
+============= =========== =================================
+
+Configuration defaults (at built time):
+
+.. _configured engines:
+
+.. jinja:: webapp
+
+ .. flat-table:: Engines configured at built time (defaults)
+ :header-rows: 1
+ :stub-columns: 2
+
+ * - Name (cfg)
+ - S
+ - Engine
+ - TO
+ - Categories
+ - P
+ - L
+ - SS
+ - D
+ - TR
+ - O
+ - W
+ - D
+
+ {% for name, mod in engines.items() %}
+
+ * - {{name}}
+ - !{{mod.shortcut}}
+ - {{mod.__name__}}
+ - {{mod.timeout}}
+ - {{", ".join(mod.categories)}}
+ - {{(mod.paging and "y") or ""}}
+ - {{(mod.language_support and "y") or ""}}
+ - {{(mod.safesearch and "y") or ""}}
+ - {{(mod.disabled and "y") or ""}}
+ - {{(mod.time_range_support and "y") or ""}}
+ - {{(mod.offline and "y") or ""}}
+ - {{mod.weight or 1 }}
+ - {{(mod.disabled and "y") or ""}}
+
+ {% endfor %}
diff --git a/docs/admin/filtron.rst b/docs/admin/filtron.rst
new file mode 100644
index 000000000..07dcb9bc5
--- /dev/null
+++ b/docs/admin/filtron.rst
@@ -0,0 +1,148 @@
+==========================
+How to protect an instance
+==========================
+
+Searx depens on external search services. To avoid the abuse of these services
+it is advised to limit the number of requests processed by searx.
+
+An application firewall, ``filtron`` solves exactly this problem. Information
+on how to install it can be found at the `project page of filtron
+<https://github.com/asciimoo/filtron>`__.
+
+
+Sample configuration of filtron
+===============================
+
+An example configuration can be find below. This configuration limits the access
+of:
+
+- scripts or applications (roboagent limit)
+- webcrawlers (botlimit)
+- IPs which send too many requests (IP limit)
+- too many json, csv, etc. requests (rss/json limit)
+- the same UserAgent of if too many requests (useragent limit)
+
+.. code:: json
+
+ [{
+ "name":"search request",
+ "filters":[
+ "Param:q",
+ "Path=^(/|/search)$"
+ ],
+ "interval":"<time-interval-in-sec (int)>",
+ "limit":"<max-request-number-in-interval (int)>",
+ "subrules":[
+ {
+ "name":"roboagent limit",
+ "interval":"<time-interval-in-sec (int)>",
+ "limit":"<max-request-number-in-interval (int)>",
+ "filters":[
+ "Header:User-Agent=(curl|cURL|Wget|python-requests|Scrapy|FeedFetcher|Go-http-client)"
+ ],
+ "actions":[
+ {
+ "name":"block",
+ "params":{
+ "message":"Rate limit exceeded"
+ }
+ }
+ ]
+ },
+ {
+ "name":"botlimit",
+ "limit":0,
+ "stop":true,
+ "filters":[
+ "Header:User-Agent=(Googlebot|bingbot|Baiduspider|yacybot|YandexMobileBot|YandexBot|Yahoo! Slurp|MJ12bot|AhrefsBot|archive.org_bot|msnbot|MJ12bot|SeznamBot|linkdexbot|Netvibes|SMTBot|zgrab|James BOT)"
+ ],
+ "actions":[
+ {
+ "name":"block",
+ "params":{
+ "message":"Rate limit exceeded"
+ }
+ }
+ ]
+ },
+ {
+ "name":"IP limit",
+ "interval":"<time-interval-in-sec (int)>",
+ "limit":"<max-request-number-in-interval (int)>",
+ "stop":true,
+ "aggregations":[
+ "Header:X-Forwarded-For"
+ ],
+ "actions":[
+ {
+ "name":"block",
+ "params":{
+ "message":"Rate limit exceeded"
+ }
+ }
+ ]
+ },
+ {
+ "name":"rss/json limit",
+ "interval":"<time-interval-in-sec (int)>",
+ "limit":"<max-request-number-in-interval (int)>",
+ "stop":true,
+ "filters":[
+ "Param:format=(csv|json|rss)"
+ ],
+ "actions":[
+ {
+ "name":"block",
+ "params":{
+ "message":"Rate limit exceeded"
+ }
+ }
+ ]
+ },
+ {
+ "name":"useragent limit",
+ "interval":"<time-interval-in-sec (int)>",
+ "limit":"<max-request-number-in-interval (int)>",
+ "aggregations":[
+ "Header:User-Agent"
+ ],
+ "actions":[
+ {
+ "name":"block",
+ "params":{
+ "message":"Rate limit exceeded"
+ }
+ }
+ ]
+ }
+ ]
+ }]
+
+
+
+Route request through filtron
+=============================
+
+Filtron can be started using the following command:
+
+.. code:: sh
+
+ $ filtron -rules rules.json
+
+It listens on ``127.0.0.1:4004`` and forwards filtered requests to
+``127.0.0.1:8888`` by default.
+
+Use it along with ``nginx`` with the following example configuration.
+
+.. code:: nginx
+
+ location / {
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Scheme $scheme;
+ proxy_pass http://127.0.0.1:4004/;
+ }
+
+Requests are coming from port 4004 going through filtron and then forwarded to
+port 8888 where a searx is being run.
diff --git a/docs/admin/index.rst b/docs/admin/index.rst
new file mode 100644
index 000000000..b3c7f5119
--- /dev/null
+++ b/docs/admin/index.rst
@@ -0,0 +1,16 @@
+===========================
+Administrator documentation
+===========================
+
+.. toctree::
+ :maxdepth: 1
+
+ installation
+ settings
+ api
+ architecture
+ filtron
+ morty
+ engines
+ plugins
+ buildhosts
diff --git a/docs/admin/installation.rst b/docs/admin/installation.rst
new file mode 100644
index 000000000..15800fc01
--- /dev/null
+++ b/docs/admin/installation.rst
@@ -0,0 +1,349 @@
+.. _installation:
+
+============
+Installation
+============
+
+.. contents::
+ :depth: 3
+
+Basic installation
+==================
+
+Step by step installation for Debian/Ubuntu with virtualenv. For Ubuntu, be sure
+to have enable universe repository.
+
+Install packages:
+
+.. code:: sh
+
+ $ sudo -H apt-get install \
+ git build-essential libxslt-dev \
+ python-dev python-virtualenv python-babel \
+ zlib1g-dev libffi-dev libssl-dev
+
+Install searx:
+
+.. code:: sh
+
+ cd /usr/local
+ sudo -H git clone https://github.com/asciimoo/searx.git
+ sudo -H useradd searx -d /usr/local/searx
+ sudo -H chown searx:searx -R /usr/local/searx
+
+Install dependencies in a virtualenv:
+
+.. code:: sh
+
+ cd /usr/local/searx
+ sudo -H -u searx -i
+
+.. code:: sh
+
+ (searx)$ virtualenv searx-ve
+ (searx)$ . ./searx-ve/bin/activate
+ (searx)$ ./manage.sh update_packages
+
+Configuration
+==============
+
+.. code:: sh
+
+ sed -i -e "s/ultrasecretkey/`openssl rand -hex 16`/g" searx/settings.yml
+
+Edit searx/settings.yml if necessary.
+
+Check
+=====
+
+Start searx:
+
+.. code:: sh
+
+ python searx/webapp.py
+
+Go to http://localhost:8888
+
+If everything works fine, disable the debug option in settings.yml:
+
+.. code:: sh
+
+ sed -i -e "s/debug : True/debug : False/g" searx/settings.yml
+
+At this point searx is not demonized ; uwsgi allows this.
+
+You can exit the virtualenv and the searx user bash (enter exit command
+twice).
+
+uwsgi
+=====
+
+Install packages:
+
+.. code:: sh
+
+ sudo -H apt-get install \
+ uwsgi uwsgi-plugin-python
+
+Create the configuration file ``/etc/uwsgi/apps-available/searx.ini`` with this
+content:
+
+.. code:: ini
+
+ [uwsgi]
+ # Who will run the code
+ uid = searx
+ gid = searx
+
+ # disable logging for privacy
+ disable-logging = true
+
+ # Number of workers (usually CPU count)
+ workers = 4
+
+ # The right granted on the created socket
+ chmod-socket = 666
+
+ # Plugin to use and interpretor config
+ single-interpreter = true
+ master = true
+ plugin = python
+ lazy-apps = true
+ enable-threads = true
+
+ # Module to import
+ module = searx.webapp
+
+ # Support running the module from a webserver subdirectory.
+ route-run = fixpathinfo:
+
+ # Virtualenv and python path
+ virtualenv = /usr/local/searx/searx-ve/
+ pythonpath = /usr/local/searx/
+ chdir = /usr/local/searx/searx/
+
+Activate the uwsgi application and restart:
+
+.. code:: sh
+
+ cd /etc/uwsgi/apps-enabled
+ ln -s ../apps-available/searx.ini
+ /etc/init.d/uwsgi restart
+
+Web server
+==========
+
+with nginx
+----------
+
+If nginx is not installed (uwsgi will not work with the package
+nginx-light):
+
+.. code:: sh
+
+ sudo -H apt-get install nginx
+
+Hosted at /
+~~~~~~~~~~~
+
+Create the configuration file ``/etc/nginx/sites-available/searx`` with this
+content:
+
+.. code:: nginx
+
+ server {
+ listen 80;
+ server_name searx.example.com;
+ root /usr/local/searx/searx;
+
+ location /static {
+ }
+
+ location / {
+ include uwsgi_params;
+ uwsgi_pass unix:/run/uwsgi/app/searx/socket;
+ }
+ }
+
+Create a symlink to sites-enabled:
+
+.. code:: sh
+
+ sudo -H ln -s /etc/nginx/sites-available/searx /etc/nginx/sites-enabled/searx
+
+Restart service:
+
+.. code:: sh
+
+ sudo -H service nginx restart
+ sudo -H service uwsgi restart
+
+from subdirectory URL (/searx)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Add this configuration in the server config file
+``/etc/nginx/sites-enabled/default``:
+
+.. code:: nginx
+
+ location /searx/static {
+ alias /usr/local/searx/searx/static;
+ }
+
+ location /searx {
+ uwsgi_param SCRIPT_NAME /searx;
+ include uwsgi_params;
+ uwsgi_pass unix:/run/uwsgi/app/searx/socket;
+ }
+
+
+**OR** using reverse proxy (Please, note that reverse proxy advised to be used
+in case of single-user or low-traffic instances.)
+
+.. code:: nginx
+
+ location /searx/static {
+ alias /usr/local/searx/searx/static;
+ }
+
+ location /searx {
+ proxy_pass http://127.0.0.1:8888;
+ proxy_set_header Host $host;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Scheme $scheme;
+ proxy_set_header X-Script-Name /searx;
+ proxy_buffering off;
+ }
+
+
+Enable ``base_url`` in ``searx/settings.yml``
+
+.. code:: yaml
+
+ base_url : http://your.domain.tld/searx/
+
+Restart service:
+
+.. code:: sh
+
+ sudo -H service nginx restart
+ sudo -H service uwsgi restart
+
+disable logs
+^^^^^^^^^^^^
+
+for better privacy you can disable nginx logs about searx.
+
+how to proceed: below ``uwsgi_pass`` in ``/etc/nginx/sites-available/default``
+add:
+
+.. code:: nginx
+
+ access_log /dev/null;
+ error_log /dev/null;
+
+Restart service:
+
+.. code:: sh
+
+ sudo -H service nginx restart
+
+with apache
+-----------
+
+Add wsgi mod:
+
+.. code:: sh
+
+ sudo -H apt-get install libapache2-mod-uwsgi
+ sudo -H a2enmod uwsgi
+
+Add this configuration in the file ``/etc/apache2/apache2.conf``:
+
+.. code:: apache
+
+ <Location />
+ Options FollowSymLinks Indexes
+ SetHandler uwsgi-handler
+ uWSGISocket /run/uwsgi/app/searx/socket
+ </Location>
+
+Note that if your instance of searx is not at the root, you should change
+``<Location />`` by the location of your instance, like ``<Location /searx>``.
+
+Restart Apache:
+
+.. code:: sh
+
+ sudo -H /etc/init.d/apache2 restart
+
+disable logs
+~~~~~~~~~~~~
+
+For better privacy you can disable Apache logs.
+
+.. warning::
+
+ You can only disable logs for the whole (virtual) server not for a specific
+ path.
+
+Go back to ``/etc/apache2/apache2.conf`` and above ``<Location />`` add:
+
+.. code:: apache
+
+ CustomLog /dev/null combined
+
+Restart Apache:
+
+.. code:: sh
+
+ sudo -H /etc/init.d/apache2 restart
+
+How to update
+=============
+
+.. code:: sh
+
+ cd /usr/local/searx
+ sudo -H -u searx -i
+
+.. code:: sh
+
+ (searx)$ . ./searx-ve/bin/activate
+ (searx)$ git stash
+ (searx)$ git pull origin master
+ (searx)$ git stash apply
+ (searx)$ ./manage.sh update_packages
+
+.. code:: sh
+
+ sudo -H service uwsgi restart
+
+Docker
+======
+
+Make sure you have installed Docker. For instance, you can deploy searx like this:
+
+.. code:: sh
+
+ docker pull wonderfall/searx
+ docker run -d --name searx -p $PORT:8888 wonderfall/searx
+
+Go to ``http://localhost:$PORT``.
+
+See https://hub.docker.com/r/wonderfall/searx/ for more informations. It's also
+possible to build searx from the embedded Dockerfile.
+
+.. code:: sh
+
+ git clone https://github.com/asciimoo/searx.git
+ cd searx
+ docker build -t whatever/searx .
+
+References
+==========
+
+* https://about.okhin.fr/posts/Searx/ with some additions
+
+* How to: `Setup searx in a couple of hours with a free SSL certificate
+ <https://www.reddit.com/r/privacytoolsIO/comments/366kvn/how_to_setup_your_own_privacy_respecting_search/>`__
diff --git a/docs/admin/morty.rst b/docs/admin/morty.rst
new file mode 100644
index 000000000..7d7b34492
--- /dev/null
+++ b/docs/admin/morty.rst
@@ -0,0 +1,26 @@
+=========================
+How to setup result proxy
+=========================
+
+.. _morty: https://github.com/asciimoo/morty
+.. _morty's README: https://github.com/asciimoo/morty
+
+By default searx can only act as an image proxy for result images, but it is
+possible to proxify all the result URLs with an external service, morty_.
+
+To use this feature, morty has to be installed and activated in searx's
+``settings.yml``.
+
+Add the following snippet to your ``settings.yml`` and restart searx:
+
+.. code:: yaml
+
+ result_proxy:
+ url : http://127.0.0.1:3000/
+ key : your_morty_proxy_key
+
+``url``
+ Is the address of the running morty service.
+
+``key``
+ Is an optional argument, see `morty's README`_ for more information.
diff --git a/docs/admin/plugins.rst b/docs/admin/plugins.rst
new file mode 100644
index 000000000..4ed9066fd
--- /dev/null
+++ b/docs/admin/plugins.rst
@@ -0,0 +1,39 @@
+.. _plugins generic:
+
+===============
+Plugins builtin
+===============
+
+.. sidebar:: Further reading ..
+
+ - :ref:`dev plugin`
+
+Configuration defaults (at built time):
+
+:DO: Default on
+
+.. _configured plugins:
+
+.. jinja:: webapp
+
+ .. flat-table:: Plugins configured at built time (defaults)
+ :header-rows: 1
+ :stub-columns: 1
+ :widths: 3 1 9
+
+ * - Name
+ - DO
+ - Description
+
+ JS & CSS dependencies
+
+ {% for plgin in plugins %}
+
+ * - {{plgin.name}}
+ - {{(plgin.default_on and "y") or ""}}
+ - {{plgin.description}}
+
+ {% for dep in (plgin.js_dependencies + plgin.css_dependencies) %}
+ | ``{{dep}}`` {% endfor %}
+
+ {% endfor %}
diff --git a/docs/admin/settings.rst b/docs/admin/settings.rst
new file mode 100644
index 000000000..0bfdcc6cb
--- /dev/null
+++ b/docs/admin/settings.rst
@@ -0,0 +1,181 @@
+.. _settings.yml:
+
+================
+``settings.yml``
+================
+
+.. sidebar:: Further reading ..
+
+ - :ref:`search API`
+
+This page describe the options possibilities of the settings.yml file.
+
+.. _settings global:
+
+Global Settings
+===============
+
+.. code:: yaml
+
+ server:
+ port : 8888
+ secret_key : "ultrasecretkey" # change this!
+ debug : False # debug mode, only for development
+ request_timeout : 2.0 # seconds
+ base_url : False # set custom base_url (or False)
+ themes_path : "" # custom ui themes path
+ default_theme : oscar # ui theme
+ useragent_suffix : "" # suffix of searx_useragent, could contain
+ # informations like admins email address
+ image_proxy : False # proxying image results through searx
+ default_locale : "" # default interface locale
+
+ # uncomment below section if you want to use a proxy
+
+ #outgoing_proxies :
+ # http : http://127.0.0.1:8080
+ # https: http://127.0.0.1:8080
+
+ # uncomment below section only if you have more than one network interface
+ # which can be the source of outgoing search requests
+
+ #source_ips:
+ # - 1.1.1.1
+ # - 1.1.1.2
+
+ locales:
+ en : English
+ de : Deutsch
+ he : Hebrew
+ hu : Magyar
+ fr : Français
+ es : Español
+ it : Italiano
+ nl : Nederlands
+ ja : 日本語 (Japanese)
+ tr : Türkçe
+ ru : Russian
+ ro : Romanian
+
+
+``port`` :
+ Port number of the searx web application if you run it directly using ``python
+ searx/webapp.py``. Doesn't apply to searx running on Apache or Nginx.
+
+``secret_key`` :
+ Used for cryptography purpose.
+
+``debug`` :
+ Allow a more detailed log if you run searx directly. Display *detailed* error
+ messages in the browser too, so this must be deactivated in production.
+
+``request_timeout`` :
+ Global timeout of the requests made to others engines in seconds. A bigger
+ timeout will allow to wait for answers from slow engines, but in consequence
+ will slow searx reactivity (the result page may take the time specified in the
+ timeout to load)
+
+``base_url`` :
+ The base URL where searx is deployed. Used to create correct inbound links.
+
+``themes_path`` :
+ Path to where the themes are located. If you didn't develop anything, leave it
+ blank.
+
+``default_theme`` :
+ Name of the theme you want to use by default on you searx instance.
+
+``useragent_suffix`` :
+ Suffix to the user-agent searx uses to send requests to others engines. If an
+ engine wish to block you, a contact info here may be useful to avoid that.
+
+``image_proxy`` :
+ Allow your instance of searx of being able to proxy images. Uses memory space.
+
+``default_locale`` :
+ Aearx interface language. If blank, the locale is detected by using the
+ browser language. If it doesn't work, or you are deploying a language
+ specific instance of searx, a locale can be defined using an ISO language
+ code, like ``fr``, ``en``, ``de``.
+
+.. _requests proxies: http://docs.python-requests.org/en/latest/user/advanced/#proxies
+.. _PR SOCKS support: https://github.com/kennethreitz/requests/pull/478
+
+``outgoing_proxies`` :
+ Define a proxy you wish to use, see `requests proxies`_. SOCKS proxies are
+ not supported / see `PR SOCKS support`.
+
+``source_ips`` :
+ If you use multiple nework interfaces, define from which IP the requests must
+ be made.
+
+``locales`` :
+ Locales codes and their names. Available translations of searx interface.
+
+
+.. _settings engine:
+
+Engine settings
+===============
+
+.. sidebar:: Further reading ..
+
+ - :ref:`engines-dev`
+
+.. code:: yaml
+
+ - name : bing
+ engine : bing
+ shortcut : bi
+ base_url : 'https://{language}.wikipedia.org/'
+ categories : general
+ timeout : 3.0
+ api_key : 'apikey'
+ disabled : True
+ language : en_US
+
+``name`` :
+ Name that will be used accross searx to define this engine. In settings, on
+ the result page...
+
+``engine`` :
+ Name of the python file used to handle requests and responses to and from this
+ search engine.
+
+``shortcut`` :
+ Code used to execute bang requests (in this case using ``!bi`` or ``?bi``)
+
+``base_url`` : optional
+ Part of the URL that should be stable accross every request. Can be useful to
+ use multiple sites using only one engine, or updating the site URL without
+ touching at the code.
+
+``categories`` : optional
+ Define in which categories this engine will be active. Most of the time, it is
+ defined in the code of the engine, but in a few cases it is useful, like when
+ describing multiple search engine using the same code.
+
+``timeout`` : optional
+ Timeout of the search with the current search engine. **Be careful, it will
+ modify the global timeout of searx.**
+
+``api_key`` : optional
+ In a few cases, using an API needs the use of a secret key. How to obtain them
+ is described in the file.
+
+``disabled`` : optional
+ To disable by default the engine, but not deleting it. It will allow the user
+ to manually activate it in the settings.
+
+``language`` : optional
+ If you want to use another language for a specific engine, you can define it
+ by using the full ISO code of language and country, like ``fr_FR``, ``en_US``,
+ ``de_DE``.
+
+``weigth`` : default ``1``
+ Weighting of the results of this engine.
+
+.. note::
+
+ A few more options are possible, but they are pretty specific to some
+ engines, and so won't be described here.
diff --git a/docs/blog/admin.rst b/docs/blog/admin.rst
new file mode 100644
index 000000000..e95316192
--- /dev/null
+++ b/docs/blog/admin.rst
@@ -0,0 +1,43 @@
+=============================================================
+Searx admin interface
+=============================================================
+
+.. _searx-admin: https://github.com/kvch/searx-admin#searx-admin
+.. _NLnet Foundation: https://nlnet.nl/
+
+ manage your instance from your browser
+
+.. sidebar:: Installation
+
+ Installation guide can be found in the repository of searx-admin_.
+
+One of the biggest advantages of searx is being extremely customizable. But at
+first it can be daunting to newcomers. A barrier of taking advantage of this
+feature is our ugly settings file which is sometimes hard to understand and
+edit.
+
+To make self-hosting searx more accessible a new tool is introduced, called
+``searx-admin``. It is a web application which is capable of managing your
+instance and manipulating its settings via a web UI. It aims to replace editing
+of ``settings.yml`` for less experienced administrators or people who prefer
+graphical admin interfaces.
+
+.. figure:: searx-admin-engines.png
+ :alt: Screenshot of engine list
+
+ Configuration page of engines
+
+Since ``searx-admin`` acts as a supervisor for searx, we have decided to
+implement it as a standalone tool instead of part of searx. Another reason for
+making it a standalone tool is that the codebase and dependencies of searx
+should not grow because of a fully optional feature, which does not affect
+existing instances.
+
+
+Acknowledgements
+================
+
+This development was sponsored by `NLnet Foundation`_.
+
+| Happy hacking.
+| kvch // 2017.08.22 21:25
diff --git a/docs/blog/index.rst b/docs/blog/index.rst
new file mode 100644
index 000000000..52fa3f126
--- /dev/null
+++ b/docs/blog/index.rst
@@ -0,0 +1,10 @@
+====
+Blog
+====
+
+.. toctree::
+ :maxdepth: 1
+
+ python3
+ admin
+ intro-offline
diff --git a/docs/blog/intro-offline.rst b/docs/blog/intro-offline.rst
new file mode 100644
index 000000000..f6e90de3a
--- /dev/null
+++ b/docs/blog/intro-offline.rst
@@ -0,0 +1,77 @@
+===============================
+Preparation for offline engines
+===============================
+
+Offline engines
+===============
+
+To extend the functionality of searx, offline engines are going to be
+introduced. An offline engine is an engine which does not need Internet
+connection to perform a search and does not use HTTP to communicate.
+
+Offline engines can be configured as online engines, by adding those to the
+`engines` list of :origin:`settings.yml <searx/settings.yml>`. Thus, searx
+finds the engine file and imports it.
+
+Example skeleton for the new engines:
+
+.. code:: python
+
+ from subprocess import PIPE, Popen
+
+ categories = ['general']
+ offline = True
+
+ def init(settings):
+ pass
+
+ def search(query, params):
+ process = Popen(['ls', query], stdout=PIPE)
+ return_code = process.wait()
+ if return_code != 0:
+ raise RuntimeError('non-zero return code', return_code)
+
+ results = []
+ line = process.stdout.readline()
+ while line:
+ result = parse_line(line)
+ results.append(results)
+
+ line = process.stdout.readline()
+
+ return results
+
+
+Development progress
+====================
+
+First, a proposal has been created as a Github issue. Then it was moved to the
+wiki as a design document. You can read it here: :wiki:`Offline-engines`.
+
+In this development step, searx core was prepared to accept and perform offline
+searches. Offline search requests are scheduled together with regular offline
+requests.
+
+As offline searches can return arbitrary results depending on the engine, the
+current result templates were insufficient to present such results. Thus, a new
+template is introduced which is caplable of presenting arbitrary key value pairs
+as a table. You can check out the pull request for more details see
+:pull:`1700`.
+
+Next steps
+==========
+
+Today, it is possible to create/run an offline engine. However, it is going to be publicly available for everyone who knows the searx instance. So the next step is to introduce token based access for engines. This way administrators are able to limit the access to private engines.
+
+Acknowledgement
+===============
+
+This development was sponsored by `Search and Discovery Fund`_ of `NLnet Foundation`_ .
+
+.. _Search and Discovery Fund: https://nlnet.nl/discovery
+.. _NLnet Foundation: https://nlnet.nl/
+
+
+| Happy hacking.
+| kvch // 2019.10.21 17:03
+
diff --git a/docs/blog/python3.rst b/docs/blog/python3.rst
new file mode 100644
index 000000000..5bb7f1c80
--- /dev/null
+++ b/docs/blog/python3.rst
@@ -0,0 +1,68 @@
+============================
+Introducing Python 3 support
+============================
+
+.. _Python 2.7 clock: https://pythonclock.org/
+
+.. sidebar:: Python 2.7 to 3 upgrade
+
+ This chapter exists of historical reasons. Python 2.7 release schedule ends
+ (`Python 2.7 clock`_) after 11 years Python 3 exists
+
+As most operation systems are coming with Python3 installed by default. So it is
+time for searx to support Python3. But don't worry support of Python2.7 won't be
+dropped.
+
+.. image:: searxpy3.png
+ :scale: 50 %
+ :alt: hurray
+ :align: center
+
+
+How to run searx using Python 3
+===============================
+
+Please make sure that you run at least Python 3.5.
+
+To run searx, first a Python3 virtualenv should be created. After entering the
+virtualenv, dependencies must be installed. Then run searx with python3 instead
+of the usual python command.
+
+.. code:: sh
+
+ virtualenv -p python3 venv3
+ source venv3/bin/activate
+ pip3 install -r requirements.txt
+ python3 searx/webapp.py
+
+
+If you want to run searx using Python2.7, you don't have to do anything
+differently as before.
+
+Fun facts
+=========
+
+- 115 files were changed when implementing the support for both Python versions.
+
+- All of the dependencies was compatible except for the robotframework used for
+ browser tests. Thus, these tests were migrated to splinter. So from now on
+ both versions are being tested on Travis and can be tested locally.
+
+If you found bugs
+=================
+
+Please open an issue on `GitHub`_. Make sure that you mention your Python
+version in your issue, so we can investigate it properly.
+
+.. _GitHub: https://github.com/asciimoo/searx/issues
+
+Acknowledgment
+==============
+
+This development was sponsored by `NLnet Foundation`_.
+
+.. _NLnet Foundation: https://nlnet.nl/
+
+
+| Happy hacking.
+| kvch // 2017.05.13 22:57
diff --git a/docs/blog/searx-admin-engines.png b/docs/blog/searx-admin-engines.png
new file mode 100644
index 000000000..610bacdf7
--- /dev/null
+++ b/docs/blog/searx-admin-engines.png
Binary files differ
diff --git a/docs/blog/searxpy3.png b/docs/blog/searxpy3.png
new file mode 100644
index 000000000..8eeaeec55
--- /dev/null
+++ b/docs/blog/searxpy3.png
Binary files differ
diff --git a/docs/conf.py b/docs/conf.py
new file mode 100644
index 000000000..af255e230
--- /dev/null
+++ b/docs/conf.py
@@ -0,0 +1,114 @@
+# -*- coding: utf-8 -*-
+
+import sys, os
+from searx.version import VERSION_STRING
+from pallets_sphinx_themes import ProjectLink
+
+GIT_URL = os.environ.get("GIT_URL", "https://github.com/asciimoo/searx")
+SEARX_URL = os.environ.get("SEARX_URL", "https://searx.me")
+DOCS_URL = os.environ.get("DOCS_URL", "https://asciimoo.github.io/searx/")
+
+# Project --------------------------------------------------------------
+
+project = u'searx'
+copyright = u'2015-2019, Adam Tauber, Noémi Ványi'
+author = u'Adam Tauber'
+release, version = VERSION_STRING, VERSION_STRING
+highlight_language = 'none'
+
+# General --------------------------------------------------------------
+
+master_doc = "index"
+source_suffix = '.rst'
+numfig = True
+
+from searx import webapp
+jinja_contexts = {
+ 'webapp': dict(**webapp.__dict__)
+}
+
+# usage:: lorem :patch:`f373169` ipsum
+extlinks = {}
+
+# upstream links
+extlinks['wiki'] = ('https://github.com/asciimoo/searx/wiki/%s', ' ')
+extlinks['pull'] = ('https://github.com/asciimoo/searx/pull/%s', 'PR ')
+
+# links to custom brand
+extlinks['origin'] = (GIT_URL + '/blob/master/%s', 'git://')
+extlinks['patch'] = (GIT_URL + '/commit/%s', '#')
+extlinks['search'] = (SEARX_URL + '/%s', '#')
+extlinks['docs'] = (DOCS_URL + '/%s', 'docs: ')
+extlinks['pypi'] = ('https://pypi.org/project/%s', 'PyPi: ')
+extlinks['man'] = ('https://manpages.debian.org/jump?q=%s', '')
+#extlinks['role'] = (
+# 'https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-%s', '')
+extlinks['duref'] = (
+ 'http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#%s', '')
+extlinks['durole'] = (
+ 'http://docutils.sourceforge.net/docs/ref/rst/roles.html#%s', '')
+extlinks['dudir'] = (
+ 'http://docutils.sourceforge.net/docs/ref/rst/directives.html#%s', '')
+extlinks['ctan'] = (
+ 'https://ctan.org/pkg/%s', 'CTAN: ')
+
+extensions = [
+ 'sphinx.ext.imgmath',
+ 'sphinx.ext.extlinks',
+ 'sphinx.ext.viewcode',
+ "sphinx.ext.autodoc",
+ "sphinx.ext.intersphinx",
+ "pallets_sphinx_themes",
+ "sphinx_issues", # https://github.com/sloria/sphinx-issues/blob/master/README.rst
+ "sphinxcontrib.jinja", # https://github.com/tardyp/sphinx-jinja
+ 'linuxdoc.rstFlatTable', # Implementation of the 'flat-table' reST-directive.
+ 'linuxdoc.kfigure', # Sphinx extension which implements scalable image handling.
+ "sphinx_tabs.tabs", # https://github.com/djungelorm/sphinx-tabs
+]
+
+intersphinx_mapping = {
+ "python": ("https://docs.python.org/3/", None),
+ "flask": ("https://flask.palletsprojects.com/", None),
+ # "werkzeug": ("https://werkzeug.palletsprojects.com/", None),
+ "jinja": ("https://jinja.palletsprojects.com/", None),
+ "linuxdoc" : ("https://return42.github.io/linuxdoc/", None),
+ "sphinx" : ("https://www.sphinx-doc.org/en/master/", None),
+}
+
+issues_github_path = "asciimoo/searx"
+
+# HTML -----------------------------------------------------------------
+
+sys.path.append(os.path.abspath('_themes'))
+html_theme_path = ['_themes']
+html_theme = "searx"
+
+# sphinx.ext.imgmath setup
+html_math_renderer = 'imgmath'
+imgmath_image_format = 'svg'
+imgmath_font_size = 14
+# sphinx.ext.imgmath setup END
+
+html_theme_options = {"index_sidebar_logo": True}
+html_context = {
+ "project_links": [
+ ProjectLink("Source", GIT_URL),
+ ProjectLink("Wiki", "https://github.com/asciimoo/searx/wiki"),
+ ProjectLink("Public instances", "https://asciimoo.github.io/searx/user/public_instances.html"),
+ ProjectLink("Twitter", "https://twitter.com/Searx_engine"),
+ ]
+}
+html_sidebars = {
+ "**": ["project.html", "relations.html", "searchbox.html"],
+}
+singlehtml_sidebars = {"index": ["project.html", "localtoc.html"]}
+html_static_path = ["static"]
+html_logo = "static/img/searx_logo_small.png"
+html_title = "Searx Documentation ({})".format("Searx-{}.tex".format(VERSION_STRING))
+html_show_sourcelink = False
+
+# LaTeX ----------------------------------------------------------------
+
+latex_documents = [
+ (master_doc, "searx-{}.tex".format(VERSION_STRING), html_title, author, "manual")
+]
diff --git a/docs/dev/contribution_guide.rst b/docs/dev/contribution_guide.rst
new file mode 100644
index 000000000..459dfb448
--- /dev/null
+++ b/docs/dev/contribution_guide.rst
@@ -0,0 +1,180 @@
+.. _how to contribute:
+
+=================
+How to contribute
+=================
+
+Prime directives: Privacy, Hackability
+======================================
+
+Searx has two prime directives, **privacy-by-design and hackability** . The
+hackability comes in three levels:
+
+- support of search engines
+- plugins to alter search behaviour
+- hacking searx itself
+
+Note the lack of "world domination" among the directives. Searx has no
+intention of wide mass-adoption, rounded corners, etc. The prime directive
+"privacy" deserves a separate chapter, as it's quite uncommon unfortunately.
+
+Privacy-by-design
+-----------------
+
+Searx was born out of the need for a **privacy-respecting** search tool which
+can be extended easily to maximize both, its search and its privacy protecting
+capabilities.
+
+A few widely used features work differently or turned off by default or not
+implemented at all **as a consequence of privacy-by-design**.
+
+If a feature reduces the privacy preserving aspects of searx, it should be
+switched off by default or should not implemented at all. There are plenty of
+search engines already providing such features. If a feature reduces the
+protection of searx, users must be informed about the effect of choosing to
+enable it. Features that protect privacy but differ from the expectations of
+the user should also be explained.
+
+Also, if you think that something works weird with searx, it's might be because
+of the tool you use is designed in a way to interfere with the privacy respect.
+Submitting a bugreport to the vendor of the tool that misbehaves might be a good
+feedback to reconsider the disrespect to its customers (e.g. ``GET`` vs ``POST``
+requests in various browsers).
+
+Remember the other prime directive of searx is to be hackable, so if the above
+privacy concerns do not fancy you, simply fork it.
+
+ *Happy hacking.*
+
+Code
+====
+
+.. _PEP8: https://www.python.org/dev/peps/pep-0008/
+.. _Conventional Commits: https://www.conventionalcommits.org/
+.. _Git Commit Good Practice: https://wiki.openstack.org/wiki/GitCommitMessages
+.. _Structural split of changes:
+ https://wiki.openstack.org/wiki/GitCommitMessages#Structural_split_of_changes
+.. _gitmoji: https://gitmoji.carloscuesta.me/
+.. _Semantic PR: https://github.com/zeke/semantic-pull-requests
+
+.. sidebar:: Create good commits!
+
+ - `Structural split of changes`_
+ - `Conventional Commits`_
+ - `Git Commit Good Practice`_
+ - some like to use: gitmoji_
+ - not yet active: `Semantic PR`_
+
+In order to submit a patch, please follow the steps below:
+
+- Follow coding conventions.
+
+ - PEP8_ standards apply, except the convention of line length
+ - Maximum line length is 120 characters
+
+- The cardinal rule for creating good commits is to ensure there is only one
+ *logical change* per commit / read `Structural split of changes`_
+
+- Check if your code breaks existing tests. If so, update the tests or fix your
+ code.
+
+- If your code can be unit-tested, add unit tests.
+
+- Add yourself to the :origin:`AUTHORS.rst` file.
+
+- Choose meaning full commit messages, read `Conventional Commits`_
+
+ .. code::
+
+ <type>[optional scope]: <description>
+
+ [optional body]
+
+ [optional footer(s)]
+
+- Create a pull request.
+
+For more help on getting started with searx development, see :ref:`devquickstart`.
+
+
+Translation
+===========
+
+Translation currently takes place on :ref:`transifex <translation>`.
+
+.. caution::
+
+ Please, do not update translation files in the repo.
+
+
+.. _contrib docs:
+
+Documentation
+=============
+
+.. _Sphinx: http://www.sphinx-doc.org
+.. _reST: http://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html
+
+.. sidebar:: The reST sources
+
+ has been moved from ``gh-branch`` into ``master`` (:origin:`docs`).
+
+The documentation is built using Sphinx_. So in order to be able to generate
+the required files, you have to install it on your system. Much easier, use
+our :ref:`makefile`.
+
+Here is an example which makes a complete rebuild:
+
+.. code:: sh
+
+ $ make docs-clean docs
+ ...
+ The HTML pages are in dist/docs.
+
+.. _make docs-live:
+
+live build
+----------
+
+.. sidebar:: docs-clean
+
+ It is recommended to assert a complete rebuild before deploying (use
+ ``docs-clean``).
+
+Live build is like WYSIWYG. If you want to edit the documentation, its
+recommended to use. The Makefile target ``docs-live`` builds the docs, opens
+URL in your favorite browser and rebuilds every time a reST file has been
+changed.
+
+.. code:: sh
+
+ $ make docs-live
+ ...
+ The HTML pages are in dist/docs.
+ ... Serving on http://0.0.0.0:8080
+ ... Start watching changes
+
+
+.. _deploy on github.io:
+
+deploy on github.io
+-------------------
+
+To deploy documentation at :docs:`github.io <.>` use Makefile target
+:ref:`make gh-pages`, which will builds the documentation, clones searx into a sub
+folder ``gh-pages``, cleans it, copies the doc build into and runs all the
+needed git add, commit and push:
+
+.. code:: sh
+
+ $ make docs-clean gh-pages
+ ...
+ SPHINX docs --> file://<...>/dist/docs
+ The HTML pages are in dist/docs.
+ ...
+ Cloning into 'gh-pages' ...
+ ...
+ cd gh-pages; git checkout gh-pages >/dev/null
+ Switched to a new branch 'gh-pages'
+ ...
+ doc available at --> https://asciimoo.github.io/searx
diff --git a/docs/dev/csv_table.txt b/docs/dev/csv_table.txt
new file mode 100644
index 000000000..8a1454137
--- /dev/null
+++ b/docs/dev/csv_table.txt
@@ -0,0 +1,6 @@
+stub col row 1, column, "loremLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
+voluptua."
+stub col row 1, "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita
+kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", column
+stub col row 1, column, column
diff --git a/docs/dev/engine_overview.rst b/docs/dev/engine_overview.rst
new file mode 100644
index 000000000..449c837a9
--- /dev/null
+++ b/docs/dev/engine_overview.rst
@@ -0,0 +1,267 @@
+
+.. _engines-dev:
+
+===============
+Engine overview
+===============
+
+.. _metasearch-engine: https://en.wikipedia.org/wiki/Metasearch_engine
+
+searx is a metasearch-engine_, so it uses different search engines to provide
+better results.
+
+Because there is no general search API which could be used for every search
+engine, an adapter has to be built between searx and the external search
+engines. Adapters are stored under the folder :origin:`searx/engines`.
+
+.. contents::
+ :depth: 3
+ :backlinks: entry
+
+general engine configuration
+============================
+
+It is required to tell searx the type of results the engine provides. The
+arguments can be set in the engine file or in the settings file
+(normally ``settings.yml``). The arguments in the settings file override
+the ones in the engine file.
+
+It does not matter if an option is stored in the engine file or in the
+settings. However, the standard way is the following:
+
+.. _engine file:
+
+engine file
+-----------
+
+======================= =========== ===========================================
+argument type information
+======================= =========== ===========================================
+categories list pages, in which the engine is working
+paging boolean support multible pages
+language_support boolean support language choosing
+time_range_support boolean support search time range
+offline boolean engine runs offline
+======================= =========== ===========================================
+
+.. _engine settings:
+
+settings.yml
+------------
+
+======================= =========== ===========================================
+argument type information
+======================= =========== ===========================================
+name string name of search-engine
+engine string name of searx-engine
+ (filename without ``.py``)
+shortcut string shortcut of search-engine
+timeout string specific timeout for search-engine
+======================= =========== ===========================================
+
+
+overrides
+---------
+
+A few of the options have default values in the engine, but are often
+overwritten by the settings. If ``None`` is assigned to an option in the engine
+file, it has to be redefined in the settings, otherwise searx will not start
+with that engine.
+
+The naming of overrides is arbitrary. But the recommended overrides are the
+following:
+
+======================= =========== ===========================================
+argument type information
+======================= =========== ===========================================
+base_url string base-url, can be overwritten to use same
+ engine on other URL
+number_of_results int maximum number of results per request
+language string ISO code of language and country like en_US
+api_key string api-key if required by engine
+======================= =========== ===========================================
+
+example code
+------------
+
+.. code:: python
+
+ # engine dependent config
+ categories = ['general']
+ paging = True
+ language_support = True
+
+
+making a request
+================
+
+To perform a search an URL have to be specified. In addition to specifying an
+URL, arguments can be passed to the query.
+
+passed arguments
+----------------
+
+These arguments can be used to construct the search query. Furthermore,
+parameters with default value can be redefined for special purposes.
+
+====================== ============ ========================================================================
+argument type default-value, information
+====================== ============ ========================================================================
+url string ``''``
+method string ``'GET'``
+headers set ``{}``
+data set ``{}``
+cookies set ``{}``
+verify boolean ``True``
+headers.User-Agent string a random User-Agent
+category string current category, like ``'general'``
+started datetime current date-time
+pageno int current pagenumber
+language string specific language code like ``'en_US'``, or ``'all'`` if unspecified
+====================== ============ ========================================================================
+
+parsed arguments
+----------------
+
+The function ``def request(query, params):`` always returns the ``params``
+variable. Inside searx, the following paramters can be used to specify a search
+request:
+
+============ =========== =========================================================
+argument type information
+============ =========== =========================================================
+url string requested url
+method string HTTP request method
+headers set HTTP header information
+data set HTTP data information (parsed if ``method != 'GET'``)
+cookies set HTTP cookies
+verify boolean Performing SSL-Validity check
+============ =========== =========================================================
+
+
+example code
+------------
+
+.. code:: python
+
+ # search-url
+ base_url = 'https://example.com/'
+ search_string = 'search?{query}&page={page}'
+
+ # do search-request
+ def request(query, params):
+ search_path = search_string.format(
+ query=urlencode({'q': query}),
+ page=params['pageno'])
+
+ params['url'] = base_url + search_path
+
+ return params
+
+
+returned results
+================
+
+Searx is able to return results of different media-types. Currently the
+following media-types are supported:
+
+- default_
+- images_
+- videos_
+- torrent_
+- map_
+
+To set another media-type as default, the parameter ``template`` must be set to
+the desired type.
+
+default
+-------
+
+========================= =====================================================
+result-parameter information
+========================= =====================================================
+url string, url of the result
+title string, title of the result
+content string, general result-text
+publishedDate :py:class:`datetime.datetime`, time of publish
+========================= =====================================================
+
+images
+------
+
+To use this template, the parameter:
+
+========================= =====================================================
+result-parameter information
+========================= =====================================================
+template is set to ``images.html``
+url string, url to the result site
+title string, title of the result *(partly implemented)*
+content *(partly implemented)*
+publishedDate :py:class:`datetime.datetime`,
+ time of publish *(partly implemented)*
+img\_src string, url to the result image
+thumbnail\_src string, url to a small-preview image
+========================= =====================================================
+
+videos
+------
+
+========================= =====================================================
+result-parameter information
+========================= =====================================================
+template is set to ``videos.html``
+url string, url of the result
+title string, title of the result
+content *(not implemented yet)*
+publishedDate :py:class:`datetime.datetime`, time of publish
+thumbnail string, url to a small-preview image
+========================= =====================================================
+
+torrent
+-------
+
+.. _magnetlink: https://en.wikipedia.org/wiki/Magnet_URI_scheme
+
+========================= =====================================================
+result-parameter information
+========================= =====================================================
+template is set to ``torrent.html``
+url string, url of the result
+title string, title of the result
+content string, general result-text
+publishedDate :py:class:`datetime.datetime`,
+ time of publish *(not implemented yet)*
+seed int, number of seeder
+leech int, number of leecher
+filesize int, size of file in bytes
+files int, number of files
+magnetlink string, magnetlink_ of the result
+torrentfile string, torrentfile of the result
+========================= =====================================================
+
+
+map
+---
+
+========================= =====================================================
+result-parameter information
+========================= =====================================================
+url string, url of the result
+title string, title of the result
+content string, general result-text
+publishedDate :py:class:`datetime.datetime`, time of publish
+latitude latitude of result (in decimal format)
+longitude longitude of result (in decimal format)
+boundingbox boundingbox of result (array of 4. values
+ ``[lat-min, lat-max, lon-min, lon-max]``)
+geojson geojson of result (http://geojson.org)
+osm.type type of osm-object (if OSM-Result)
+osm.id id of osm-object (if OSM-Result)
+address.name name of object
+address.road street name of object
+address.house_number house number of object
+address.locality city, place of object
+address.postcode postcode of object
+address.country country of object
+========================= =====================================================
diff --git a/docs/dev/hello.dot b/docs/dev/hello.dot
new file mode 100644
index 000000000..504621dfc
--- /dev/null
+++ b/docs/dev/hello.dot
@@ -0,0 +1,3 @@
+graph G {
+ Hello -- World
+}
diff --git a/docs/dev/index.rst b/docs/dev/index.rst
new file mode 100644
index 000000000..cb913a82b
--- /dev/null
+++ b/docs/dev/index.rst
@@ -0,0 +1,15 @@
+=======================
+Developer documentation
+=======================
+
+.. toctree::
+ :maxdepth: 1
+
+ quickstart
+ contribution_guide
+ engine_overview
+ search_api
+ plugins
+ translation
+ makefile
+ reST
diff --git a/docs/dev/makefile.rst b/docs/dev/makefile.rst
new file mode 100644
index 000000000..f5957001c
--- /dev/null
+++ b/docs/dev/makefile.rst
@@ -0,0 +1,221 @@
+.. _makefile:
+
+================
+Makefile Targets
+================
+
+.. _gnu-make: https://www.gnu.org/software/make/manual/make.html#Introduction
+
+.. sidebar:: build environment
+
+ Before looking deeper at the targets, first read about :ref:`makefile setup`
+ and :ref:`make pyenv`.
+
+With the aim to simplify development cycles, started with :pull:`1756` a
+``Makefile`` based boilerplate was added. If you are not familiar with
+Makefiles, we recommend to read gnu-make_ introduction.
+
+The usage is simple, just type ``make {target-name}`` to *build* a target.
+Calling the ``help`` target gives a first overview::
+
+ $ make help
+ test - run developer tests
+ docs - build documentation
+ docs-live - autobuild HTML documentation while editing
+ run - run developer instance
+ install - developer install (./local)
+ uninstall - uninstall (./local)
+ gh-pages - build docs & deploy on gh-pages branch
+ clean - drop builds and environments
+ ...
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: entry
+
+
+.. _makefile setup:
+
+Setup
+=====
+
+.. _git stash: https://git-scm.com/docs/git-stash
+
+The main setup is done in the :origin:`Makefile`::
+
+ export GIT_URL=https://github.com/asciimoo/searx
+ export SEARX_URL=https://searx.me
+ export DOCS_URL=https://asciimoo.github.io/searx
+
+.. sidebar:: fork & upstream
+
+ Commit changes in your (local) branch, fork or whatever, but do not push them
+ upstream / `git stash`_ is your friend.
+
+:GIT_URL: Changes this, to point to your searx fork.
+
+:SEARX_URL: Changes this, to point to your searx instance.
+
+:DOCS_URL: If you host your own (branded) documentation, change this URL.
+
+.. _make pyenv:
+
+Python environment
+==================
+
+.. sidebar:: activate environment
+
+ ``source ./local/py3/bin/activate``
+
+With Makefile we do no longer need to build up the virualenv manually (as
+described in the :ref:`devquickstart` guide). Jump into your git working tree
+and release a ``make pyenv``:
+
+.. code:: sh
+
+ $ cd ~/searx-clone
+ $ make pyenv
+ PYENV usage: source ./local/py3/bin/activate
+ ...
+
+With target ``pyenv`` a development environment (aka virtualenv) was build up in
+``./local/py3/``. To make a *developer install* of searx (:origin:`setup.py`)
+into this environment, use make target ``install``:
+
+.. code:: sh
+
+ $ make install
+ PYENV usage: source ./local/py3/bin/activate
+ PYENV using virtualenv from ./local/py3
+ PYENV install .
+
+You have never to think about intermediate targets like ``pyenv`` or
+``install``, the ``Makefile`` chains them as requisites. Just run your main
+target.
+
+.. sidebar:: drop environment
+
+ To get rid of the existing environment before re-build use :ref:`clean target
+ <make clean>` first.
+
+If you think, something goes wrong with your ./local environment or you change
+the :origin:`setup.py` file (or the requirements listed in
+:origin:`requirements-dev.txt` and :origin:`requirements.txt`), you have to call
+:ref:`make clean`.
+
+
+.. _make run:
+
+``make run``
+============
+
+To get up a running a developer instance simply call ``make run``. This enables
+*debug* option in :origin:`searx/settings.yml`, starts a ``./searx/webapp.py``
+instance, disables *debug* option again and opens the URL in your favorite WEB
+browser (:man:`xdg-open`):
+
+.. code:: sh
+
+ $ make run
+ PYENV usage: source ./local/py3/bin/activate
+ PYENV install .
+ ./local/py3/bin/python ./searx/webapp.py
+ ...
+ INFO:werkzeug: * Running on http://127.0.0.1:8888/ (Press CTRL+C to quit)
+ ...
+
+.. _make clean:
+
+``make clean``
+==============
+
+Drop all intermediate files, all builds, but keep sources untouched. Includes
+target ``pyclean`` which drops ./local environment. Before calling ``make
+clean`` stop all processes using :ref:`make pyenv`.
+
+.. code:: sh
+
+ $ make clean
+ CLEAN pyclean
+ CLEAN clean
+
+.. _make docs:
+
+``make docs docs-live docs-clean``
+==================================
+
+We describe the usage of the ``doc*`` targets in the :ref:`How to contribute /
+Documentation <contrib docs>` section. If you want to edit the documentation
+read our :ref:`make docs-live` section. If you are working in your own brand,
+adjust your :ref:`Makefile setup <makefile setup>`.
+
+
+.. _make gh-pages:
+
+``make gh-pages``
+=================
+
+To deploy on github.io first adjust your :ref:`Makefile setup <makefile
+setup>`. For any further read :ref:`deploy on github.io`.
+
+.. _make test:
+
+``make test``
+=============
+
+Runs a series of tests: ``test.pep8``, ``test.unit``, ``test.robot`` and does
+additional :ref:`pylint checks <make pylint>`. You can run tests selective,
+e.g.:
+
+.. code:: sh
+
+ $ make test.pep8 test.unit
+ . ./local/py3/bin/activate; ./manage.sh pep8_check
+ [!] Running pep8 check
+ . ./local/py3/bin/activate; ./manage.sh unit_tests
+ [!] Running unit tests
+
+.. _make pylint:
+
+``make pylint``
+===============
+
+.. _Pylint: https://www.pylint.org/
+
+Before commiting its recommend to do some (more) linting. Pylint_ is known as
+one of the best source-code, bug and quality checker for the Python programming
+language. Pylint_ is not yet a quality gate within our searx project (like
+:ref:`test.pep8 <make test>` it is), but Pylint_ can help to improve code
+quality anyway. The pylint profile we use at searx project is found in
+project's root folder :origin:`.pylintrc`.
+
+Code quality is a ongoing process. Don't try to fix all messages from Pylint,
+run Pylint and check if your changed lines are bringing up new messages. If so,
+fix it. By this, code quality gets incremental better and if there comes the
+day, the linting is balanced out, we might decide to add Pylint as a quality
+gate.
+
+
+``make pybuild``
+================
+
+.. _PyPi: https://pypi.org/
+.. _twine: https://twine.readthedocs.io/en/latest/
+
+Build Python packages in ``./dist/py``.
+
+.. code:: sh
+
+ $ make pybuild
+ ...
+ BUILD pybuild
+ running sdist
+ running egg_info
+ ...
+ $ ls ./dist/py/
+ searx-0.15.0-py3-none-any.whl searx-0.15.0.tar.gz
+
+To upload packages to PyPi_, there is also a ``upload-pypi`` target. It needs
+twine_ to be installed. Since you are not the owner of :pypi:`searx` you will
+never need the latter.
diff --git a/docs/dev/plugins.rst b/docs/dev/plugins.rst
new file mode 100644
index 000000000..2bf44f181
--- /dev/null
+++ b/docs/dev/plugins.rst
@@ -0,0 +1,54 @@
+.. _dev plugin:
+
+=======
+Plugins
+=======
+
+.. sidebar:: Further reading ..
+
+ - :ref:`plugins generic`
+
+Plugins can extend or replace functionality of various components of searx.
+
+Example plugin
+==============
+
+.. code:: python
+
+ name = 'Example plugin'
+ description = 'This plugin extends the suggestions with the word "example"'
+ default_on = False # disabled by default
+
+ js_dependencies = tuple() # optional, list of static js files
+ css_dependencies = tuple() # optional, list of static css files
+
+
+ # attach callback to the post search hook
+ # request: flask request object
+ # ctx: the whole local context of the post search hook
+ def post_search(request, ctx):
+ ctx['search'].suggestions.add('example')
+ return True
+
+Plugin entry points
+===================
+
+Entry points (hooks) define when a plugin runs. Right now only three hooks are
+implemented. So feel free to implement a hook if it fits the behaviour of your
+plugin.
+
+Pre search hook
+---------------
+
+Runs BEFORE the search request. Function to implement: ``pre_search``
+
+Post search hook
+----------------
+
+Runs AFTER the search request. Function to implement: ``post_search``
+
+Result hook
+-----------
+
+Runs when a new result is added to the result list. Function to implement:
+``on_result``
diff --git a/docs/dev/quickstart.rst b/docs/dev/quickstart.rst
new file mode 100644
index 000000000..e40772b3b
--- /dev/null
+++ b/docs/dev/quickstart.rst
@@ -0,0 +1,132 @@
+.. _devquickstart:
+
+======================
+Development Quickstart
+======================
+
+.. sidebar:: :ref:`makefile`
+
+ For additional developer purpose there are :ref:`makefile`.
+
+This quickstart guide gets your environment set up with searx. Furthermore, it
+gives a short introduction to the ``manage.sh`` script.
+
+How to setup your development environment
+=========================================
+
+.. sidebar:: :ref:`make pyenv <make pyenv>`
+
+ Alternatively use the :ref:`make pyenv`.
+
+First, clone the source code of searx to the desired folder. In this case the
+source is cloned to ``~/myprojects/searx``. Then create and activate the
+searx-ve virtualenv and install the required packages using ``manage.sh``.
+
+.. code:: sh
+
+ cd ~/myprojects
+ git clone https://github.com/asciimoo/searx.git
+ cd searx
+ virtualenv searx-ve
+ . ./searx-ve/bin/activate
+ ./manage.sh update_dev_packages
+
+
+How to run tests
+================
+
+.. sidebar:: :ref:`make test.unit <make test>`
+
+ Alternatively use the ``test.pep8``, ``test.unit``, ``test.robot`` targets.
+
+Tests can be run using the ``manage.sh`` script. Following tests and checks are
+available:
+
+- Unit tests
+- Selenium tests
+- PEP8 validation
+- Unit test coverage check
+
+For example unit tests are run with the command below:
+
+.. code:: sh
+
+ ./manage.sh unit_tests
+
+For further test options, please consult the help of the ``manage.sh`` script or
+read :ref:`make test`.
+
+
+How to compile styles and javascript
+====================================
+
+.. _less: http://lesscss.org/
+.. _NodeJS: https://nodejs.org
+
+How to build styles
+-------------------
+
+Less_ is required to build the styles of searx. Less_ can be installed using
+either NodeJS_ or Apt.
+
+.. code:: sh
+
+ sudo -H apt-get install nodejs
+ sudo -H npm install -g less
+
+OR
+
+.. code:: sh
+
+ sudo -H apt-get install node-less
+
+After satisfying the requirements styles can be build using ``manage.sh``
+
+.. code:: sh
+
+ ./manage.sh styles
+
+
+How to build the source of the oscar theme
+==========================================
+
+.. _grunt: https://gruntjs.com/
+
+Grunt_ must be installed in order to build the javascript sources. It depends on
+NodeJS, so first Node has to be installed.
+
+.. code:: sh
+
+ sudo -H apt-get install nodejs
+ sudo -H npm install -g grunt-cli
+
+After installing grunt, the files can be built using the following command:
+
+.. code:: sh
+
+ ./manage.sh grunt_build
+
+
+Tips for debugging/development
+==============================
+
+.. sidebar:: :ref:`make run`
+
+ Makefile target ``run`` already enables debug option for your developer
+ session / see :ref:`make run`.
+
+Turn on debug logging
+ Whether you are working on a new engine or trying to eliminate a bug, it is
+ always a good idea to turn on debug logging. When debug logging is enabled a
+ stack trace appears, instead of the cryptic ``Internal Server Error``
+ message. It can be turned on by setting ``debug: False`` to ``debug: True`` in
+ :origin:`settings.yml <searx/settings.yml>`.
+
+.. sidebar:: :ref:`make test`
+
+ Alternatively use the :ref:`make test` targets.
+
+Run ``./manage.sh tests`` before creating a PR.
+ Failing build on Travis is common because of PEP8 checks. So a new commit
+ must be created containing these format fixes. This phase can be skipped if
+ ``./manage.sh tests`` is run locally before creating a PR.
diff --git a/docs/dev/reST.rst b/docs/dev/reST.rst
new file mode 100644
index 000000000..4dc1279f0
--- /dev/null
+++ b/docs/dev/reST.rst
@@ -0,0 +1,1428 @@
+.. _reST primer:
+
+===========
+reST primer
+===========
+
+.. sidebar:: KISS_ and readability_
+
+ Instead of defining more and more roles, we at searx encourage our
+ contributors to follow principles like KISS_ and readability_.
+
+We at searx are using reStructuredText (aka reST_) markup for all kind of
+documentation, with the builders from the Sphinx_ project a HTML output is
+generated and deployed at :docs:`github.io <.>`. For build prerequisites read
+:ref:`docs build`.
+
+The source files of Searx's documentation are located at :origin:`docs`. Sphinx
+assumes source files to be encoded in UTF-8 by defaul. Run :ref:`make docs-live
+<make docs-live>` to build HTML while editing.
+
+.. sidebar:: Further reading
+
+ - Sphinx-Primer_
+ - `Sphinx markup constructs`_
+ - reST_, docutils_, `docutils FAQ`_
+ - Sphinx_, `sphinx-doc FAQ`_
+ - `sphinx config`_, doctree_
+ - `sphinx cross references`_
+ - linuxdoc_
+ - intersphinx_
+ - sphinx-jinja_
+ - `Sphinx's autodoc`_
+ - `Sphinx's Python domain`_, `Sphinx's C domain`_
+ - SVG_, ImageMagick_
+ - DOT_, `Graphviz's dot`_, Graphviz_
+
+
+.. contents:: Contents
+ :depth: 3
+ :local:
+ :backlinks: entry
+
+Sphinx_ and reST_ have their place in the python ecosystem. Over that reST is
+used in popular projects, e.g the Linux kernel documentation `[kernel doc]`_.
+
+.. _[kernel doc]: https://www.kernel.org/doc/html/latest/doc-guide/sphinx.html
+
+.. sidebar:: Content matters
+
+ The readability_ of the reST sources has its value, therefore we recommend to
+ make sparse usage of reST markup / .. content matters!
+
+**reST** is a plaintext markup language, its markup is *mostly* intuitive and
+you will not need to learn much to produce well formed articles with. I use the
+word *mostly*: like everything in live, reST has its advantages and
+disadvantages, some markups feel a bit grumpy (especially if you are used to
+other plaintext markups).
+
+Soft skills
+===========
+
+Before going any deeper into the markup let's face on some **soft skills** a
+trained author brings with, to reach a well feedback from readers:
+
+- Documentation is dedicated to an audience and answers questions from the
+ audience point of view.
+- Don't detail things which are general knowledge from the audience point of
+ view.
+- Limit the subject, use cross links for any further reading.
+
+To be more concrete what a *point of view* means. In the (:origin:`docs`)
+folder we have three sections (and the *blog* folder), each dedicate to a
+different group of audience.
+
+User's POV: :origin:`docs/user`
+ A typical user knows about search engines and might have heard about
+ meta crawlers and privacy.
+
+Admin's POV: :origin:`docs/admin`
+ A typical Admin knows about setting up services on a linux system, but he does
+ not know all the pros and cons of a searx setup.
+
+Developer's POV: :origin:`docs/dev`
+ Depending on the readability_ of code, a typical developer is able to read and
+ understand source code. Describe what a item aims to do (e.g. a function).
+ If the chronological order matters, describe it. Name the *out-of-limits
+ conditions* and all the side effects a external developer will not know.
+
+.. _reST inline markup:
+
+Basic inline markup
+===================
+
+.. sidebar:: Inline markup
+
+ - :ref:`reST roles`
+ - :ref:`reST smart ref`
+
+Basic inline markup is done with asterisks and backquotes. If asterisks or
+backquotes appear in running text and could be confused with inline markup
+delimiters, they have to be escaped with a backslash (``\*pointer``).
+
+.. table:: basic inline markup
+ :widths: 4 3 7
+
+ ================================================ ==================== ========================
+ description rendered markup
+ ================================================ ==================== ========================
+ one asterisk for emphasis *italics* ``*italics*``
+ two asterisks for strong emphasis **boldface** ``**boldface**``
+ backquotes for code samples and literals ``foo()`` ````foo()````
+ quote asterisks or backquotes \*foo is a pointer ``\*foo is a pointer``
+ ================================================ ==================== ========================
+
+.. _reST basic structure:
+
+Basic article structure
+=======================
+
+The basic structure of an article makes use of heading adornments to markup
+chapter, sections and subsections.
+
+.. _reST template:
+
+reST template
+-------------
+
+reST template for an simple article:
+
+.. code:: reST
+
+ .. _doc refname:
+
+ ==============
+ Document title
+ ==============
+
+ Lorem ipsum dolor sit amet, consectetur adipisici elit .. Further read
+ :ref:`chapter refname`.
+
+ .. _chapter refname:
+
+ Chapter
+ =======
+
+ Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
+ aliquid ex ea commodi consequat ...
+
+ .. _section refname:
+
+ Section
+ -------
+
+ lorem ..
+
+ .. _subsection refname:
+
+ Subsection
+ ~~~~~~~~~~
+
+ lorem ..
+
+
+Headings
+--------
+
+#. title - with overline for document title:
+
+ .. code:: reST
+
+ ==============
+ Document title
+ ==============
+
+
+#. chapter - with anchor named ``anchor name``:
+
+ .. code:: reST
+
+ .. _anchor name:
+
+ Chapter
+ =======
+
+#. section
+
+ .. code:: reST
+
+ Section
+ -------
+
+#. subsection
+
+ .. code:: reST
+
+ Subsection
+ ~~~~~~~~~~
+
+
+
+Anchors & Links
+===============
+
+.. _reST anchor:
+
+Anchors
+-------
+
+.. _ref role:
+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-ref
+
+To refer a point in the documentation a anchor is needed. The :ref:`reST
+template <reST template>` shows an example where a chapter titled *"Chapters"*
+gets an anchor named ``chapter title``. Another example from *this* document,
+where the anchor named ``reST anchor``:
+
+.. code:: reST
+
+ .. _reST anchor:
+
+ Anchors
+ -------
+
+ To refer a point in the documentation a anchor is needed ...
+
+To refer anchors use the `ref role`_ markup:
+
+.. code:: reST
+
+ Visit chapter :ref:`reST anchor`. Or set hyperlink text manualy :ref:`foo
+ bar <reST anchor>`.
+
+.. admonition:: ``:ref:`` role
+ :class: rst-example
+
+ Visist chapter :ref:`reST anchor`. Or set hyperlink text manualy :ref:`foo
+ bar <reST anchor>`.
+
+.. _reST ordinary ref:
+
+Link ordinary URL
+-----------------
+
+If you need to reference external URLs use *named* hyperlinks to maintain
+readability of reST sources. Here is a example taken from *this* article:
+
+.. code:: reST
+
+ .. _Sphinx Field Lists:
+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html
+
+ With the *named* hyperlink `Sphinx Field Lists`_, the raw text is much more
+ readable.
+
+ And this shows the alternative (less readable) hyperlink markup `Sphinx Field
+ Lists
+ <https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html>`__.
+
+.. admonition:: Named hyperlink
+ :class: rst-example
+
+ With the *named* hyperlink `Sphinx Field Lists`_, the raw text is much more
+ readable.
+
+ And this shows the alternative (less readable) hyperlink markup `Sphinx Field
+ Lists
+ <https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html>`__.
+
+
+.. _reST smart ref:
+
+Smart refs
+----------
+
+With the power of sphinx.ext.extlinks_ and intersphinx_ referencing external
+content becomes smart.
+
+.. table:: smart refs with sphinx.ext.extlinks_ and intersphinx_
+ :widths: 4 3 7
+
+ ========================== ================================== ====================================
+ refer ... rendered example markup
+ ========================== ================================== ====================================
+ :rst:role:`rfc` :rfc:`822` ``:rfc:`822```
+ :rst:role:`pep` :pep:`8` ``:pep:`8```
+ sphinx.ext.extlinks_
+ --------------------------------------------------------------------------------------------------
+ project's wiki article :wiki:`Searx-instances` ``:wiki:`Searx-instances```
+ to docs public URL :docs:`dev/reST.html` ``:docs:`dev/reST.html```
+ files & folders origin :origin:`docs/dev/reST.rst` ``:origin:`docs/dev/reST.rst```
+ pull request :pull:`1756` ``:pull:`1756```
+ patch :patch:`af2cae6` ``:patch:`af2cae6```
+ PyPi package :pypi:`searx` ``:pypi:`searx```
+ manual page man :man:`bash` ``:man:`bash```
+ intersphinx_
+ --------------------------------------------------------------------------------------------------
+ external anchor :ref:`python:and` ``:ref:`python:and```
+ external doc anchor :doc:`jinja:templates` ``:doc:`jinja:templates```
+ python code object :py:obj:`datetime.datetime` ``:py:obj:`datetime.datetime```
+ flask code object :py:obj:`flask.Flask` ``:py:obj:`flask.Flask```
+ ========================== ================================== ====================================
+
+
+Intersphinx is configured in :origin:`docs/conf.py`:
+
+.. code:: python
+
+ intersphinx_mapping = {
+ "python": ("https://docs.python.org/3/", None),
+ "flask": ("https://flask.palletsprojects.com/", None),
+ "jinja": ("https://jinja.palletsprojects.com/", None),
+ "linuxdoc" : ("https://return42.github.io/linuxdoc/", None),
+ "sphinx" : ("https://www.sphinx-doc.org/en/master/", None),
+ }
+
+
+To list all anchors of the inventory (e.g. ``python``) use:
+
+.. code:: sh
+
+ $ python -m sphinx.ext.intersphinx https://docs.python.org/3/objects.inv
+
+Literal blocks
+==============
+
+The simplest form of :duref:`literal-blocks` is a indented block introduced by
+two colons (``::``). For highlighting use :dudir:`highlight` or :ref:`reST
+code` directive. To include literals from external files use directive
+:dudir:`literalinclude`.
+
+.. _reST literal:
+
+``::``
+------
+
+.. code:: reST
+
+ ::
+
+ Literal block
+
+ Lorem ipsum dolor::
+
+ Literal block
+
+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+ eirmod tempor invidunt ut labore ::
+
+ Literal block
+
+.. admonition:: Literal block
+ :class: rst-example
+
+ ::
+
+ Literal block
+
+ Lorem ipsum dolor::
+
+ Literal block
+
+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+ eirmod tempor invidunt ut labore ::
+
+ Literal block
+
+
+.. _reST code:
+
+``code-block``
+--------------
+
+.. _pygments: https://pygments.org/languages/
+
+.. sidebar:: Syntax highlighting
+
+ is handled by pygments_.
+
+The :rst:dir:`code-block` directive is a variant of the :dudir:`code` directive
+with additional options. To learn more about code literals visit
+:ref:`sphinx:code-examples`.
+
+.. code-block:: reST
+
+ The URL ``/stats`` handle is shown in :ref:`stats-handle`
+
+ .. code-block:: Python
+ :caption: python code block
+ :name: stats-handle
+
+ @app.route('/stats', methods=['GET'])
+ def stats():
+ """Render engine statistics page."""
+ stats = get_engines_stats()
+ return render(
+ 'stats.html'
+ , stats = stats )
+
+.. code-block:: reST
+
+.. admonition:: Code block
+ :class: rst-example
+
+ The URL ``/stats`` handle is shown in :ref:`stats-handle`
+
+ .. code-block:: Python
+ :caption: python code block
+ :name: stats-handle
+
+ @app.route('/stats', methods=['GET'])
+ def stats():
+ """Render engine statistics page."""
+ stats = get_engines_stats()
+ return render(
+ 'stats.html'
+ , stats = stats )
+
+Unicode substitution
+====================
+
+The :dudir:`unicode directive <unicode-character-codes>` converts Unicode
+character codes (numerical values) to characters. This directive can only be
+used within a substitution definition.
+
+.. code-block:: reST
+
+ .. |copy| unicode:: 0xA9 .. copyright sign
+ .. |(TM)| unicode:: U+2122
+
+ Trademark |(TM)| and copyright |copy| glyphs.
+
+.. admonition:: Unicode
+ :class: rst-example
+
+ .. |copy| unicode:: 0xA9 .. copyright sign
+ .. |(TM)| unicode:: U+2122
+
+ Trademark |(TM)| and copyright |copy| glyphs.
+
+
+.. _reST roles:
+
+Roles
+=====
+
+.. sidebar:: Further reading
+
+ - `Sphinx Roles`_
+ - :doc:`sphinx:usage/restructuredtext/domains`
+
+
+A *custom interpreted text role* (:duref:`ref <roles>`) is an inline piece of
+explicit markup. It signifies that that the enclosed text should be interpreted
+in a specific way.
+
+The general markup is one of:
+
+.. code:: reST
+
+ :rolename:`ref-name`
+ :rolename:`ref text <ref-name>`
+
+.. table:: smart refs with sphinx.ext.extlinks_ and intersphinx_
+ :widths: 4 3 7
+
+ ========================== ================================== ====================================
+ role rendered example markup
+ ========================== ================================== ====================================
+ :rst:role:`guilabel` :guilabel:`&Cancel` ``:guilabel:`&Cancel```
+ :rst:role:`kbd` :kbd:`C-x C-f` ``:kbd:`C-x C-f```
+ :rst:role:`menuselection` :menuselection:`Open --> File` ``:menuselection:`Open --> File```
+ :rst:role:`download` :download:`this file <reST.rst>` ``:download:`this file <reST.rst>```
+ math_ :math:`a^2 + b^2 = c^2` ``:math:`a^2 + b^2 = c^2```
+ :rst:role:`ref` :ref:`svg image example` ``:ref:`svg image example```
+ :rst:role:`command` :command:`ls -la` ``:command:`ls -la```
+ :durole:`emphasis` :emphasis:`italic` ``:emphasis:`italic```
+ :durole:`strong` :strong:`bold` ``:strong:`bold```
+ :durole:`literal` :literal:`foo()` ``:literal:`foo()```
+ :durole:`subscript` H\ :sub:`2`\ O ``H\ :sub:`2`\ O``
+ :durole:`superscript` E = mc\ :sup:`2` ``E = mc\ :sup:`2```
+ :durole:`title-reference` :title:`Time` ``:title:`Time```
+ ========================== ================================== ====================================
+
+Figures & Images
+================
+
+.. sidebar:: Image processing
+
+ With the directives from :ref:`linuxdoc <linuxdoc:kfigure>` the build process
+ is flexible. To get best results in the generated output format, install
+ ImageMagick_ and Graphviz_.
+
+Searx's sphinx setup includes: :ref:`linuxdoc:kfigure`. Scaleable here means;
+scaleable in sense of the build process. Normally in absence of a converter
+tool, the build process will break. From the authors POV it’s annoying to care
+about the build process when handling with images, especially since he has no
+access to the build process. With :ref:`linuxdoc:kfigure` the build process
+continues and scales output quality in dependence of installed image processors.
+
+If you want to add an image, you should use the ``kernel-figure`` (inheritance
+of :dudir:`figure`) and ``kernel-image`` (inheritance of :dudir:`image`)
+directives. E.g. to insert a figure with a scaleable image format use SVG
+(:ref:`svg image example`):
+
+.. code:: reST
+
+ .. _svg image example:
+
+ .. kernel-figure:: svg_image.svg
+ :alt: SVG image example
+
+ Simple SVG image
+
+ To refer the figure, a caption block is needed: :ref:`svg image example`.
+
+.. _svg image example:
+
+.. kernel-figure:: svg_image.svg
+ :alt: SVG image example
+
+ Simple SVG image.
+
+To refer the figure, a caption block is needed: :ref:`svg image example`.
+
+DOT files (aka Graphviz)
+------------------------
+
+With :ref:`linuxdoc:kernel-figure` reST support for **DOT** formatted files is
+given.
+
+- `Graphviz's dot`_
+- DOT_
+- Graphviz_
+
+A simple example is shown in :ref:`dot file example`:
+
+.. code:: reST
+
+ .. _dot file example:
+
+ .. kernel-figure:: hello.dot
+ :alt: hello world
+
+ DOT's hello world example
+
+.. admonition:: hello.dot
+ :class: rst-example
+
+ .. _dot file example:
+
+ .. kernel-figure:: hello.dot
+ :alt: hello world
+
+ DOT's hello world example
+
+``kernel-render`` DOT
+---------------------
+
+Embed *render* markups (or languages) like Graphviz's **DOT** is provided by the
+:ref:`linuxdoc:kernel-render` directive. A simple example of embedded DOT_ is
+shown in figure :ref:`dot render example`:
+
+.. code:: reST
+
+ .. _dot render example:
+
+ .. kernel-render:: DOT
+ :alt: digraph
+ :caption: Embedded DOT (Graphviz) code
+
+ digraph foo {
+ "bar" -> "baz";
+ }
+
+ Attribute ``caption`` is needed, if you want to refer the figure: :ref:`dot
+ render example`.
+
+Please note :ref:`build tools <linuxdoc:kfigure_build_tools>`. If Graphviz_ is
+installed, you will see an vector image. If not, the raw markup is inserted as
+*literal-block*.
+
+.. admonition:: kernel-render DOT
+ :class: rst-example
+
+ .. _dot render example:
+
+ .. kernel-render:: DOT
+ :alt: digraph
+ :caption: Embedded DOT (Graphviz) code
+
+ digraph foo {
+ "bar" -> "baz";
+ }
+
+ Attribute ``caption`` is needed, if you want to refer the figure: :ref:`dot
+ render example`.
+
+``kernel-render`` SVG
+---------------------
+
+A simple example of embedded SVG_ is shown in figure :ref:`svg render example`:
+
+.. code:: reST
+
+ .. _svg render example:
+
+ .. kernel-render:: SVG
+ :caption: Embedded **SVG** markup
+ :alt: so-nw-arrow
+..
+
+ .. code:: xml
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
+ baseProfile="full" width="70px" height="40px"
+ viewBox="0 0 700 400"
+ >
+ <line x1="180" y1="370"
+ x2="500" y2="50"
+ stroke="black" stroke-width="15px"
+ />
+ <polygon points="585 0 525 25 585 50"
+ transform="rotate(135 525 25)"
+ />
+ </svg>
+
+.. admonition:: kernel-render SVG
+ :class: rst-example
+
+ .. _svg render example:
+
+ .. kernel-render:: SVG
+ :caption: Embedded **SVG** markup
+ :alt: so-nw-arrow
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
+ baseProfile="full" width="70px" height="40px"
+ viewBox="0 0 700 400"
+ >
+ <line x1="180" y1="370"
+ x2="500" y2="50"
+ stroke="black" stroke-width="15px"
+ />
+ <polygon points="585 0 525 25 585 50"
+ transform="rotate(135 525 25)"
+ />
+ </svg>
+
+
+
+
+.. _reST lists:
+
+List markups
+============
+
+Bullet list
+-----------
+
+List markup (:duref:`ref <bullet-lists>`) is simple:
+
+.. code:: reST
+
+ - This is a bulleted list.
+
+ 1. Nested lists are possible, but be aware that they must be separated from
+ the parent list items by blank line
+ 2. Second item of nested list
+
+ - It has two items, the second
+ item uses two lines.
+
+ #. This is a numbered list.
+ #. It has two items too.
+
+.. admonition:: bullet list
+ :class: rst-example
+
+ - This is a bulleted list.
+
+ 1. Nested lists are possible, but be aware that they must be separated from
+ the parent list items by blank line
+ 2. Second item of nested list
+
+ - It has two items, the second
+ item uses two lines.
+
+ #. This is a numbered list.
+ #. It has two items too.
+
+
+Horizontal list
+---------------
+
+The :rst:dir:`.. hlist:: <hlist>` transforms a bullet list into a more compact
+list.
+
+.. code:: reST
+
+ .. hlist::
+
+ - first list item
+ - second list item
+ - third list item
+ ...
+
+.. admonition:: hlist
+ :class: rst-example
+
+ .. hlist::
+
+ - first list item
+ - second list item
+ - third list item
+ - next list item
+ - next list item xxxx
+ - next list item yyyy
+ - next list item zzzz
+
+
+Definition list
+---------------
+
+.. sidebar:: Note ..
+
+ - the term cannot have more than one line of text
+
+ - there is **no blank line between term and definition block** // this
+ distinguishes definition lists (:duref:`ref <definition-lists>`) from block
+ quotes (:duref:`ref <block-quotes>`).
+
+Each definition list (:duref:`ref <definition-lists>`) item contains a term,
+optional classifiers and a definition. A term is a simple one-line word or
+phrase. Optional classifiers may follow the term on the same line, each after
+an inline ' : ' (**space, colon, space**). A definition is a block indented
+relative to the term, and may contain multiple paragraphs and other body
+elements. There may be no blank line between a term line and a definition block
+(*this distinguishes definition lists from block quotes*). Blank lines are
+required before the first and after the last definition list item, but are
+optional in-between.
+
+Definition lists are created as follows:
+
+.. code:: reST
+
+ term 1 (up to a line of text)
+ Definition 1.
+
+ See the typo : this line is not a term!
+
+ And this is not term's definition. **There is a blank line** in between
+ the line above and this paragraph. That's why this paragraph is taken as
+ **block quote** (:duref:`ref <block-quotes>`) and not as term's definition!
+
+ term 2
+ Definition 2, paragraph 1.
+
+ Definition 2, paragraph 2.
+
+ term 3 : classifier
+ Definition 3.
+
+ term 4 : classifier one : classifier two
+ Definition 4.
+
+.. admonition:: definition list
+ :class: rst-example
+
+ term 1 (up to a line of text)
+ Definition 1.
+
+ See the typo : this line is not a term!
+
+ And this is not term's definition. **There is a blank line** in between
+ the line above and this paragraph. That's why this paragraph is taken as
+ **block quote** (:duref:`ref <block-quotes>`) and not as term's definition!
+
+
+ term 2
+ Definition 2, paragraph 1.
+
+ Definition 2, paragraph 2.
+
+ term 3 : classifier
+ Definition 3.
+
+ term 4 : classifier one : classifier two
+
+
+Quoted paragraphs
+-----------------
+
+Quoted paragraphs (:duref:`ref <block-quotes>`) are created by just indenting
+them more than the surrounding paragraphs. Line blocks (:duref:`ref
+<line-blocks>`) are a way of preserving line breaks:
+
+.. code:: reST
+
+ normal paragraph ...
+ lorem ipsum.
+
+ Quoted paragraph ...
+ lorem ipsum.
+
+ | These lines are
+ | broken exactly like in
+ | the source file.
+
+
+.. admonition:: Quoted paragraph and line block
+ :class: rst-example
+
+ normal paragraph ...
+ lorem ipsum.
+
+ Quoted paragraph ...
+ lorem ipsum.
+
+ | These lines are
+ | broken exactly like in
+ | the source file.
+
+
+.. _reST field list:
+
+Field Lists
+-----------
+
+.. _Sphinx Field Lists:
+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html
+
+.. sidebar:: bibliographic fields
+
+ First lines fields are bibliographic fields, see `Sphinx Field Lists`_.
+
+Field lists are used as part of an extension syntax, such as options for
+directives, or database-like records meant for further processing. Field lists
+are mappings from field names to field bodies. They marked up like this:
+
+.. code:: reST
+
+ :fieldname: Field content
+ :foo: first paragraph in field foo
+
+ second paragraph in field foo
+
+ :bar: Field content
+
+.. admonition:: Field List
+ :class: rst-example
+
+ :fieldname: Field content
+ :foo: first paragraph in field foo
+
+ second paragraph in field foo
+
+ :bar: Field content
+
+
+They are commonly used in Python documentation:
+
+.. code:: python
+
+ def my_function(my_arg, my_other_arg):
+ """A function just for me.
+
+ :param my_arg: The first of my arguments.
+ :param my_other_arg: The second of my arguments.
+
+ :returns: A message (just for me, of course).
+ """
+
+Further list blocks
+-------------------
+
+- field lists (:duref:`ref <field-lists>`, with caveats noted in
+ :ref:`reST field list`)
+- option lists (:duref:`ref <option-lists>`)
+- quoted literal blocks (:duref:`ref <quoted-literal-blocks>`)
+- doctest blocks (:duref:`ref <doctest-blocks>`)
+
+
+Admonitions
+===========
+
+Sidebar
+-------
+
+Sidebar is an eye catcher, often used for admonitions pointing further stuff or
+site effects. Here is the source of the sidebar :ref:`on top of this page <reST
+primer>`.
+
+.. code:: reST
+
+ .. sidebar:: KISS_ and readability_
+
+ Instead of defining more and more roles, we at searx encourage our
+ contributors to follow principles like KISS_ and readability_.
+
+Generic admonition
+------------------
+
+The generic :dudir:`admonition <admonitions>` needs a title:
+
+.. code:: reST
+
+ .. admonition:: generic admonition title
+
+ lorem ipsum ..
+
+
+.. admonition:: generic admonition title
+
+ lorem ipsum ..
+
+
+Specific admonitions
+--------------------
+
+Specific admonitions: :dudir:`hint`, :dudir:`note`, :dudir:`tip` :dudir:`attention`,
+:dudir:`caution`, :dudir:`danger`, :dudir:`error`, , :dudir:`important`, and
+:dudir:`warning` .
+
+.. code:: reST
+
+ .. hint::
+
+ lorem ipsum ..
+
+ .. note::
+
+ lorem ipsum ..
+
+ .. warning::
+
+ lorem ipsum ..
+
+
+.. hint::
+
+ lorem ipsum ..
+
+.. note::
+
+ lorem ipsum ..
+
+.. tip::
+
+ lorem ipsum ..
+
+.. attention::
+
+ lorem ipsum ..
+
+.. caution::
+
+ lorem ipsum ..
+
+.. danger::
+
+ lorem ipsum ..
+
+.. important::
+
+ lorem ipsum ..
+
+.. error::
+
+ lorem ipsum ..
+
+.. warning::
+
+ lorem ipsum ..
+
+
+Tables
+======
+
+.. sidebar:: Nested tables
+
+ Nested tables are ugly! Not all builder support nested tables, don't use
+ them!
+
+ASCII-art tables like :ref:`reST simple table` and :ref:`reST grid table` might
+be comfortable for readers of the text-files, but they have huge disadvantages
+in the creation and modifying. First, they are hard to edit. Think about
+adding a row or a column to a ASCII-art table or adding a paragraph in a cell,
+it is a nightmare on big tables.
+
+
+.. sidebar:: List tables
+
+ For meaningful patch and diff use :ref:`reST flat table`.
+
+Second the diff of modifying ASCII-art tables is not meaningful, e.g. widening a
+cell generates a diff in which also changes are included, which are only
+ascribable to the ASCII-art. Anyway, if you prefer ASCII-art for any reason,
+here are some helpers:
+
+* `Emacs Table Mode`_
+* `Online Tables Generator`_
+
+.. _reST simple table:
+
+Simple tables
+-------------
+
+:duref:`Simple tables <simple-tables>` allow *colspan* but not *rowspan*. If
+your table need some metadata (e.g. a title) you need to add the ``.. table::
+directive`` :dudir:`(ref) <table>` in front and place the table in its body:
+
+.. code:: reST
+
+ .. table:: foo gate truth table
+ :widths: grid
+ :align: left
+
+ ====== ====== ======
+ Inputs Output
+ ------------- ------
+ A B A or B
+ ====== ====== ======
+ False
+ --------------------
+ True
+ --------------------
+ True False True
+ (foo)
+ ------ ------ ------
+ False True
+ (foo)
+ ====== =============
+
+.. admonition:: Simple ASCII table
+ :class: rst-example
+
+ .. table:: foo gate truth table
+ :widths: grid
+ :align: left
+
+ ====== ====== ======
+ Inputs Output
+ ------------- ------
+ A B A or B
+ ====== ====== ======
+ False
+ --------------------
+ True
+ --------------------
+ True False True
+ (foo)
+ ------ ------ ------
+ False True
+ (foo)
+ ====== =============
+
+
+
+.. _reST grid table:
+
+Grid tables
+-----------
+
+:duref:`Grid tables <grid-tables>` allow colspan *colspan* and *rowspan*:
+
+.. code:: reST
+
+ .. table:: grid table example
+ :widths: 1 1 5
+
+ +------------+------------+-----------+
+ | Header 1 | Header 2 | Header 3 |
+ +============+============+===========+
+ | body row 1 | column 2 | column 3 |
+ +------------+------------+-----------+
+ | body row 2 | Cells may span columns.|
+ +------------+------------+-----------+
+ | body row 3 | Cells may | - Cells |
+ +------------+ span rows. | - contain |
+ | body row 4 | | - blocks. |
+ +------------+------------+-----------+
+
+.. admonition:: ASCII grid table
+ :class: rst-example
+
+ .. table:: grid table example
+ :widths: 1 1 5
+
+ +------------+------------+-----------+
+ | Header 1 | Header 2 | Header 3 |
+ +============+============+===========+
+ | body row 1 | column 2 | column 3 |
+ +------------+------------+-----------+
+ | body row 2 | Cells may span columns.|
+ +------------+------------+-----------+
+ | body row 3 | Cells may | - Cells |
+ +------------+ span rows. | - contain |
+ | body row 4 | | - blocks. |
+ +------------+------------+-----------+
+
+
+.. _reST flat table:
+
+flat-table
+----------
+
+The ``flat-table`` is a further developed variant of the :ref:`list tables
+<linuxdoc:list-table-directives>`. It is a double-stage list similar to the
+:dudir:`list-table` with some additional features:
+
+column-span: ``cspan``
+ with the role ``cspan`` a cell can be extended through additional columns
+
+row-span: ``rspan``
+ with the role ``rspan`` a cell can be extended through additional rows
+
+auto-span:
+ spans rightmost cell of a table row over the missing cells on the right side
+ of that table-row. With Option ``:fill-cells:`` this behavior can changed
+ from *auto span* to *auto fill*, which automatically inserts (empty) cells
+ instead of spanning the last cell.
+
+options:
+ :header-rows: [int] count of header rows
+ :stub-columns: [int] count of stub columns
+ :widths: [[int] [int] ... ] widths of columns
+ :fill-cells: instead of auto-span missing cells, insert missing cells
+
+roles:
+ :cspan: [int] additional columns (*morecols*)
+ :rspan: [int] additional rows (*morerows*)
+
+The example below shows how to use this markup. The first level of the staged
+list is the *table-row*. In the *table-row* there is only one markup allowed,
+the list of the cells in this *table-row*. Exception are *comments* ( ``..`` )
+and *targets* (e.g. a ref to :ref:`row 2 of table's body <row body 2>`).
+
+.. code:: reST
+
+ .. flat-table:: ``flat-table`` example
+ :header-rows: 2
+ :stub-columns: 1
+ :widths: 1 1 1 1 2
+
+ * - :rspan:`1` head / stub
+ - :cspan:`3` head 1.1-4
+
+ * - head 2.1
+ - head 2.2
+ - head 2.3
+ - head 2.4
+
+ * .. row body 1 / this is a comment
+
+ - row 1
+ - :rspan:`2` cell 1-3.1
+ - cell 1.2
+ - cell 1.3
+ - cell 1.4
+
+ * .. Comments and targets are allowed on *table-row* stage.
+ .. _`row body 2`:
+
+ - row 2
+ - cell 2.2
+ - :rspan:`1` :cspan:`1`
+ cell 2.3 with a span over
+
+ * col 3-4 &
+ * row 2-3
+
+ * - row 3
+ - cell 3.2
+
+ * - row 4
+ - cell 4.1
+ - cell 4.2
+ - cell 4.3
+ - cell 4.4
+
+ * - row 5
+ - cell 5.1 with automatic span to rigth end
+
+ * - row 6
+ - cell 6.1
+ - ..
+
+
+.. admonition:: List table
+ :class: rst-example
+
+ .. flat-table:: ``flat-table`` example
+ :header-rows: 2
+ :stub-columns: 1
+ :widths: 1 1 1 1 2
+
+ * - :rspan:`1` head / stub
+ - :cspan:`3` head 1.1-4
+
+ * - head 2.1
+ - head 2.2
+ - head 2.3
+ - head 2.4
+
+ * .. row body 1 / this is a comment
+
+ - row 1
+ - :rspan:`2` cell 1-3.1
+ - cell 1.2
+ - cell 1.3
+ - cell 1.4
+
+ * .. Comments and targets are allowed on *table-row* stage.
+ .. _`row body 2`:
+
+ - row 2
+ - cell 2.2
+ - :rspan:`1` :cspan:`1`
+ cell 2.3 with a span over
+
+ * col 3-4 &
+ * row 2-3
+
+ * - row 3
+ - cell 3.2
+
+ * - row 4
+ - cell 4.1
+ - cell 4.2
+ - cell 4.3
+ - cell 4.4
+
+ * - row 5
+ - cell 5.1 with automatic span to rigth end
+
+ * - row 6
+ - cell 6.1
+ - ..
+
+
+CSV table
+---------
+
+CSV table might be the choice if you want to include CSV-data from a outstanding
+(build) process into your documentation.
+
+.. code:: reST
+
+ .. csv-table:: CSV table example
+ :header: .. , Column 1, Column 2
+ :widths: 2 5 5
+ :stub-columns: 1
+ :file: csv_table.txt
+
+Content of file ``csv_table.txt``:
+
+.. literalinclude:: csv_table.txt
+
+.. admonition:: CSV table
+ :class: rst-example
+
+ .. csv-table:: CSV table example
+ :header: .. , Column 1, Column 2
+ :widths: 3 5 5
+ :stub-columns: 1
+ :file: csv_table.txt
+
+Templating
+==========
+
+.. sidebar:: Build environment
+
+ All *generic-doc* tasks are running in the :ref:`build environment <make
+ pyenv>`.
+
+Templating is suitable for documentation which is created generic at the build
+time. The sphinx-jinja_ extension evaluates jinja_ templates in the :ref:`build
+environment <make pyenv>` (with searx modules installed). We use this e.g. to
+build chapter: :ref:`engines generic`. Below the jinja directive from the
+:origin:`docs/admin/engines.rst` is shown:
+
+.. literalinclude:: ../admin/engines.rst
+ :language: reST
+ :start-after: .. _configured engines:
+
+The context for the template is selected in the line ``.. jinja:: webapp``. In
+sphinx's build configuration (:origin:`docs/conf.py`) the ``webapp`` context
+points to the name space of the python module: ``webapp``.
+
+.. code:: py
+
+ from searx import webapp
+ jinja_contexts = {
+ 'webapp': dict(**webapp.__dict__)
+ }
+
+
+Tabbed views
+============
+
+.. _sphinx-tabs: https://github.com/djungelorm/sphinx-tabs
+.. _basic-tabs: https://github.com/djungelorm/sphinx-tabs#basic-tabs
+.. _group-tabs: https://github.com/djungelorm/sphinx-tabs#group-tabs
+.. _code-tabs: https://github.com/djungelorm/sphinx-tabs#code-tabs
+
+With `sphinx-tabs`_ extension we have *tabbed views*. To provide installation
+instructions with one tab per distribution we use the `group-tabs`_ directive,
+others are basic-tabs_ and code-tabs_. Below a *group-tab* example from
+:ref:`docs build` is shown:
+
+.. literalinclude:: ../admin/buildhosts.rst
+ :language: reST
+ :start-after: .. _system requirements:
+ :end-before: .. _system requirements END:
+
+
+.. _math:
+
+Math equations
+==============
+
+.. _Mathematics: https://en.wikibooks.org/wiki/LaTeX/Mathematics
+.. _amsmath user guide:
+ http://vesta.informatik.rwth-aachen.de/ftp/pub/mirror/ctan/macros/latex/required/amsmath/amsldoc.pdf
+
+.. sidebar:: About LaTeX
+
+ - `amsmath user guide`_
+ - Mathematics_
+ - :ref:`docs build`
+
+The input language for mathematics is LaTeX markup using the :ctan:`amsmath`
+package.
+
+To embed LaTeX markup in reST documents, use role :rst:role:`:math: <math>` for
+inline and directive :rst:dir:`.. math:: <math>` for block markup.
+
+.. code:: reST
+
+ In :math:numref:`schroedinger general` the time-dependent Schrödinger equation
+ is shown.
+
+ .. math::
+ :label: schroedinger general
+
+ \mathrm{i}\hbar\dfrac{\partial}{\partial t} |\,\psi (t) \rangle =
+ \hat{H} |\,\psi (t) \rangle.
+
+.. admonition:: LaTeX math equation
+ :class: rst-example
+
+ In :math:numref:`schroedinger general` the time-dependent Schrödinger equation
+ is shown.
+
+ .. math::
+ :label: schroedinger general
+
+ \mathrm{i}\hbar\dfrac{\partial}{\partial t} |\,\psi (t) \rangle =
+ \hat{H} |\,\psi (t) \rangle.
+
+
+The next example shows the difference of ``\tfrac`` (*textstyle*) and ``\dfrac``
+(*displaystyle*) used in a inline markup or another fraction.
+
+.. code:: reST
+
+ ``\tfrac`` **inline example** :math:`\tfrac{\tfrac{1}{x}+\tfrac{1}{y}}{y-z}`
+ ``\dfrac`` **inline example** :math:`\dfrac{\dfrac{1}{x}+\dfrac{1}{y}}{y-z}`
+
+.. admonition:: Line spacing
+ :class: rst-example
+
+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+ eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
+ voluptua. ...
+ ``\tfrac`` **inline example** :math:`\tfrac{\tfrac{1}{x}+\tfrac{1}{y}}{y-z}`
+ At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
+ gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
+
+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+ eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
+ voluptua. ...
+ ``\tfrac`` **inline example** :math:`\dfrac{\dfrac{1}{x}+\dfrac{1}{y}}{y-z}`
+ At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
+ gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
+
+
+.. _KISS: https://en.wikipedia.org/wiki/KISS_principle
+
+.. _readability: https://docs.python-guide.org/writing/style/
+.. _Sphinx-Primer:
+ http://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html
+.. _reST: https://docutils.sourceforge.io/rst.html
+.. _Sphinx Roles:
+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html
+.. _Sphinx: http://www.sphinx-doc.org
+.. _`sphinx-doc FAQ`: http://www.sphinx-doc.org/en/stable/faq.html
+.. _Sphinx markup constructs:
+ http://www.sphinx-doc.org/en/stable/markup/index.html
+.. _`sphinx cross references`:
+ http://www.sphinx-doc.org/en/stable/markup/inline.html#cross-referencing-arbitrary-locations
+.. _sphinx.ext.extlinks:
+ https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html
+.. _intersphinx: http://www.sphinx-doc.org/en/stable/ext/intersphinx.html
+.. _sphinx config: http://www.sphinx-doc.org/en/stable/config.html
+.. _Sphinx's autodoc: http://www.sphinx-doc.org/en/stable/ext/autodoc.html
+.. _Sphinx's Python domain:
+ http://www.sphinx-doc.org/en/stable/domains.html#the-python-domain
+.. _Sphinx's C domain:
+ http://www.sphinx-doc.org/en/stable/domains.html#cross-referencing-c-constructs
+.. _doctree:
+ http://www.sphinx-doc.org/en/master/extdev/tutorial.html?highlight=doctree#build-phases
+.. _docutils: http://docutils.sourceforge.net/docs/index.html
+.. _docutils FAQ: http://docutils.sourceforge.net/FAQ.html
+.. _linuxdoc: https://return42.github.io/linuxdoc
+.. _jinja: https://jinja.palletsprojects.com/
+.. _sphinx-jinja: https://github.com/tardyp/sphinx-jinja
+.. _SVG: https://www.w3.org/TR/SVG11/expanded-toc.html
+.. _DOT: https://graphviz.gitlab.io/_pages/doc/info/lang.html
+.. _`Graphviz's dot`: https://graphviz.gitlab.io/_pages/pdf/dotguide.pdf
+.. _Graphviz: https://graphviz.gitlab.io
+.. _ImageMagick: https://www.imagemagick.org
+
+.. _`Emacs Table Mode`: https://www.emacswiki.org/emacs/TableMode
+.. _`Online Tables Generator`: http://www.tablesgenerator.com/text_tables
+.. _`OASIS XML Exchange Table Model`: https://www.oasis-open.org/specs/tm9901.html
diff --git a/docs/dev/search_api.rst b/docs/dev/search_api.rst
new file mode 100644
index 000000000..922548ffb
--- /dev/null
+++ b/docs/dev/search_api.rst
@@ -0,0 +1,120 @@
+.. _search API:
+
+==========
+Search API
+==========
+
+The search supports both ``GET`` and ``POST``.
+
+Furthermore, two enpoints ``/`` and ``/search`` are available for querying.
+
+
+``GET /``
+
+``GET /search``
+
+Parameters
+==========
+
+.. sidebar:: Further reading ..
+
+ - :ref:`engines-dev`
+ - :ref:`settings.yml`
+ - :ref:`engines generic`
+
+``q`` : required
+ The search query. This string is passed to external search services. Thus,
+ searx supports syntax of each search service. For example, ``site:github.com
+ searx`` is a valid query for Google. However, if simply the query above is
+ passed to any search engine which does not filter its results based on this
+ syntax, you might not get the results you wanted.
+
+ See more at :ref:`search-syntax`
+
+``categories`` : optional
+ Comma separated list, specifies the active search categories
+
+``engines`` : optional
+ Comma separated list, specifies the active search engines.
+
+``lang`` : default ``all``
+ Code of the language.
+
+``pageno`` : default ``1``
+ Search page number.
+
+``time_range`` : optional
+ [ ``day``, ``month``, ``year`` ]
+
+ Time range of search for engines which support it. See if an engine supports
+ time range search in the preferences page of an instance.
+
+``format`` : optional
+ [ ``json``, ``csv``, ``rss`` ]
+
+ Output format of results.
+
+``results_on_new_tab`` : default ``0``
+ [ ``0``, ``1`` ]
+
+ Open search results on new tab.
+
+``image_proxy`` : default ``False``
+ [ ``True``, ``False`` ]
+
+ Proxy image results through searx.
+
+``autocomplete`` : default *empty*
+ [ ``google``, ``dbpedia``, ``duckduckgo``, ``startpage``, ``wikipedia`` ]
+
+ Service which completes words as you type.
+
+``safesearch`` : default ``None``
+ [ ``0``, ``1``, ``None`` ]
+
+ Filter search results of engines which support safe search. See if an engine
+ supports safe search in the preferences page of an instance.
+
+``theme`` : default ``oscar``
+ [ ``oscar``, ``simple``, ``legacy``, ``pix-art``, ``courgette`` ]
+
+ Theme of instance.
+
+ Please note, available themes depend on an instance. It is possible that an
+ instance administrator deleted, created or renamed themes on his/her instance.
+ See the available options in the preferences page of the instance.
+
+``oscar-style`` : default ``logicodev``
+ [ ``pointhi``, ``logicodev`` ]
+
+ Style of Oscar theme. It is only parsed if the theme of an instance is
+ ``oscar``.
+
+ Please note, available styles depend on an instance. It is possible that an
+ instance administrator deleted, created or renamed styles on his/her
+ instance. See the available options in the preferences page of the instance.
+
+``enabled_plugins`` : optional
+ List of enabled plugins.
+
+ :default: ``HTTPS_rewrite``, ``Self_Informations``,
+ ``Search_on_category_select``, ``Tracker_URL_remover``
+
+ :values: [ ``DOAI_rewrite``, ``HTTPS_rewrite``, ``Infinite_scroll``,
+ ``Vim-like_hotkeys``, ``Self_Informations``, ``Tracker_URL_remover``,
+ ``Search_on_category_select`` ]
+
+``disabled_plugins``: optional
+ List of disabled plugins.
+
+ :default: ``DOAI_rewrite``, ``Infinite_scroll``, ``Vim-like_hotkeys``
+ :values: ``DOAI_rewrite``, ``HTTPS_rewrite``, ``Infinite_scroll``,
+ ``Vim-like_hotkeys``, ``Self_Informations``, ``Tracker_URL_remover``,
+ ``Search_on_category_select``
+
+``enabled_engines`` : optional : *all* :origin:`engines <searx/engines>`
+ List of enabled engines.
+
+``disabled_engines`` : optional : *all* :origin:`engines <searx/engines>`
+ List of disabled engines.
+
diff --git a/docs/dev/svg_image.svg b/docs/dev/svg_image.svg
new file mode 100644
index 000000000..5405f85b8
--- /dev/null
+++ b/docs/dev/svg_image.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- originate: https://commons.wikimedia.org/wiki/File:Variable_Resistor.svg -->
+<svg xmlns="http://www.w3.org/2000/svg"
+ version="1.1" baseProfile="full"
+ width="70px" height="40px" viewBox="0 0 700 400">
+ <line x1="0" y1="200" x2="700" y2="200" stroke="black" stroke-width="20px"/>
+ <rect x="100" y="100" width="500" height="200" fill="white" stroke="black" stroke-width="20px"/>
+ <line x1="180" y1="370" x2="500" y2="50" stroke="black" stroke-width="15px"/>
+ <polygon points="585 0 525 25 585 50" transform="rotate(135 525 25)"/>
+</svg>
diff --git a/docs/dev/translation.rst b/docs/dev/translation.rst
new file mode 100644
index 000000000..86c4c843b
--- /dev/null
+++ b/docs/dev/translation.rst
@@ -0,0 +1,71 @@
+.. _translation:
+
+===========
+Translation
+===========
+
+.. _searx@transifex: https://www.transifex.com/asciimoo/searx/
+
+Translation currently takes place on `searx@transifex`_
+
+Requirements
+============
+
+* Transifex account
+* Installed CLI tool of Transifex
+
+Init Transifex project
+======================
+
+After installing ``transifex`` using pip, run the following command to
+initialize the project.
+
+.. code:: sh
+
+ tx init # Transifex instance: https://www.transifex.com/asciimoo/searx/
+
+
+After ``$HOME/.transifexrc`` is created, get a Transifex API key and insert it
+into the configuration file.
+
+Create a configuration file for ``tx`` named ``$HOME/.tx/config``.
+
+.. code:: ini
+
+ [main]
+ host = https://www.transifex.com
+ [searx.messagespo]
+ file_filter = searx/translations/<lang>/LC_MESSAGES/messages.po
+ source_file = messages.pot
+ source_lang = en
+ type = PO
+
+
+Then run ``tx set``:
+
+.. code:: shell
+
+ tx set --auto-local -r searx.messagespo 'searx/translations/<lang>/LC_MESSAGES/messages.po' \
+ --source-lang en --type PO --source-file messages.pot --execute
+
+
+Update translations
+===================
+
+To retrieve the latest translations, pull it from Transifex.
+
+.. code:: sh
+
+ tx pull -a
+
+Then check the new languages. If strings translated are not enough, delete those
+folders, because those should not be compiled. Call the command below to compile
+the ``.po`` files.
+
+.. code:: shell
+
+ pybabel compile -d searx/translations
+
+
+After the compilation is finished commit the ``.po`` and ``.mo`` files and
+create a PR.
diff --git a/docs/index.rst b/docs/index.rst
new file mode 100644
index 000000000..d9503fef6
--- /dev/null
+++ b/docs/index.rst
@@ -0,0 +1,32 @@
+================
+Welcome to searx
+================
+
+Search without being tracked.
+
+.. sidebar:: Features
+
+ - Self hosted
+ - No user tracking
+ - No user profiling
+ - About 70 supported search engines
+ - Easy integration with any search engine
+ - Cookies are not used by default
+ - Secure, encrypted connections (HTTPS/SSL)
+ - Hosted by organizations, such as *La Quadrature du Net*, which promote
+ digital rights
+
+Searx is a free internet metasearch engine which aggregates results from more
+than 70 search services. Users are neither tracked nor profiled. Additionally,
+searx can be used over Tor for online anonymity.
+
+Get started with searx by using one of the :wiki:`Searx-instances`. If you
+don't trust anyone, you can set up your own, see :ref:`installation`.
+
+.. toctree::
+ :maxdepth: 2
+
+ user/index
+ admin/index
+ dev/index
+ blog/index
diff --git a/docs/static/img/searx_logo_small.png b/docs/static/img/searx_logo_small.png
new file mode 100644
index 000000000..083932686
--- /dev/null
+++ b/docs/static/img/searx_logo_small.png
Binary files differ
diff --git a/docs/user/index.rst b/docs/user/index.rst
new file mode 100644
index 000000000..329be3b10
--- /dev/null
+++ b/docs/user/index.rst
@@ -0,0 +1,10 @@
+==================
+User documentation
+==================
+
+.. toctree::
+ :maxdepth: 1
+
+ public_instances
+ search_syntax
+ own-instance
diff --git a/docs/user/own-instance.rst b/docs/user/own-instance.rst
new file mode 100644
index 000000000..a2f736562
--- /dev/null
+++ b/docs/user/own-instance.rst
@@ -0,0 +1,77 @@
+===========================
+Why use a private instance?
+===========================
+
+"Is it worth to run my own instance?" is a common question among searx users.
+Before answering this question, see what options a searx user has.
+
+Public instances are open to everyone who has access to its URL. Usually, these
+are operated by unknown parties (from the users' point of view). Private
+instances can be used by a select group of people. It is for example a searx of
+group of friends or a company which can be accessed through VPN. Also it can be
+single user one which runs on the user's laptop.
+
+To gain more insight on how these instances work let's dive into how searx
+protects its users.
+
+How does searx protect privacy?
+===============================
+
+Searx protects the privacy of its users in multiple ways regardless of the type
+of the instance (private, public). Removal of private data from search requests
+comes in three forms:
+
+ 1. removal of private data from requests going to search services
+ 2. not forwarding anything from a third party services through search services
+ (e.g. advertisement)
+ 3. removal of private data from requests going to the result pages
+
+Removing private data means not sending cookies to external search engines and
+generating a random browser profile for every request. Thus, it does not matter
+if a public or private instance handles the request, because it is anonymized in
+both cases. IP addresses will be the IP of the instance. But searx can be
+configured to use proxy or Tor. `Result proxy
+<https://github.com/asciimoo/morty>`__ is supported, too.
+
+Searx does not serve ads or tracking content unlike most search services. So
+private data is not forwarded to third parties who might monetize it. Besides
+protecting users from search services, both referring page and search query are
+hidden from visited result pages.
+
+
+What are the consequences of using public instances?
+----------------------------------------------------
+
+If someone uses a public instance, he/she has to trust the administrator of that
+instance. This means that the user of the public instance does not know whether
+his/her requests are logged, aggregated and sent or sold to a third party.
+
+Also, public instances without proper protection are more vulnerable to abusing
+the search service, In this case the external service in exchange returns
+CAPTCHAs or bans the IP of the instance. Thus, search requests return less
+results.
+
+I see. What about private instances?
+------------------------------------
+
+If users run their own instances, everything is in their control: the source
+code, logging settings and private data. Unknown instance administrators do not
+have to be trusted.
+
+Furthermore, as the default settings of their instance is editable, there is no
+need to use cookies to tailor searx to their needs. So preferences will not be
+reset to defaults when clearing browser cookies. As settings are stored on
+their computer, it will not be accessible to others as long as their computer is
+not compromised.
+
+Conclusion
+==========
+
+Always use an instance which is operated by people you trust. The privacy
+features of searx are available to users no matter what kind of instance they
+use.
+
+If someone is on the go or just wants to try searx for the first time public
+instances are the best choices. Additionally, public instance are making a
+world a better place, because those who cannot or do not want to run an
+instance, have access to a privacy respecting search service.
diff --git a/docs/user/public_instances.rst b/docs/user/public_instances.rst
new file mode 100644
index 000000000..9665c58b7
--- /dev/null
+++ b/docs/user/public_instances.rst
@@ -0,0 +1,318 @@
+.. _public instances:
+
+..
+ links has been ported from markdown to reST by::
+
+ regexpr: \[([^\]]*)\]\(([^)]*)\)
+ substitution: `\1 <\2>`__
+
+
+======================
+Public Searx instances
+======================
+
+.. _mailing list: mailto:searx-instances@autistici.org
+.. _subscription page: https://www.autistici.org/mailman/listinfo/searx-instances
+
+
+Useful information
+==================
+
+* Up-to-date health report available on https://stats.searx.xyz [1]_, for onion
+ (tor) services: https://stats.searx.xyz/tor.html
+
+* Searx instances `mailing list`_ & `subscription page`_.
+
+* Some of the Searx instances have a CAcert SSL certificate. You can install the
+ missing root cert `from here <http://www.cacert.org/index.php?id=3>`__.
+
+* To add your own Searx instance to this page send us your PR. A GitHub account
+ is required to send PR or add an issue.
+
+.. [1] Note that most of the instances with a A+ grade in CSP column in this
+ site are not fully functional - for example auto-completion may not work.
+
+
+List of public Searx instances
+==============================
+
+Meta-searx instances
+====================
+
+These are websites that source from other searx instances. These are useful if
+you can't decide which Searx instance to use:
+
+
+.. flat-table:: Meta-searx instances
+ :header-rows: 1
+ :stub-columns: 0
+ :widths: 2 1 2 4 4
+
+ * - clearnet host
+ - onion host
+ - issuer
+ - source selection method
+ - extra privacy features
+
+ * - `Neocities <https://searx.neocities.org/>`__
+ - n/a
+ - Comodo (`Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.neocities.org>`__)
+ - Redirects users directly to a random selection of any known running
+ server after entering query. Requires
+ Javascript. `Changelog <https://searx.neocities.org/changelog.html>`__.
+ - Excludes servers with user tracking and analytics or are proxied through
+ Cloudflare.
+
+ * - `Searxes <https://searxes.danwin1210.me/>`__ @Danwin
+ - onion v3 `hidden service
+ <http://searxes.nmqnkngye4ct7bgss4bmv5ca3wpa55yugvxen5kz2bbq67lwy6ps54yd.onion/>`__
+ - Let's Encrypt (`Verification
+ <https://www.ssllabs.com/ssltest/analyze.html?d=searxes.danwin1210.me>`__)
+ - sources data from a randomly selected running server that satisfies
+ admin's quality standards which is used for post-processing
+ - filters out privacy-hostile websites (like CloudFlare) and either marks
+ them as such or folds them below the high ranking results.
+
+
+Alive and running
+=================
+
+**BEFORE EDITING**: Please add your Searx instance by respecting the alphabetic order.
+
+.. note::
+
+ Public instances listed here may yield less accurate results as they have
+ much higher traffic and consequently have a higher chance of being blocked by
+ search providers such as Google, Qwant, Bing, Startpage, etc. Hosting your
+ own instance or using an instance that isn't listed here may give you a more
+ consistent search experience.
+
+* `ai.deafpray.wtf/searx <https://ai.deafpray.wtf/searx>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=ai.deafpray.wtf/searx>`__
+* `bamboozle.it <https://bamboozle.it/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=bamboozle.it>`__
+* `bee.jaekr.dev <https://bee.jaekr.dev>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=bee.jaekr.dev>`__
+* `beezboo.com <https://beezboo.com/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=beezboo.com>`__
+* `burtrum.org/searx <https://burtrum.org/searx>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=burtrum.org/searx>`__
+* `darmarit.cloud/searx <https://darmarit.cloud/searx>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=darmarit.cloud/searx>`__
+* `dc.ax <https://dc.ax>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=dc.ax>`__
+* `dynabyte.ca <https://dynabyte.ca>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=dynabyte.ca>`__
+* `goso.ga <https://goso.ga/search>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=goso.ga>`__
+* `gruble.de <https://www.gruble.de/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=www.gruble.de>`__
+* `haku.ahmia.fi <https://haku.ahmia.fi/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=haku.ahmia.fi&latest>`__
+* `haku.lelux.fi <https://haku.lelux.fi/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=haku.lelux.fi>`__
+* `huyo.me <https://huyo.me/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=huyo.me>`__
+* `jsearch.pw <https://jsearch.pw>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=jsearch.pw>`__
+* `le-dahut.com/searx <https://le-dahut.com/searx>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=le-dahut.com/searx>`__
+* `mijisou.com <https://mijisou.com/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=mijisou.com>`__
+* `null.media <https://null.media>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=null.media>`__
+* `openworlds.info <https://openworlds.info/>`__ - Issuer: Let's Encrypt
+* `perfectpixel.de/searx/ <https://www.perfectpixel.de/searx/>`__ - Issuer: LetsEncrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=www.perfectpixel.de>`__
+* `ransack.i2p <http://ransack.i2p/>`__ - I2P eepsite, only accessible with `I2P <https://geti2p.net/>`__ (`base32 address <http://mqamk4cfykdvhw5kjez2gnvse56gmnqxn7vkvvbuor4k4j2lbbnq.b32.i2p>`__)
+* `rapu.nz <https://rapu.nz/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=rapu.nz>`__
+* `roflcopter.fr <https://wtf.roflcopter.fr/searx>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=wtf.roflcopter.fr>`__
+* `roteserver.de/searx <https://roteserver.de/searx>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=roteserver.de>`__
+* `s.cmd.gg <https://s.cmd.gg>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=s.cmd.gg>`__
+* `search.activemail.de <https://search.activemail.de/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.activemail.de&latest>`__
+* `search.anonymize.com <https://search.anonymize.com/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.anonymize.com>`__
+* `search.azkware.net <https://search.azkware.net/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.azkware.net>`__
+* `search.biboumail.fr <https://search.biboumail.fr/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.biboumail.fr>`__
+* `search.blankenberg.eu <https://search.blankenberg.eu>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.blankenberg.eu>`__
+* `search.d4networks.com <https://search.d4networks.com/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.d4networks.com>`__
+* `search.datensturm.net <https://search.datensturm.net>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.datensturm.net>`__
+* `search.disroot.org <https://search.disroot.org/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.disroot.org>`__
+* `search.ethibox.fr <https://search.ethibox.fr>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.ethibox.fr>`__
+* `search.fossdaily.xyz <https://search.fossdaily.xyz>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.fossdaily.xyz>`__
+* `search.galaxy.cat <https://search.galaxy.cat>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.galaxy.cat>`__
+* `search.gibberfish.org <https://search.gibberfish.org/>`__ (as `Hidden Service <http://o2jdk5mdsijm2b7l.onion/>`__ or `Proxied through Tor <https://search.gibberfish.org/tor/>`__) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.gibberfish.org>`__
+* `search.koehn.com <https://search.koehn.com>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.koehn.com>`__
+* `search.lgbtq.cool <https://search.lgbtq.cool/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.lgbtq.cool>`__
+* `search.mdosch.de <https://search.mdosch.de/>`__ (as `Hidden Service <http://search.4bkxscubgtxwvhpe.onion/>`__) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.mdosch.de>`__
+* `search.modalogi.com <https://search.modalogi.com/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.modalogi.com&latest>`__
+* `search.moravit.com <https://search.moravit.com>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.moravit.com>`__
+* `search.nebulacentre.net <https://search.nebulacentre.net>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.nebulacentre.net>`__
+* `search.paulla.asso.fr <https://search.paulla.asso.fr/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.paulla.asso.fr>`__
+* `search.pifferi.info <https://search.pifferi.info/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.pifferi.info&latest>`__
+* `search.poal.co <https://search.poal.co/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.poal.co>`__
+* `search.privacytools.io <https://search.privacytools.io/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.privacytools.io>`__ - Uses Matomo for user tracking and analytics
+* `search.seds.nl <https://search.seds.nl/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.seds.nl&latest>`__
+* `search.snopyta.org <https://search.snopyta.org/>`__ (as `Hidden Service <http://juy4e6eicawzdrz7.onion/>`__) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.snopyta.org>`__
+* `search.spaeth.me <https://search.spaeth.me/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.spaeth.me&latest>`__
+* `search.st8.at <https://search.st8.at/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.st8.at>`__
+* `search.stinpriza.org <https://search.stinpriza.org>`__ (as `Hidden Service <http://z5vawdol25vrmorm4yydmohsd4u6rdoj2sylvoi3e3nqvxkvpqul7bqd.onion/>`__) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.stinpriza.org&hideResults=on>`__
+* `search.sudo-i.net <https://search.sudo-i.net/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.sudo-i.net>`__
+* `search.tolstoevsky.ml <https://search.tolstoevsky.ml>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.tolstoevsky.ml>`__
+* `searchsin.com/searx <https://searchsin.com/searx>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searchsin.com/searx>`__
+* `searx.anongoth.pl <https://searx.anongoth.pl>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.anongoth.pl&latest>`__
+* `searx.be <https://searx.be>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.be>`__
+* `searx.ca <https://searx.ca/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.ca>`__
+* `searx.canox.net <https://searx.canox.net/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.canox.net>`__
+* `searx.cybt.de <https://searx.cybt.de/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.cybt.de>`__
+* `searx.de <https://www.searx.de/>`__ - Issuer: COMODO `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.de>`__
+* `searx.decatec.de <https://searx.decatec.de>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.decatec.de>`__
+* `searx.devol.it <https://searx.devol.it/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=sears.devol.it>`__
+* `searx.dnswarden.com <https://searx.dnswarden.com>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.dnswarden.com>`__
+* `searx.drakonix.net <https://searx.drakonix.net/>`__ - (down) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.drakonix.net>`__
+* `searx.dresden.network <https://searx.dresden.network/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.dresden.network>`__
+* `searx.elukerio.org <https://searx.elukerio.org/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.elukerio.org/>`__
+* `searx.everdot.org <https://searx.everdot.org/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.everdot.org/>`__ - Crawls using YaCy
+* `searx.foo.li <https://searx.foo.li>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.foo.li&hideResults=on>`__
+* `searx.fossencdi.org <https://searx.fossencdi.org>`__ (as `Hidden Service <http://searx.cwuzdtzlubq5uual.onion/>`__) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.fossencdi.org>`__
+* `searx.fr32k.de <https://searx.fr32k.de/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.fr32k.de>`__
+* `searx.good.one.pl <https://searx.good.one.pl>`__ (as `Hidden Service <http://searxl7u2y6gvonm.onion/>`__) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.good.one.pl>`__
+* `searx.gotrust.de <https://searx.gotrust.de/>`__ (as `Hidden Service <http://nxhhwbbxc4khvvlw.onion/>`__) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.gotrust.de>`__
+* `searx.hardwired.link <https://searx.hardwired.link/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.hardwired.link>`__
+* `searx.hlfh.space <https://searx.hlfh.space>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.hlfh.space>`__
+* `searx.info <https://searx.info>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.info>`__
+* `searx.itunix.eu <https://searx.itunix.eu/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.itunix.eu>`__
+* `searx.john-at-me.net <https://searx.john-at-me.net/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.john-at-me.net>`__
+* `searx.kvch.me <https://searx.kvch.me>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.kvch.me>`__
+* `searx.laquadrature.net <https://searx.laquadrature.net>`__ (as `Hidden Service <http://searchb5a7tmimez.onion/>`__) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.laquadrature.net>`__
+* `searx.lelux.fi <https://searx.lelux.fi/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=haku.lelux.fi>`__
+* `searx.lhorn.de <https://searx.lhorn.de/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.lhorn.de&latest>`__
+* `searx.li <https://searx.li/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.li>`__
+* `searx.libmail.eu <https://searx.libmail.eu/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.libmail.eu/>`__
+* `searx.linux.pizza <https://searx.linux.pizza>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.linux.pizza>`__
+* `searx.lynnesbian.space <https://searx.lynnesbian.space/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.lynnesbian.space>`__
+* `searx.mastodontech.de <https://searx.mastodontech.de/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.mastodontech.de>`__
+* `searx.me <https://searx.me>`__ (as `Hidden Service <http://ulrn6sryqaifefld.onion/>`__) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.me>`__
+* `searx.mxchange.org <https://searx.mxchange.org/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.mxchange.org>`__
+* `searx.nakhan.net <https://searx.nakhan.net>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.nakhan.net>`__
+* `searx.nixnet.xyz <https://searx.nixnet.xyz>`__ (as `Hidden Service <http://searx.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd.onion/>`__) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.nixnet.xyz>`__
+* `searx.nnto.net <https://searx.nnto.net/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.nnto.net>`__
+* `searx.openhoofd.nl <https://searx.openhoofd.nl/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=openhoofd.nl>`__
+* `searx.openpandora.org <https://searx.openpandora.org/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.openpandora.org&latest>`__
+* `searx.operationtulip.com <https://searx.operationtulip.com/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.operationtulip.com>`__
+* `searx.orcadian.net <https://searx.orcadian.net/>`__ - Issuer: Comodo CA Limited `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.orcadian.net>`__
+* `searx.ouahpit.info <https://searx.ouahpiti.info/>`__ - Issuer: Let's Encrypt
+* `searx.pofilo.fr <https://searx.pofilo.fr/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.pofilo.fr>`__
+* `searx.prvcy.eu <https://searx.prvcy.eu/>`__ (as `Hidden Service <http://hmfztxt3pfhevucl.onion/>`__) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.prvcy.eu>`__
+* `searx.pwoss.org <https://searx.pwoss.org>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.pwoss.org>`__
+* `searx.ro <https://searx.ro/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.ro>`__
+* `searx.ru <https://searx.ru/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.ru>`__
+* `searx.solusar.de <https://searx.solusar.de/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.solusar.de>`__
+* `searx.targaryen.house <https://searx.targaryen.house/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.targaryen.house>`__
+* `searx.tuxcloud.net <https://searx.tuxcloud.net>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.tuxcloud.net>`__
+* `searx.tyil.nl <https://searx.tyil.nl>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.tyil.nl>`__
+* `searx.wegeeks.win <https://searx.wegeeks.win>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.wegeeks.win>`__
+* `searx.win <https://searx.win/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.win&latest>`__
+* `searx.xyz <https://searx.xyz/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.xyz&latest>`__
+* `searx.zareldyn.net <https://searx.zareldyn.net/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.zareldyn.net>`__
+* `searx.zdechov.net <https://searx.zdechov.net>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.zdechov.net>`__
+* `searxs.eu <https://www.searxs.eu>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=www.searxs.eu&hideResults=on>`__
+* `seeks.hsbp.org <https://seeks.hsbp.org/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=seeks.hsbp.org>`__ - `PGP signed fingerprints of cert <https://seeks.hsbp.org/cert>`__
+* `skyn3t.in/srx <https://skyn3t.in/srx/>`__ - Issuer: Let's Encrypt | onion `hidden service <http://skyn3tb3bas655mw.onion/srx/>`__
+* `spot.ecloud.global <https://spot.ecloud.global/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=spot.ecloud.global>`__
+* `srx.sx <https://srx.sx>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=srx.sx>`__
+* `stemy.me/searx <https://stemy.me/searx>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=stemy.me>`__
+* `suche.dasnetzundich.de <https://suche.dasnetzundich.de>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=suche.dasnetzundich.de>`__
+* `suche.elaon.de <https://suche.elaon.de>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=suche.elaon.de>`__
+* `suche.xyzco456vwisukfg.onion <http://suche.xyzco456vwisukfg.onion/>`__
+* `suche.uferwerk.org <https://suche.uferwerk.org>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=suche.uferwerk.org>`__
+* `timdor.noip.me/searx <https://timdor.noip.me/searx>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=timdor.noip.me/searx>`__
+* `trovu.komun.org <https://trovu.komun.org>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=trovu.komun.org>`__
+* `unmonito.red <https://unmonito.red/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=unmonito.red>`__
+* `www.finden.tk <https://www.finden.tk/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=www.finden.tk>`__
+* `zoek.anchel.nl <https://zoek.anchel.nl/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=zoek.anchel.nl>`__
+
+
+
+Running in exclusive private walled-gardens
+===========================================
+
+These instances run in walled-gardens that exclude some segment of the general
+public (e.g. Tor users and users sharing IPs with many other users). Caution:
+privacy is also compromised on these sites due to exposure of cleartext traffic
+to a third party other than the website operator.
+
+* `intelme.com <https://intelme.com>`__ - Issuer: Cloudflare `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=intelme.com>`__
+* `search404.io <https://www.search404.io/>`__ - Issuer: Cloudflare `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search404.io>`__
+* `searx.com.au <https://searx.com.au/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.com.au>`__
+* `searx.lavatech.top <https://searx.lavatech.top/>`__ - Issuer: Cloudflare `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.lavatech.top>`__
+* `searchx.mobi <https://searchx.mobi/>`__ - Issuer: Cloudflare `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searchx.mobi>`__
+* `searx.org <https://searx.org/>`__ - Issuer: Cloudflare `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.org>`__
+* `searx.run <https://searx.run/>`__ - Issuer: Cloudflare `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.run>`__
+* `searx.world <https://searx.world>`__ - Issuer: Cloudflare `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.world>`__ - Adds Amazon affiliate links
+
+
+Running with an incorrect SSL certificate
+=========================================
+
+* `listi.me <https://listi.me/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=listi.me&latest>`__
+* `s.matejc.com <https://s.matejc.com/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=s.matejc.com>`__
+* `search.jollausers.de <https://search.jollausers.de>`__ - Incorrectly configured `SSL certificate <https://www.ssllabs.com/ssltest/analyze.html?d=search.jollausers.de>`__
+* `search.paviro.de <https://search.paviro.de>`__ - Issuer: LetsEncrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.paviro.de>`__
+* `searx.abenthung.it <https://searx.abenthung.it/>`__ - Issuer: Comodo CA Limited `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.abenthung.it>`__
+* `searx.coding4schoki.org <https://searx.coding4schoki.org/>`__ - Incorrectly configured `SSL Certificate <https://www.ssllabs.com/ssltest/analyze.html?d=searx.coding4schoki.org>`__
+* `searx.haxors.club <https://searx.haxors.club/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.haxors.club>`__
+* `searx.nulltime.net <https://searx.nulltime.net/>`__ (as `Hidden Service <http://searx7gwtu5rh6wr.onion>`__) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.nulltime.net>`__
+* `searx.ch <https://searx.ch/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.ch>`__ (cert clock problems)
+
+
+Offline
+=======
+
+* `a.searx.space <https://a.searx.space>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=a.searx.space>`__ (unstable, under construction).
+* `anyonething.de <https://anyonething.de>`__ - (was found to have become a pastebin on or before 2019-03-01) Issuer: Comodo CA Limited (Warning: uses Cloudflare) `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=anyonething.de>`__
+* `h7jwxg5rakyfvikpi.onion <http://7jwxg5rakyfvikpi.onion/>`__ - available only as Tor Hidden Service (down on 2019-06-26)
+* `hacktivis.me/searx <https://hacktivis.me/searx>`__ - (down) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=hacktivis.me/searx>`__
+* `icebal.com <https://icebal.com>`__ - (down) Issuer: Let's Encrypt
+* `netrangler.host <https://netrangler.host>`__ - (down) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=netrangler.host>`__
+* `opengo.nl <https://www.opengo.nl>`__ - (down) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=www.opengo.nl>`__
+* `p9e.de <https://p9e.de/>`__ - (down - timeout) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=p9e.de>`__
+* `rubri.co <https://rubri.co>`__ - (down) Issuer: Let's Encrypt
+* `s.bacafe.xyz <https://s.bacafe.xyz/>`__ - (down) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=s.bacafe.xyz&latest>`__
+* `search.alecpap.com <https://search.alecpap.com/>`__ - (down) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.alecpap.com>`__
+* `search.blackit.de <https://search.blackit.de/>`__ - (down) Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.blackit.de>`__
+* `search.deblan.org <https://search.deblan.org/>`__ (down) - Issuer: COMODO via GANDI `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.deblan.org>`__
+* `search.homecomputing.fr <https://search.homecomputing.fr/>`__ - (down) Issuer: CAcert `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.homecomputing.fr>`__
+* `search.jpope.org <https://search.jpope.org>`__ - (down - timeout) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.jpope.org>`__
+* `search.kakise.xyz <https://search.kakise.xyz/>`__ - down
+* `search.kosebamse.com <https://search.kosebamse.com>`__ - Issuer: LetsEncrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.kosebamse.com>`__
+* `search.kujiu.org <https://search.kujiu.org>`__ - (down) Issuer: Let's Encrypt
+* `search.mailaender.coffee <https://search.mailaender.coffee/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.mailaender.coffee>`__
+* `search.matrix.ac <https://search.matrix.ac>`__ - (down) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=matrix.ac>`__
+* `search.mypsc.ca <https://search.mypsc.ca/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.mypsc.ca>`__
+* `search.namedkitten.pw <https://search.namedkitten.pw>`__ - (SSL error) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.namedkitten.pw>`__
+* `search.opentunisia.org <https://search.opentunisia.org>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.opentunisia.org>`__
+* `search.r3d007.com <https://search.r3d007.com/>`__ - (down) Issuer: Let's Encrypt
+* `search.static.lu <https://search.static.lu/>`__ - (down) Issuer: StartCom `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.static.lu>`__
+* `search.teej.xyz <https://search.teej.xyz>`__ - (down) Issuer: LetsEncrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.teej.xyz>`__
+* `search.wxzm.sx <https://search.wxzm.sx>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=search.wxzm.sx>`__
+* `searx.4ray.co <https://searx.4ray.co/>`__ - (no longer an instance, redirects to main page) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.4ray.co>`__
+* `searx.32bitflo.at <https://searx.32bitflo.at/>`__ - (down) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.32bitflo.at>`__
+* `searx.ahh.si <https://searx.ahh.si/>`__ - (down) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.ahh.si>`__
+* `searx.angristan.xyz <https://searx.angristan.xyz/>`__ - (down) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.angristan.xyz>`__
+* `searx.antirep.net <https://searx.antirep.net/>`__ - (return a 502 HTTP error) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.antirep.net>`__
+* `searx.aquilenet.fr <https://searx.aquilenet.fr/>`__ - (down - 429 HTTP error) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.aquilenet.fr>`__
+* `searx.at <https://searx.at/>`__ - (return "request exception" at every search) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.at>`__
+* `searx.cc <https://searx.cc/>`__ - (down on 2019-06-26) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.cc>`__
+* `searx.dk <https://searx.dk/>`__ - (down - 429 HTTP error) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.dk>`__
+* `searx.ehrmanns.ch <https://searx.ehrmanns.ch>`__ - (down) Issuer: Let's Encrypt
+* `searx.glibre.net <https://searx.glibre.net>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.glibre.net>`__
+* `searx.infini.fr <https://searx.infini.fr>`__ - (return a page stating that the website is not installed) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.infini.fr>`__
+* `searx.jeanphilippemorvan.info <https://searx.jeanphilippemorvan.info/>`__ - (down) Issuer: StartCom `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.jeanphilippemorvan.info>`__
+* `searx.lhorn.de <https://searx.lhorn.de/>`__ - (redirect the Searx's github repository page) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.lhorn.de&latest>`__ (only reachable from european countries)
+* `searx.lvweb.host <https://searx.lvweb.host>`__ - (down) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.lvweb.host>`__
+* `searx.mrtino.eu <https://searx.mrtino.eu>`__ - (down) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.mrtino.eu>`__
+* `searx.netzspielplatz.de <https://searx.netzspielplatz.de/>`__ - (error page about GDPR even when browsing it from USA and Asia) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.netzspielplatz.de>`__
+* `searx.new-admin.net <https://searx.new-admin.net>`__ - (down) Issuer: Let's Encrypt
+* `searx.nogafa.org <https://searx.nogafa.org/>`__ - (broken CSS) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.nogafa.org>`__
+* `searx.potato.hu <https://searx.potato.hu>`__ - (not a searx instance) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.potato.hu>`__
+* `searx.rubbeldiekatz.info <https://searx.rubbeldiekatz.info/>`__ - (down) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.rubbeldiekatz.info/>`__
+* `searx.s42.space <https://searx.s42.space>`__ - (down) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.s42.space>`__
+* `searx.salcay.hu <https://searx.salcay.hu/>`__ - (down - blank page) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.salcay.hu>`__
+* `searx.selea.se <https://searx.selea.se>`__ - (Leads to default Apache page) Issuer: RapidSSL (HSTS preloaded, DNSSEC) `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.selea.se>`__ | `HSTS Preload <https://hstspreload.org/?domain=searx.selea.se>`__
+* `searx.steinscraft.net <https://searx.steinscraft.net/>`__ - (down) Issuer: Cloudflare
+* `searx.techregion.de <https://searx.techregion.de/>`__ - (domain expired) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.techregion.de>`__
+* `searx.tognella.com <https://searx.tognella.com/>`__ - (down) Issuer: Cloudflare
+* `searx.xi.ht <https://searx.xi.ht/>`__ - (return a 502 HTTP error) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searx.xi.ht>`__
+* `searxist.com <https://searxist.com/>`__ - (down) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=searxist.com>`__
+* `so.sb <https://so.sb/>`__ - (down) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=so.sb>`__
+* `srx.stdout.net <https://srx.stdout.net/>`__ - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=srx.stdout.net>`__
+* `w6f7cgdm54cyvohcuhraaafhajctyj3ihenrovuxogoagrr5g43qmoid.onion <http://w6f7cgdm54cyvohcuhraaafhajctyj3ihenrovuxogoagrr5g43qmoid.onion/>`__ - Hidden Service
+* `win8linux.nohost.me <https://win8linux.nohost.me/searx/>`__ - (down) Issuer: Let's Encrypt
+* `wiznet.tech <https://wiznet.tech>`__ - (down) - Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=wiznet.tech>`__
+* `www.mercurius.space <https://www.mercurius.space/>`__ - (down) Issuer: Let's Encrypt
+* `www.ready.pm <https://www.ready.pm>`__ - Issuer: WoSign `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=www.ready.pm>`__
+* `z.awsmppl.com <https://z.awsmppl.com>`__ - (down) Issuer: Let's Encrypt `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=z.awsmppl.com>`__
+* `zlsdzh.tk <https://zlsdzh.tk>`__ - (down - 404 HTTP error) Issuer: TrustAsia Technologies, Inc. `Verification <https://www.ssllabs.com/ssltest/analyze.html?d=zlsdzh.tk>`__ *
+
diff --git a/docs/user/search_syntax.rst b/docs/user/search_syntax.rst
new file mode 100644
index 000000000..b738c7274
--- /dev/null
+++ b/docs/user/search_syntax.rst
@@ -0,0 +1,42 @@
+
+.. _search-syntax:
+
+=============
+Search syntax
+=============
+
+Searx allows you to modify the default categories, engines and search language
+via the search query.
+
+Prefix ``!``
+ to set Category/engine
+
+Prefix: ``:``
+ to set language
+
+Prefix: ``?``
+ to add engines and categories to the currently selected categories
+
+Abbrevations of the engines and languages are also accepted. Engine/category
+modifiers are chainable and inclusive (e.g. with :search:`!it !ddg !wp qwer
+<?q=%21it%20%21ddg%20%21wp%20qwer>` search in IT category **and** duckduckgo
+**and** wikipedia for ``qwer``).
+
+See the :search:`/preferences page <preferences>` for the list of engines,
+categories and languages.
+
+Examples
+========
+
+Search in wikipedia for ``qwer``:
+
+- :search:`!wp qwer <?q=%21wp%20qwer>` or
+- :search:`!wikipedia qwer :search:<?q=%21wikipedia%20qwer>`
+
+Image search:
+
+- :search:`!images Cthulhu <?q=%21images%20Cthulhu>`
+
+Custom language in wikipedia:
+
+- :search:`:hu !wp hackerspace <?q=%3Ahu%20%21wp%20hackerspace>`
diff --git a/manage.sh b/manage.sh
index a352ccc6e..496a522ba 100755
--- a/manage.sh
+++ b/manage.sh
@@ -18,12 +18,12 @@ ACTION="$1"
update_packages() {
pip install --upgrade pip
pip install --upgrade setuptools
- pip install -r "$BASE_DIR/requirements.txt"
+ pip install -Ur "$BASE_DIR/requirements.txt"
}
update_dev_packages() {
update_packages
- pip install -r "$BASE_DIR/requirements-dev.txt"
+ pip install -Ur "$BASE_DIR/requirements-dev.txt"
}
install_geckodriver() {
@@ -35,7 +35,7 @@ install_geckodriver() {
if [ -z "$NOTFOUND" ]; then
return
fi
- GECKODRIVER_VERSION="v0.19.1"
+ GECKODRIVER_VERSION="v0.24.0"
PLATFORM="`python -c "import six; import platform; six.print_(platform.system().lower(), platform.architecture()[0])"`"
case "$PLATFORM" in
"linux 32bit" | "linux2 32bit") ARCH="linux32";;
@@ -70,6 +70,11 @@ locales() {
pybabel compile -d "$SEARX_DIR/translations"
}
+update_useragents() {
+ echo '[!] Updating user agent versions'
+ python utils/fetch_firefox_version.py
+}
+
pep8_check() {
echo '[!] Running pep8 check'
# ignored rules:
@@ -152,12 +157,82 @@ styles() {
}
grunt_build() {
+ npm_path_setup
+
echo '[!] Grunt build : oscar theme'
grunt --gruntfile "$SEARX_DIR/static/themes/oscar/gruntfile.js"
echo '[!] Grunt build : simple theme'
grunt --gruntfile "$SEARX_DIR/static/themes/simple/gruntfile.js"
}
+docker_build() {
+ # Check if it is a git repository
+ if [ ! -d .git ]; then
+ echo "This is not Git repository"
+ exit 1
+ fi
+
+ if [ ! -x "$(which git)" ]; then
+ echo "git is not installed"
+ exit 1
+ fi
+
+ if [ ! git remote get-url origin 2> /dev/null ]; then
+ echo "there is no remote origin"
+ exit 1
+ fi
+
+ # This is a git repository
+
+ # "git describe" to get the Docker version (for example : v0.15.0-89-g0585788e)
+ # awk to remove the "v" and the "g"
+ SEARX_GIT_VERSION=$(git describe --match "v[0-9]*\.[0-9]*\.[0-9]*" HEAD 2>/dev/null | awk -F'-' '{OFS="-"; $1=substr($1, 2); $3=substr($3, 2); print}')
+
+ # add the suffix "-dirty" if the repository has uncommited change
+ git update-index -q --refresh
+ if [ ! -z "$(git diff-index --name-only HEAD --)" ]; then
+ SEARX_GIT_VERSION="${SEARX_GIT_VERSION}-dirty"
+ fi
+
+ # Get the last git commit id, will be added to the Searx version (see Dockerfile)
+ VERSION_GITCOMMIT=$(echo $SEARX_GIT_VERSION | cut -d- -f2-4)
+ echo "Last commit : $VERSION_GITCOMMIT"
+
+ # Check consistency between the git tag and the searx/version.py file
+ # /!\ HACK : parse Python file with bash /!\
+ # otherwise it is not possible build the docker image without all Python dependencies ( version.py loads __init__.py )
+ # SEARX_PYTHON_VERSION=$(python -c "import six; import searx.version; six.print_(searx.version.VERSION_STRING)")
+ SEARX_PYTHON_VERSION=$(cat searx/version.py | grep "\(VERSION_MAJOR\|VERSION_MINOR\|VERSION_BUILD\) =" | cut -d\= -f2 | sed -e 's/^[[:space:]]*//' | paste -sd "." -)
+ if [ $(echo "$SEARX_GIT_VERSION" | cut -d- -f1) != "$SEARX_PYTHON_VERSION" ]; then
+ echo "Inconsistency between the last git tag and the searx/version.py file"
+ echo "git tag: $SEARX_GIT_VERSION"
+ echo "searx/version.py: $SEARX_PYTHON_VERSION"
+ exit 1
+ fi
+
+ # define the docker image name
+ # /!\ HACK to get the user name /!\
+ GITHUB_USER=$(git remote get-url origin | sed 's/.*github\.com\/\([^\/]*\).*/\1/')
+ SEARX_IMAGE_NAME="${GITHUB_USER:-searx}/searx"
+
+ # build Docker image
+ echo "Building image ${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION}"
+ sudo docker build \
+ --build-arg SEARX_GIT_VERSION="${SEARX_GIT_VERSION}" \
+ --build-arg VERSION_GITCOMMIT="${VERSION_GITCOMMIT}" \
+ --build-arg LABEL_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") \
+ --build-arg LABEL_VCS_REF=$(git rev-parse HEAD) \
+ --build-arg LABEL_VCS_URL=$(git remote get-url origin) \
+ --build-arg TIMESTAMP_SETTINGS=$(git log -1 --format="%cd" --date=unix -- searx/settings.yml) \
+ --build-arg TIMESTAMP_UWSGI=$(git log -1 --format="%cd" --date=unix -- dockerfiles/uwsgi.ini) \
+ -t ${SEARX_IMAGE_NAME}:latest -t ${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION} .
+
+ if [ "$1" = "push" ]; then
+ sudo docker push ${SEARX_IMAGE_NAME}:latest
+ sudo docker push ${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION}
+ fi
+}
+
#
# Help
#
@@ -175,13 +250,15 @@ Commands
update_packages - Check & update production dependency changes
update_dev_packages - Check & update development and production dependency changes
install_geckodriver - Download & install geckodriver if not already installed (required for robot_tests)
- npm_packages - Download & install npm dependencies (source manage.sh to update the PATH)
+ npm_packages - Download & install npm dependencies
+ update_useragents - Update useragents.json with the most recent versions of Firefox
Build
-----
locales - Compile locales
styles - Build less files
grunt_build - Build files for themes
+ docker_build - Build Docker image
Tests
-----
diff --git a/requirements-dev.txt b/requirements-dev.txt
index 4085b8de0..3e8f617af 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -1,11 +1,16 @@
-babel==2.3.4
+pallets-sphinx-themes
+Sphinx
+sphinx-issues
mock==2.0.0
nose2[coverage_plugin]
cov-core==1.15.0
pep8==1.7.0
plone.testing==5.0.0
-splinter==0.7.5
+splinter==0.11.0
transifex-client==0.12.2
unittest2==1.1.0
zope.testrunner==4.5.1
-selenium==3.5.0
+selenium==3.141.0
+linuxdoc @ git+http://github.com/return42/linuxdoc.git
+sphinx-jinja
+sphinx-tabs
diff --git a/requirements.txt b/requirements.txt
index 94a7ccf04..ea4a5a7a0 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,5 +1,6 @@
certifi==2019.3.9
-flask-babel==0.12.2
+babel==2.7.0
+flask-babel==1.0.0
flask==1.0.2
idna==2.8
jinja2==2.10.1
diff --git a/searx/__init__.py b/searx/__init__.py
index 4d7b2a8d3..2f3ebfcfe 100644
--- a/searx/__init__.py
+++ b/searx/__init__.py
@@ -38,6 +38,7 @@ def check_settings_yml(file_name):
else:
return None
+
# find location of settings.yml
if 'SEARX_SETTINGS_PATH' in environ:
# if possible set path to settings using the
@@ -91,3 +92,5 @@ logger.info('Initialisation done')
if 'SEARX_SECRET' in environ:
settings['server']['secret_key'] = environ['SEARX_SECRET']
+if 'SEARX_BIND_ADDRESS' in environ:
+ settings['server']['bind_address'] = environ['SEARX_BIND_ADDRESS']
diff --git a/searx/answerers/random/answerer.py b/searx/answerers/random/answerer.py
index b6e8422ad..2dfb08804 100644
--- a/searx/answerers/random/answerer.py
+++ b/searx/answerers/random/answerer.py
@@ -70,4 +70,4 @@ def answer(query):
def self_info():
return {'name': gettext('Random value generator'),
'description': gettext('Generate different random values'),
- 'examples': [u'random {}'.format(x) for x in random_types]}
+ 'examples': [u'random {}'.format(x.decode('utf-8')) for x in random_types]}
diff --git a/searx/autocomplete.py b/searx/autocomplete.py
index f8a45b3ec..ff8958500 100644
--- a/searx/autocomplete.py
+++ b/searx/autocomplete.py
@@ -16,6 +16,7 @@ along with searx. If not, see < http://www.gnu.org/licenses/ >.
'''
+import sys
from lxml import etree
from json import loads
from searx import settings
@@ -26,6 +27,9 @@ from searx.engines import (
from searx.poolrequests import get as http_get
from searx.url_utils import urlencode
+if sys.version_info[0] == 3:
+ unicode = str
+
def get(*args, **kwargs):
if 'timeout' not in kwargs:
diff --git a/searx/data/useragents.json b/searx/data/useragents.json
index 850bc418a..abb81000c 100644
--- a/searx/data/useragents.json
+++ b/searx/data/useragents.json
@@ -1,14 +1,15 @@
{
- "ua": "Mozilla/5.0 ({os}; rv:{version}) Gecko/20100101 Firefox/{version}",
"versions": [
- "61.0.1",
- "61.0",
- "60.0.2",
- "60.0.1",
- "60.0"
+ "70.0.1",
+ "70.0",
+ "69.0.3",
+ "69.0.2",
+ "69.0.1",
+ "69.0"
],
"os": [
"Windows NT 10; WOW64",
"X11; Linux x86_64"
- ]
+ ],
+ "ua": "Mozilla/5.0 ({os}; rv:{version}) Gecko/20100101 Firefox/{version}"
} \ No newline at end of file
diff --git a/searx/engines/__init__.py b/searx/engines/__init__.py
index f32b57202..9ccef8b54 100644
--- a/searx/engines/__init__.py
+++ b/searx/engines/__init__.py
@@ -27,7 +27,7 @@ from json import loads
from requests import get
from searx import settings
from searx import logger
-from searx.utils import load_module, match_language
+from searx.utils import load_module, match_language, get_engine_from_settings
logger = logger.getChild('engines')
@@ -53,15 +53,22 @@ engine_default_args = {'paging': False,
'disabled': False,
'suspend_end_time': 0,
'continuous_errors': 0,
- 'time_range_support': False}
+ 'time_range_support': False,
+ 'offline': False,
+ 'tokens': []}
def load_engine(engine_data):
-
- if '_' in engine_data['name']:
- logger.error('Engine name conains underscore: "{}"'.format(engine_data['name']))
+ engine_name = engine_data['name']
+ if '_' in engine_name:
+ logger.error('Engine name contains underscore: "{}"'.format(engine_name))
sys.exit(1)
+ if engine_name.lower() != engine_name:
+ logger.warn('Engine name is not lowercase: "{}", converting to lowercase'.format(engine_name))
+ engine_name = engine_name.lower()
+ engine_data['name'] = engine_name
+
engine_module = engine_data['engine']
try:
@@ -123,14 +130,16 @@ def load_engine(engine_data):
engine.stats = {
'result_count': 0,
'search_count': 0,
- 'page_load_time': 0,
- 'page_load_count': 0,
'engine_time': 0,
'engine_time_count': 0,
'score_count': 0,
'errors': 0
}
+ if not engine.offline:
+ engine.stats['page_load_time'] = 0
+ engine.stats['page_load_count'] = 0
+
for category_name in engine.categories:
categories.setdefault(category_name, []).append(engine)
@@ -152,7 +161,7 @@ def to_percentage(stats, maxvalue):
return stats
-def get_engines_stats():
+def get_engines_stats(preferences):
# TODO refactor
pageloads = []
engine_times = []
@@ -163,16 +172,15 @@ def get_engines_stats():
max_pageload = max_engine_times = max_results = max_score = max_errors = max_score_per_result = 0 # noqa
for engine in engines.values():
+ if not preferences.validate_token(engine):
+ continue
+
if engine.stats['search_count'] == 0:
continue
+
results_num = \
engine.stats['result_count'] / float(engine.stats['search_count'])
- if engine.stats['page_load_count'] != 0:
- load_times = engine.stats['page_load_time'] / float(engine.stats['page_load_count']) # noqa
- else:
- load_times = 0
-
if engine.stats['engine_time_count'] != 0:
this_engine_time = engine.stats['engine_time'] / float(engine.stats['engine_time_count']) # noqa
else:
@@ -184,14 +192,19 @@ def get_engines_stats():
else:
score = score_per_result = 0.0
- max_pageload = max(load_times, max_pageload)
+ if not engine.offline:
+ load_times = 0
+ if engine.stats['page_load_count'] != 0:
+ load_times = engine.stats['page_load_time'] / float(engine.stats['page_load_count']) # noqa
+ max_pageload = max(load_times, max_pageload)
+ pageloads.append({'avg': load_times, 'name': engine.name})
+
max_engine_times = max(this_engine_time, max_engine_times)
max_results = max(results_num, max_results)
max_score = max(score, max_score)
max_score_per_result = max(score_per_result, max_score_per_result)
max_errors = max(max_errors, engine.stats['errors'])
- pageloads.append({'avg': load_times, 'name': engine.name})
engine_times.append({'avg': this_engine_time, 'name': engine.name})
results.append({'avg': results_num, 'name': engine.name})
scores.append({'avg': score, 'name': engine.name})
@@ -248,12 +261,14 @@ def load_engines(engine_list):
def initialize_engines(engine_list):
load_engines(engine_list)
+
+ def engine_init(engine_name, init_fn):
+ init_fn(get_engine_from_settings(engine_name))
+ logger.debug('%s engine: Initialized', engine_name)
+
for engine_name, engine in engines.items():
if hasattr(engine, 'init'):
init_fn = getattr(engine, 'init')
-
- def engine_init():
- init_fn()
- logger.debug('%s engine initialized', engine_name)
- logger.debug('Starting background initialization of %s engine', engine_name)
- threading.Thread(target=engine_init).start()
+ if init_fn:
+ logger.debug('%s engine: Starting background initialization', engine_name)
+ threading.Thread(target=engine_init, args=(engine_name, init_fn)).start()
diff --git a/searx/engines/arxiv.py b/searx/engines/arxiv.py
index 5ef84f0c1..e3c871d17 100644
--- a/searx/engines/arxiv.py
+++ b/searx/engines/arxiv.py
@@ -17,6 +17,7 @@ from searx.url_utils import urlencode
categories = ['science']
+paging = True
base_url = 'http://export.arxiv.org/api/query?search_query=all:'\
+ '{query}&start={offset}&max_results={number_of_results}'
@@ -29,7 +30,7 @@ def request(query, params):
# basic search
offset = (params['pageno'] - 1) * number_of_results
- string_args = dict(query=query,
+ string_args = dict(query=query.decode('utf-8'),
offset=offset,
number_of_results=number_of_results)
diff --git a/searx/engines/bing.py b/searx/engines/bing.py
index 742379c1a..b193f7c60 100644
--- a/searx/engines/bing.py
+++ b/searx/engines/bing.py
@@ -13,10 +13,14 @@
@todo publishedDate
"""
+import re
from lxml import html
+from searx import logger, utils
from searx.engines.xpath import extract_text
from searx.url_utils import urlencode
-from searx.utils import match_language, gen_useragent
+from searx.utils import match_language, gen_useragent, eval_xpath
+
+logger = logger.getChild('bing engine')
# engine dependent config
categories = ['general']
@@ -30,9 +34,13 @@ base_url = 'https://www.bing.com/'
search_string = 'search?{query}&first={offset}'
+def _get_offset_from_pageno(pageno):
+ return (pageno - 1) * 10 + 1
+
+
# do search-request
def request(query, params):
- offset = (params['pageno'] - 1) * 10 + 1
+ offset = _get_offset_from_pageno(params.get('pageno', 0))
if params['language'] == 'all':
lang = 'EN'
@@ -47,29 +55,21 @@ def request(query, params):
params['url'] = base_url + search_path
- params['headers']['User-Agent'] = gen_useragent('Windows NT 6.3; WOW64')
-
return params
# get response from search-request
def response(resp):
results = []
+ result_len = 0
dom = html.fromstring(resp.text)
-
- try:
- results.append({'number_of_results': int(dom.xpath('//span[@class="sb_count"]/text()')[0]
- .split()[0].replace(',', ''))})
- except:
- pass
-
# parse results
- for result in dom.xpath('//div[@class="sa_cc"]'):
- link = result.xpath('.//h3/a')[0]
+ for result in eval_xpath(dom, '//div[@class="sa_cc"]'):
+ link = eval_xpath(result, './/h3/a')[0]
url = link.attrib.get('href')
title = extract_text(link)
- content = extract_text(result.xpath('.//p'))
+ content = extract_text(eval_xpath(result, './/p'))
# append result
results.append({'url': url,
@@ -77,18 +77,34 @@ def response(resp):
'content': content})
# parse results again if nothing is found yet
- for result in dom.xpath('//li[@class="b_algo"]'):
- link = result.xpath('.//h2/a')[0]
+ for result in eval_xpath(dom, '//li[@class="b_algo"]'):
+ link = eval_xpath(result, './/h2/a')[0]
url = link.attrib.get('href')
title = extract_text(link)
- content = extract_text(result.xpath('.//p'))
+ content = extract_text(eval_xpath(result, './/p'))
# append result
results.append({'url': url,
'title': title,
'content': content})
- # return results
+ try:
+ result_len_container = "".join(eval_xpath(dom, '//span[@class="sb_count"]//text()'))
+ if "-" in result_len_container:
+ # Remove the part "from-to" for paginated request ...
+ result_len_container = result_len_container[result_len_container.find("-") * 2 + 2:]
+
+ result_len_container = re.sub('[^0-9]', '', result_len_container)
+ if len(result_len_container) > 0:
+ result_len = int(result_len_container)
+ except Exception as e:
+ logger.debug('result error :\n%s', e)
+ pass
+
+ if result_len and _get_offset_from_pageno(resp.search_params.get("pageno", 0)) > result_len:
+ return []
+
+ results.append({'number_of_results': result_len})
return results
@@ -96,9 +112,9 @@ def response(resp):
def _fetch_supported_languages(resp):
supported_languages = []
dom = html.fromstring(resp.text)
- options = dom.xpath('//div[@id="limit-languages"]//input')
+ options = eval_xpath(dom, '//div[@id="limit-languages"]//input')
for option in options:
- code = option.xpath('./@id')[0].replace('_', '-')
+ code = eval_xpath(option, './@id')[0].replace('_', '-')
if code == 'nb':
code = 'no'
supported_languages.append(code)
diff --git a/searx/engines/bing_images.py b/searx/engines/bing_images.py
index e2495200c..44e2c3bbc 100644
--- a/searx/engines/bing_images.py
+++ b/searx/engines/bing_images.py
@@ -10,9 +10,6 @@
@stable no (HTML can change)
@parse url, title, img_src
- @todo currently there are up to 35 images receive per page,
- because bing does not parse count=10.
- limited response to 10 images
"""
from lxml import html
@@ -28,10 +25,15 @@ safesearch = True
time_range_support = True
language_support = True
supported_languages_url = 'https://www.bing.com/account/general'
+number_of_results = 28
# search-url
base_url = 'https://www.bing.com/'
-search_string = 'images/search?{query}&count=10&first={offset}'
+search_string = 'images/search'\
+ '?{query}'\
+ '&count={count}'\
+ '&first={first}'\
+ '&FORM=IBASEP'
time_range_string = '&qft=+filterui:age-lt{interval}'
time_range_dict = {'day': '1440',
'week': '10080',
@@ -44,16 +46,14 @@ safesearch_types = {2: 'STRICT',
0: 'OFF'}
-_quote_keys_regex = re.compile('({|,)([a-z][a-z0-9]*):(")', re.I | re.U)
-
-
# do search-request
def request(query, params):
- offset = (params['pageno'] - 1) * 10 + 1
+ offset = ((params['pageno'] - 1) * number_of_results) + 1
search_path = search_string.format(
query=urlencode({'q': query}),
- offset=offset)
+ count=number_of_results,
+ first=offset)
language = match_language(params['language'], supported_languages, language_aliases).lower()
@@ -77,32 +77,31 @@ def response(resp):
dom = html.fromstring(resp.text)
# parse results
- for result in dom.xpath('//div[@id="mmComponent_images_1"]/ul/li/div/div[@class="imgpt"]'):
- link = result.xpath('./a')[0]
-
- # TODO find actual title
- title = link.xpath('.//img/@alt')[0]
-
- # parse json-data (it is required to add a space, to make it parsable)
- json_data = loads(_quote_keys_regex.sub(r'\1"\2": \3', link.attrib.get('m')))
-
- url = json_data.get('purl')
- img_src = json_data.get('murl')
- thumbnail = json_data.get('turl')
-
- # append result
- results.append({'template': 'images.html',
- 'url': url,
- 'title': title,
- 'content': '',
- 'thumbnail_src': thumbnail,
- 'img_src': img_src})
-
- # TODO stop parsing if 10 images are found
- # if len(results) >= 10:
- # break
+ for result in dom.xpath('//div[@class="imgpt"]'):
+
+ img_format = result.xpath('./div[contains(@class, "img_info")]/span/text()')[0]
+ # Microsoft seems to experiment with this code so don't make the path too specific,
+ # just catch the text section for the first anchor in img_info assuming this to be
+ # the originating site.
+ source = result.xpath('./div[contains(@class, "img_info")]//a/text()')[0]
+
+ try:
+ m = loads(result.xpath('./a/@m')[0])
+
+ # strip 'Unicode private use area' highlighting, they render to Tux
+ # the Linux penguin and a standing diamond on my machine...
+ title = m.get('t', '').replace(u'\ue000', '').replace(u'\ue001', '')
+ results.append({'template': 'images.html',
+ 'url': m['purl'],
+ 'thumbnail_src': m['turl'],
+ 'img_src': m['murl'],
+ 'content': '',
+ 'title': title,
+ 'source': source,
+ 'img_format': img_format})
+ except:
+ continue
- # return results
return results
diff --git a/searx/engines/bing_videos.py b/searx/engines/bing_videos.py
index bf17f9168..f1e636819 100644
--- a/searx/engines/bing_videos.py
+++ b/searx/engines/bing_videos.py
@@ -13,7 +13,6 @@
from json import loads
from lxml import html
from searx.engines.bing_images import _fetch_supported_languages, supported_languages_url
-from searx.engines.xpath import extract_text
from searx.url_utils import urlencode
from searx.utils import match_language
@@ -22,11 +21,16 @@ categories = ['videos']
paging = True
safesearch = True
time_range_support = True
-number_of_results = 10
+number_of_results = 28
language_support = True
-search_url = 'https://www.bing.com/videos/asyncv2?{query}&async=content&'\
- 'first={offset}&count={number_of_results}&CW=1366&CH=25&FORM=R5VR5'
+base_url = 'https://www.bing.com/'
+search_string = 'videos/search'\
+ '?{query}'\
+ '&count={count}'\
+ '&first={first}'\
+ '&scope=video'\
+ '&FORM=QBLH'
time_range_string = '&qft=+filterui:videoage-lt{interval}'
time_range_dict = {'day': '1440',
'week': '10080',
@@ -41,7 +45,12 @@ safesearch_types = {2: 'STRICT',
# do search-request
def request(query, params):
- offset = (params['pageno'] - 1) * 10 + 1
+ offset = ((params['pageno'] - 1) * number_of_results) + 1
+
+ search_path = search_string.format(
+ query=urlencode({'q': query}),
+ count=number_of_results,
+ first=offset)
# safesearch cookie
params['cookies']['SRCHHPGUSR'] = \
@@ -52,9 +61,7 @@ def request(query, params):
params['cookies']['_EDGE_S'] = 'mkt=' + language + '&F=1'
# query and paging
- params['url'] = search_url.format(query=urlencode({'q': query}),
- offset=offset,
- number_of_results=number_of_results)
+ params['url'] = base_url + search_path
# time range
if params['time_range'] in time_range_dict:
@@ -70,19 +77,18 @@ def response(resp):
dom = html.fromstring(resp.text)
for result in dom.xpath('//div[@class="dg_u"]'):
- url = result.xpath('./div[@class="mc_vtvc"]/a/@href')[0]
- url = 'https://bing.com' + url
- title = extract_text(result.xpath('./div/a/div/div[@class="mc_vtvc_title"]/@title'))
- content = extract_text(result.xpath('./div/a/div/div/div/div/text()'))
- thumbnail = result.xpath('./div/a/div/div/img/@src')[0]
-
- results.append({'url': url,
- 'title': title,
- 'content': content,
- 'thumbnail': thumbnail,
- 'template': 'videos.html'})
-
- if len(results) >= number_of_results:
- break
+ try:
+ metadata = loads(result.xpath('.//div[@class="vrhdata"]/@vrhm')[0])
+ info = ' - '.join(result.xpath('.//div[@class="mc_vtvc_meta_block"]//span/text()')).strip()
+ content = '{0} - {1}'.format(metadata['du'], info)
+ thumbnail = '{0}th?id={1}'.format(base_url, metadata['thid'])
+ results.append({'url': metadata['murl'],
+ 'thumbnail': thumbnail,
+ 'title': metadata.get('vt', ''),
+ 'content': content,
+ 'template': 'videos.html'})
+
+ except:
+ continue
return results
diff --git a/searx/engines/btdigg.py b/searx/engines/btdigg.py
index 40438673f..82eedc24b 100644
--- a/searx/engines/btdigg.py
+++ b/searx/engines/btdigg.py
@@ -1,7 +1,7 @@
"""
BTDigg (Videos, Music, Files)
- @website https://btdigg.org
+ @website https://btdig.com
@provide-api yes (on demand)
@using-api no
@@ -21,7 +21,7 @@ categories = ['videos', 'music', 'files']
paging = True
# search-url
-url = 'https://btdigg.org'
+url = 'https://btdig.com'
search_url = url + '/search?q={search_term}&p={pageno}'
@@ -39,7 +39,7 @@ def response(resp):
dom = html.fromstring(resp.text)
- search_res = dom.xpath('//div[@id="search_res"]/table/tr')
+ search_res = dom.xpath('//div[@class="one_result"]')
# return empty array if nothing is found
if not search_res:
@@ -47,46 +47,39 @@ def response(resp):
# parse results
for result in search_res:
- link = result.xpath('.//td[@class="torrent_name"]//a')[0]
+ link = result.xpath('.//div[@class="torrent_name"]//a')[0]
href = urljoin(url, link.attrib.get('href'))
title = extract_text(link)
- content = extract_text(result.xpath('.//pre[@class="snippet"]')[0])
- content = "<br />".join(content.split("\n"))
- filesize = result.xpath('.//span[@class="attr_val"]/text()')[0].split()[0]
- filesize_multiplier = result.xpath('.//span[@class="attr_val"]/text()')[0].split()[1]
- files = result.xpath('.//span[@class="attr_val"]/text()')[1]
- seed = result.xpath('.//span[@class="attr_val"]/text()')[2]
+ excerpt = result.xpath('.//div[@class="torrent_excerpt"]')[0]
+ content = html.tostring(excerpt, encoding='unicode', method='text', with_tail=False)
+ # it is better to emit <br/> instead of |, but html tags are verboten
+ content = content.strip().replace('\n', ' | ')
+ content = ' '.join(content.split())
- # convert seed to int if possible
- if seed.isdigit():
- seed = int(seed)
- else:
- seed = 0
-
- leech = 0
+ filesize = result.xpath('.//span[@class="torrent_size"]/text()')[0].split()[0]
+ filesize_multiplier = result.xpath('.//span[@class="torrent_size"]/text()')[0].split()[1]
+ files = (result.xpath('.//span[@class="torrent_files"]/text()') or ['1'])[0]
# convert filesize to byte if possible
filesize = get_torrent_size(filesize, filesize_multiplier)
# convert files to int if possible
- if files.isdigit():
+ try:
files = int(files)
- else:
+ except:
files = None
- magnetlink = result.xpath('.//td[@class="ttth"]//a')[0].attrib['href']
+ magnetlink = result.xpath('.//div[@class="torrent_magnet"]//a')[0].attrib['href']
# append result
results.append({'url': href,
'title': title,
'content': content,
- 'seed': seed,
- 'leech': leech,
'filesize': filesize,
'files': files,
'magnetlink': magnetlink,
'template': 'torrent.html'})
# return results sorted by seeder
- return sorted(results, key=itemgetter('seed'), reverse=True)
+ return results
diff --git a/searx/engines/dailymotion.py b/searx/engines/dailymotion.py
index 06a9c41f3..1038e64bf 100644
--- a/searx/engines/dailymotion.py
+++ b/searx/engines/dailymotion.py
@@ -15,7 +15,7 @@
from json import loads
from datetime import datetime
from searx.url_utils import urlencode
-from searx.utils import match_language
+from searx.utils import match_language, html_to_text
# engine dependent config
categories = ['videos']
@@ -26,7 +26,7 @@ language_support = True
# see http://www.dailymotion.com/doc/api/obj-video.html
search_url = 'https://api.dailymotion.com/videos?fields=created_time,title,description,duration,url,thumbnail_360_url,id&sort=relevance&limit=5&page={pageno}&{query}' # noqa
embedded_url = '<iframe frameborder="0" width="540" height="304" ' +\
- 'data-src="//www.dailymotion.com/embed/video/{videoid}" allowfullscreen></iframe>'
+ 'data-src="https://www.dailymotion.com/embed/video/{videoid}" allowfullscreen></iframe>'
supported_languages_url = 'https://api.dailymotion.com/languages'
@@ -59,7 +59,7 @@ def response(resp):
for res in search_res['list']:
title = res['title']
url = res['url']
- content = res['description']
+ content = html_to_text(res['description'])
thumbnail = res['thumbnail_360_url']
publishedDate = datetime.fromtimestamp(res['created_time'], None)
embedded = embedded_url.format(videoid=res['id'])
diff --git a/searx/engines/deviantart.py b/searx/engines/deviantart.py
index bb85c6dc5..a0e27e622 100644
--- a/searx/engines/deviantart.py
+++ b/searx/engines/deviantart.py
@@ -24,7 +24,7 @@ time_range_support = True
# search-url
base_url = 'https://www.deviantart.com/'
-search_url = base_url + 'browse/all/?offset={offset}&{query}'
+search_url = base_url + 'search?page={page}&{query}'
time_range_url = '&order={range}'
time_range_dict = {'day': 11,
@@ -37,9 +37,7 @@ def request(query, params):
if params['time_range'] and params['time_range'] not in time_range_dict:
return params
- offset = (params['pageno'] - 1) * 24
-
- params['url'] = search_url.format(offset=offset,
+ params['url'] = search_url.format(page=params['pageno'],
query=urlencode({'q': query}))
if params['time_range'] in time_range_dict:
params['url'] += time_range_url.format(range=time_range_dict[params['time_range']])
@@ -57,28 +55,27 @@ def response(resp):
dom = html.fromstring(resp.text)
- regex = re.compile(r'\/200H\/')
-
# parse results
- for result in dom.xpath('.//span[@class="thumb wide"]'):
- link = result.xpath('.//a[@class="torpedo-thumb-link"]')[0]
- url = link.attrib.get('href')
- title = extract_text(result.xpath('.//span[@class="title"]'))
- thumbnail_src = link.xpath('.//img')[0].attrib.get('src')
- img_src = regex.sub('/', thumbnail_src)
-
- # http to https, remove domain sharding
- thumbnail_src = re.sub(r"https?://(th|fc)\d+.", "https://th01.", thumbnail_src)
- thumbnail_src = re.sub(r"http://", "https://", thumbnail_src)
-
- url = re.sub(r"http://(.*)\.deviantart\.com/", "https://\\1.deviantart.com/", url)
-
- # append result
- results.append({'url': url,
- 'title': title,
- 'img_src': img_src,
- 'thumbnail_src': thumbnail_src,
- 'template': 'images.html'})
+ for row in dom.xpath('//div[contains(@data-hook, "content_row")]'):
+ for result in row.xpath('./div'):
+ link = result.xpath('.//a[@data-hook="deviation_link"]')[0]
+ url = link.attrib.get('href')
+ title = link.attrib.get('title')
+ thumbnail_src = result.xpath('.//img')[0].attrib.get('src')
+ img_src = thumbnail_src
+
+ # http to https, remove domain sharding
+ thumbnail_src = re.sub(r"https?://(th|fc)\d+.", "https://th01.", thumbnail_src)
+ thumbnail_src = re.sub(r"http://", "https://", thumbnail_src)
+
+ url = re.sub(r"http://(.*)\.deviantart\.com/", "https://\\1.deviantart.com/", url)
+
+ # append result
+ results.append({'url': url,
+ 'title': title,
+ 'img_src': img_src,
+ 'thumbnail_src': thumbnail_src,
+ 'template': 'images.html'})
# return results
return results
diff --git a/searx/engines/dictzone.py b/searx/engines/dictzone.py
index 7cc44df73..423af0971 100644
--- a/searx/engines/dictzone.py
+++ b/searx/engines/dictzone.py
@@ -11,11 +11,11 @@
import re
from lxml import html
-from searx.utils import is_valid_lang
+from searx.utils import is_valid_lang, eval_xpath
from searx.url_utils import urljoin
categories = ['general']
-url = u'http://dictzone.com/{from_lang}-{to_lang}-dictionary/{query}'
+url = u'https://dictzone.com/{from_lang}-{to_lang}-dictionary/{query}'
weight = 100
parser_re = re.compile(b'.*?([a-z]+)-([a-z]+) ([^ ]+)$', re.I)
@@ -47,14 +47,14 @@ def response(resp):
dom = html.fromstring(resp.text)
- for k, result in enumerate(dom.xpath(results_xpath)[1:]):
+ for k, result in enumerate(eval_xpath(dom, results_xpath)[1:]):
try:
- from_result, to_results_raw = result.xpath('./td')
+ from_result, to_results_raw = eval_xpath(result, './td')
except:
continue
to_results = []
- for to_result in to_results_raw.xpath('./p/a'):
+ for to_result in eval_xpath(to_results_raw, './p/a'):
t = to_result.text_content()
if t.strip():
to_results.append(to_result.text_content())
diff --git a/searx/engines/digg.py b/searx/engines/digg.py
index 4369ccb84..073410eb0 100644
--- a/searx/engines/digg.py
+++ b/searx/engines/digg.py
@@ -15,7 +15,8 @@ import string
from dateutil import parser
from json import loads
from lxml import html
-from searx.url_utils import quote_plus
+from searx.url_utils import urlencode
+from datetime import datetime
# engine dependent config
categories = ['news', 'social media']
@@ -23,7 +24,7 @@ paging = True
# search-url
base_url = 'https://digg.com/'
-search_url = base_url + 'api/search/{query}.json?position={position}&format=html'
+search_url = base_url + 'api/search/?{query}&from={position}&size=20&format=html'
# specific xpath variables
results_xpath = '//article'
@@ -38,9 +39,9 @@ digg_cookie_chars = string.ascii_uppercase + string.ascii_lowercase +\
# do search-request
def request(query, params):
- offset = (params['pageno'] - 1) * 10
+ offset = (params['pageno'] - 1) * 20
params['url'] = search_url.format(position=offset,
- query=quote_plus(query))
+ query=urlencode({'q': query}))
params['cookies']['frontend.auid'] = ''.join(random.choice(
digg_cookie_chars) for _ in range(22))
return params
@@ -52,30 +53,17 @@ def response(resp):
search_result = loads(resp.text)
- if 'html' not in search_result or search_result['html'] == '':
- return results
-
- dom = html.fromstring(search_result['html'])
-
# parse results
- for result in dom.xpath(results_xpath):
- url = result.attrib.get('data-contenturl')
- thumbnail = result.xpath('.//img')[0].attrib.get('src')
- title = ''.join(result.xpath(title_xpath))
- content = ''.join(result.xpath(content_xpath))
- pubdate = result.xpath(pubdate_xpath)[0].attrib.get('datetime')
- publishedDate = parser.parse(pubdate)
-
- # http to https
- thumbnail = thumbnail.replace("http://static.digg.com", "https://static.digg.com")
+ for result in search_result['mapped']:
+ published = datetime.strptime(result['created']['ISO'], "%Y-%m-%d %H:%M:%S")
# append result
- results.append({'url': url,
- 'title': title,
- 'content': content,
+ results.append({'url': result['url'],
+ 'title': result['title'],
+ 'content': result['excerpt'],
'template': 'videos.html',
- 'publishedDate': publishedDate,
- 'thumbnail': thumbnail})
+ 'publishedDate': published,
+ 'thumbnail': result['images']['thumbImage']})
# return results
return results
diff --git a/searx/engines/doku.py b/searx/engines/doku.py
index a391be444..d20e66026 100644
--- a/searx/engines/doku.py
+++ b/searx/engines/doku.py
@@ -11,6 +11,7 @@
from lxml.html import fromstring
from searx.engines.xpath import extract_text
+from searx.utils import eval_xpath
from searx.url_utils import urlencode
# engine dependent config
@@ -45,16 +46,16 @@ def response(resp):
# parse results
# Quickhits
- for r in doc.xpath('//div[@class="search_quickresult"]/ul/li'):
+ for r in eval_xpath(doc, '//div[@class="search_quickresult"]/ul/li'):
try:
- res_url = r.xpath('.//a[@class="wikilink1"]/@href')[-1]
+ res_url = eval_xpath(r, './/a[@class="wikilink1"]/@href')[-1]
except:
continue
if not res_url:
continue
- title = extract_text(r.xpath('.//a[@class="wikilink1"]/@title'))
+ title = extract_text(eval_xpath(r, './/a[@class="wikilink1"]/@title'))
# append result
results.append({'title': title,
@@ -62,13 +63,13 @@ def response(resp):
'url': base_url + res_url})
# Search results
- for r in doc.xpath('//dl[@class="search_results"]/*'):
+ for r in eval_xpath(doc, '//dl[@class="search_results"]/*'):
try:
if r.tag == "dt":
- res_url = r.xpath('.//a[@class="wikilink1"]/@href')[-1]
- title = extract_text(r.xpath('.//a[@class="wikilink1"]/@title'))
+ res_url = eval_xpath(r, './/a[@class="wikilink1"]/@href')[-1]
+ title = extract_text(eval_xpath(r, './/a[@class="wikilink1"]/@title'))
elif r.tag == "dd":
- content = extract_text(r.xpath('.'))
+ content = extract_text(eval_xpath(r, '.'))
# append result
results.append({'title': title,
diff --git a/searx/engines/duckduckgo.py b/searx/engines/duckduckgo.py
index fb8f523ac..0d2c0af2d 100644
--- a/searx/engines/duckduckgo.py
+++ b/searx/engines/duckduckgo.py
@@ -18,7 +18,7 @@ from json import loads
from searx.engines.xpath import extract_text
from searx.poolrequests import get
from searx.url_utils import urlencode
-from searx.utils import match_language
+from searx.utils import match_language, eval_xpath
# engine dependent config
categories = ['general']
@@ -65,21 +65,36 @@ def get_region_code(lang, lang_list=[]):
def request(query, params):
- if params['time_range'] and params['time_range'] not in time_range_dict:
+ if params['time_range'] not in (None, 'None', '') and params['time_range'] not in time_range_dict:
return params
offset = (params['pageno'] - 1) * 30
region_code = get_region_code(params['language'], supported_languages)
- if region_code:
- params['url'] = url.format(
- query=urlencode({'q': query, 'kl': region_code}), offset=offset, dc_param=offset)
+ params['url'] = 'https://duckduckgo.com/html/'
+ if params['pageno'] > 1:
+ params['method'] = 'POST'
+ params['data']['q'] = query
+ params['data']['s'] = offset
+ params['data']['dc'] = 30
+ params['data']['nextParams'] = ''
+ params['data']['v'] = 'l'
+ params['data']['o'] = 'json'
+ params['data']['api'] = '/d.js'
+ if params['time_range'] in time_range_dict:
+ params['data']['df'] = time_range_dict[params['time_range']]
+ if region_code:
+ params['data']['kl'] = region_code
else:
- params['url'] = url.format(
- query=urlencode({'q': query}), offset=offset, dc_param=offset)
+ if region_code:
+ params['url'] = url.format(
+ query=urlencode({'q': query, 'kl': region_code}), offset=offset, dc_param=offset)
+ else:
+ params['url'] = url.format(
+ query=urlencode({'q': query}), offset=offset, dc_param=offset)
- if params['time_range'] in time_range_dict:
- params['url'] += time_range_url.format(range=time_range_dict[params['time_range']])
+ if params['time_range'] in time_range_dict:
+ params['url'] += time_range_url.format(range=time_range_dict[params['time_range']])
return params
@@ -91,17 +106,19 @@ def response(resp):
doc = fromstring(resp.text)
# parse results
- for r in doc.xpath(result_xpath):
+ for i, r in enumerate(eval_xpath(doc, result_xpath)):
+ if i >= 30:
+ break
try:
- res_url = r.xpath(url_xpath)[-1]
+ res_url = eval_xpath(r, url_xpath)[-1]
except:
continue
if not res_url:
continue
- title = extract_text(r.xpath(title_xpath))
- content = extract_text(r.xpath(content_xpath))
+ title = extract_text(eval_xpath(r, title_xpath))
+ content = extract_text(eval_xpath(r, content_xpath))
# append result
results.append({'title': title,
diff --git a/searx/engines/duckduckgo_definitions.py b/searx/engines/duckduckgo_definitions.py
index 957a13ea6..79d10c303 100644
--- a/searx/engines/duckduckgo_definitions.py
+++ b/searx/engines/duckduckgo_definitions.py
@@ -1,3 +1,14 @@
+"""
+DuckDuckGo (definitions)
+
+- `Instant Answer API`_
+- `DuckDuckGo query`_
+
+.. _Instant Answer API: https://duckduckgo.com/api
+.. _DuckDuckGo query: https://api.duckduckgo.com/?q=DuckDuckGo&format=json&pretty=1
+
+"""
+
import json
from lxml import html
from re import compile
@@ -25,7 +36,8 @@ def result_to_text(url, text, htmlResult):
def request(query, params):
params['url'] = url.format(query=urlencode({'q': query}))
language = match_language(params['language'], supported_languages, language_aliases)
- params['headers']['Accept-Language'] = language.split('-')[0]
+ language = language.split('-')[0]
+ params['headers']['Accept-Language'] = language
return params
@@ -43,8 +55,9 @@ def response(resp):
# add answer if there is one
answer = search_res.get('Answer', '')
- if answer != '':
- results.append({'answer': html_to_text(answer)})
+ if answer:
+ if search_res.get('AnswerType', '') not in ['calc']:
+ results.append({'answer': html_to_text(answer)})
# add infobox
if 'Definition' in search_res:
diff --git a/searx/engines/duden.py b/searx/engines/duden.py
index 881ff9d9c..cf2f1a278 100644
--- a/searx/engines/duden.py
+++ b/searx/engines/duden.py
@@ -11,7 +11,8 @@
from lxml import html, etree
import re
from searx.engines.xpath import extract_text
-from searx.url_utils import quote
+from searx.utils import eval_xpath
+from searx.url_utils import quote, urljoin
from searx import logger
categories = ['general']
@@ -20,7 +21,7 @@ language_support = False
# search-url
base_url = 'https://www.duden.de/'
-search_url = base_url + 'suchen/dudenonline/{query}?page={offset}'
+search_url = base_url + 'suchen/dudenonline/{query}?search_api_fulltext=&page={offset}'
def request(query, params):
@@ -35,7 +36,11 @@ def request(query, params):
'''
offset = (params['pageno'] - 1)
- params['url'] = search_url.format(offset=offset, query=quote(query))
+ if offset == 0:
+ search_url_fmt = base_url + 'suchen/dudenonline/{query}'
+ params['url'] = search_url_fmt.format(query=quote(query))
+ else:
+ params['url'] = search_url.format(offset=offset, query=quote(query))
return params
@@ -48,9 +53,9 @@ def response(resp):
dom = html.fromstring(resp.text)
try:
- number_of_results_string = re.sub('[^0-9]', '', dom.xpath(
- '//a[@class="active" and contains(@href,"/suchen/dudenonline")]/span/text()')[0]
- )
+ number_of_results_string =\
+ re.sub('[^0-9]', '',
+ eval_xpath(dom, '//a[@class="active" and contains(@href,"/suchen/dudenonline")]/span/text()')[0])
results.append({'number_of_results': int(number_of_results_string)})
@@ -58,13 +63,12 @@ def response(resp):
logger.debug("Couldn't read number of results.")
pass
- for result in dom.xpath('//section[@class="wide" and not(contains(@style,"overflow:hidden"))]'):
+ for result in eval_xpath(dom, '//section[not(contains(@class, "essay"))]'):
try:
- logger.debug("running for %s" % str(result))
- link = result.xpath('.//h2/a')[0]
- url = link.attrib.get('href')
- title = result.xpath('string(.//h2/a)')
- content = extract_text(result.xpath('.//p'))
+ url = eval_xpath(result, './/h2/a')[0].get('href')
+ url = urljoin(base_url, url)
+ title = eval_xpath(result, 'string(.//h2/a)').strip()
+ content = extract_text(eval_xpath(result, './/p'))
# append result
results.append({'url': url,
'title': title,
diff --git a/searx/engines/dummy-offline.py b/searx/engines/dummy-offline.py
new file mode 100644
index 000000000..13a9ecc01
--- /dev/null
+++ b/searx/engines/dummy-offline.py
@@ -0,0 +1,12 @@
+"""
+ Dummy Offline
+
+ @results one result
+ @stable yes
+"""
+
+
+def search(query, request_params):
+ return [{
+ 'result': 'this is what you get',
+ }]
diff --git a/searx/engines/fdroid.py b/searx/engines/fdroid.py
index a6b01a8ee..4066dc716 100644
--- a/searx/engines/fdroid.py
+++ b/searx/engines/fdroid.py
@@ -18,13 +18,13 @@ categories = ['files']
paging = True
# search-url
-base_url = 'https://f-droid.org/'
-search_url = base_url + 'repository/browse/?{query}'
+base_url = 'https://search.f-droid.org/'
+search_url = base_url + '?{query}'
# do search-request
def request(query, params):
- query = urlencode({'fdfilter': query, 'fdpage': params['pageno']})
+ query = urlencode({'q': query, 'page': params['pageno'], 'lang': ''})
params['url'] = search_url.format(query=query)
return params
@@ -35,17 +35,16 @@ def response(resp):
dom = html.fromstring(resp.text)
- for app in dom.xpath('//div[@id="appheader"]'):
- url = app.xpath('./ancestor::a/@href')[0]
- title = app.xpath('./p/span/text()')[0]
- img_src = app.xpath('.//img/@src')[0]
-
- content = extract_text(app.xpath('./p')[0])
- content = content.replace(title, '', 1).strip()
-
- results.append({'url': url,
- 'title': title,
- 'content': content,
- 'img_src': img_src})
+ for app in dom.xpath('//a[@class="package-header"]'):
+ app_url = app.xpath('./@href')[0]
+ app_title = extract_text(app.xpath('./div/h4[@class="package-name"]/text()'))
+ app_content = extract_text(app.xpath('./div/div/span[@class="package-summary"]')).strip() \
+ + ' - ' + extract_text(app.xpath('./div/div/span[@class="package-license"]')).strip()
+ app_img_src = app.xpath('./img[@class="package-icon"]/@src')[0]
+
+ results.append({'url': app_url,
+ 'title': app_title,
+ 'content': app_content,
+ 'img_src': app_img_src})
return results
diff --git a/searx/engines/flickr_noapi.py b/searx/engines/flickr_noapi.py
index 08f07f7ce..c8ee34f7a 100644
--- a/searx/engines/flickr_noapi.py
+++ b/searx/engines/flickr_noapi.py
@@ -17,7 +17,7 @@ from time import time
import re
from searx.engines import logger
from searx.url_utils import urlencode
-
+from searx.utils import ecma_unescape, html_to_text
logger = logger.getChild('flickr-noapi')
@@ -27,7 +27,7 @@ url = 'https://www.flickr.com/'
search_url = url + 'search?{query}&page={page}'
time_range_url = '&min_upload_date={start}&max_upload_date={end}'
photo_url = 'https://www.flickr.com/photos/{userid}/{photoid}'
-regex = re.compile(r"\"search-photos-lite-models\",\"photos\":(.*}),\"totalItems\":", re.DOTALL)
+modelexport_re = re.compile(r"^\s*modelExport:\s*({.*}),$", re.M)
image_sizes = ('o', 'k', 'h', 'b', 'c', 'z', 'n', 'm', 't', 'q', 's')
paging = True
@@ -57,40 +57,44 @@ def request(query, params):
def response(resp):
results = []
- matches = regex.search(resp.text)
+ matches = modelexport_re.search(resp.text)
if matches is None:
return results
match = matches.group(1)
- search_results = loads(match)
-
- if '_data' not in search_results:
- return []
+ model_export = loads(match)
- photos = search_results['_data']
+ if 'legend' not in model_export:
+ return results
- for photo in photos:
+ legend = model_export['legend']
- # In paged configuration, the first pages' photos
- # are represented by a None object
- if photo is None:
- continue
+ # handle empty page
+ if not legend or not legend[0]:
+ return results
+ for index in legend:
+ photo = model_export['main'][index[0]][int(index[1])][index[2]][index[3]][int(index[4])]
+ author = ecma_unescape(photo.get('realname', ''))
+ source = ecma_unescape(photo.get('username', '')) + ' @ Flickr'
+ title = ecma_unescape(photo.get('title', ''))
+ content = html_to_text(ecma_unescape(photo.get('description', '')))
img_src = None
# From the biggest to the lowest format
for image_size in image_sizes:
if image_size in photo['sizes']:
img_src = photo['sizes'][image_size]['url']
+ img_format = 'jpg ' \
+ + str(photo['sizes'][image_size]['width']) \
+ + 'x' \
+ + str(photo['sizes'][image_size]['height'])
break
if not img_src:
logger.debug('cannot find valid image size: {0}'.format(repr(photo)))
continue
- if 'ownerNsid' not in photo:
- continue
-
# For a bigger thumbnail, keep only the url_z, not the url_n
if 'n' in photo['sizes']:
thumbnail_src = photo['sizes']['n']['url']
@@ -99,19 +103,28 @@ def response(resp):
else:
thumbnail_src = img_src
- url = build_flickr_url(photo['ownerNsid'], photo['id'])
-
- title = photo.get('title', '')
-
- author = photo['username']
-
- # append result
- results.append({'url': url,
- 'title': title,
- 'img_src': img_src,
- 'thumbnail_src': thumbnail_src,
- 'content': '',
- 'author': author,
- 'template': 'images.html'})
+ if 'ownerNsid' not in photo:
+ # should not happen, disowned photo? Show it anyway
+ url = img_src
+ else:
+ url = build_flickr_url(photo['ownerNsid'], photo['id'])
+
+ result = {
+ 'url': url,
+ 'img_src': img_src,
+ 'thumbnail_src': thumbnail_src,
+ 'source': source,
+ 'img_format': img_format,
+ 'template': 'images.html'
+ }
+ try:
+ result['author'] = author
+ result['title'] = title
+ result['content'] = content
+ except:
+ result['author'] = ''
+ result['title'] = ''
+ result['content'] = ''
+ results.append(result)
return results
diff --git a/searx/engines/framalibre.py b/searx/engines/framalibre.py
index 146cdaeec..f3441fa5f 100644
--- a/searx/engines/framalibre.py
+++ b/searx/engines/framalibre.py
@@ -10,7 +10,10 @@
@parse url, title, content, thumbnail, img_src
"""
-from cgi import escape
+try:
+ from cgi import escape
+except:
+ from html import escape
from lxml import html
from searx.engines.xpath import extract_text
from searx.url_utils import urljoin, urlencode
diff --git a/searx/engines/genius.py b/searx/engines/genius.py
index b265e9d76..aa5afad9b 100644
--- a/searx/engines/genius.py
+++ b/searx/engines/genius.py
@@ -72,6 +72,7 @@ def parse_album(hit):
result.update({'content': 'Released: {}'.format(year)})
return result
+
parse = {'lyric': parse_lyric, 'song': parse_lyric, 'artist': parse_artist, 'album': parse_album}
diff --git a/searx/engines/gigablast.py b/searx/engines/gigablast.py
index a6aa5d718..2bb29a9fe 100644
--- a/searx/engines/gigablast.py
+++ b/searx/engines/gigablast.py
@@ -14,7 +14,9 @@ import random
from json import loads
from time import time
from lxml.html import fromstring
+from searx.poolrequests import get
from searx.url_utils import urlencode
+from searx.utils import eval_xpath
# engine dependent config
categories = ['general']
@@ -30,13 +32,9 @@ search_string = 'search?{query}'\
'&c=main'\
'&s={offset}'\
'&format=json'\
- '&qh=0'\
- '&qlang={lang}'\
+ '&langcountry={lang}'\
'&ff={safesearch}'\
- '&rxiec={rxieu}'\
- '&ulse={ulse}'\
- '&rand={rxikd}' # current unix timestamp
-
+ '&rand={rxikd}'
# specific xpath variables
results_xpath = '//response//result'
url_xpath = './/url'
@@ -45,9 +43,26 @@ content_xpath = './/sum'
supported_languages_url = 'https://gigablast.com/search?&rxikd=1'
+extra_param = '' # gigablast requires a random extra parameter
+# which can be extracted from the source code of the search page
+
+
+def parse_extra_param(text):
+ global extra_param
+ param_lines = [x for x in text.splitlines() if x.startswith('var url=') or x.startswith('url=url+')]
+ extra_param = ''
+ for l in param_lines:
+ extra_param += l.split("'")[1]
+ extra_param = extra_param.split('&')[-1]
+
+
+def init(engine_settings=None):
+ parse_extra_param(get('http://gigablast.com/search?c=main&qlangcountry=en-us&q=south&s=10').text)
+
# do search-request
def request(query, params):
+ print("EXTRAPARAM:", extra_param)
offset = (params['pageno'] - 1) * number_of_results
if params['language'] == 'all':
@@ -66,13 +81,11 @@ def request(query, params):
search_path = search_string.format(query=urlencode({'q': query}),
offset=offset,
number_of_results=number_of_results,
- rxikd=int(time() * 1000),
- rxieu=random.randint(1000000000, 9999999999),
- ulse=random.randint(100000000, 999999999),
lang=language,
+ rxikd=int(time() * 1000),
safesearch=safesearch)
- params['url'] = base_url + search_path
+ params['url'] = base_url + search_path + '&' + extra_param
return params
@@ -82,7 +95,11 @@ def response(resp):
results = []
# parse results
- response_json = loads(resp.text)
+ try:
+ response_json = loads(resp.text)
+ except:
+ parse_extra_param(resp.text)
+ raise Exception('extra param expired, please reload')
for result in response_json['results']:
# append result
@@ -98,9 +115,9 @@ def response(resp):
def _fetch_supported_languages(resp):
supported_languages = []
dom = fromstring(resp.text)
- links = dom.xpath('//span[@id="menu2"]/a')
+ links = eval_xpath(dom, '//span[@id="menu2"]/a')
for link in links:
- href = link.xpath('./@href')[0].split('lang%3A')
+ href = eval_xpath(link, './@href')[0].split('lang%3A')
if len(href) == 2:
code = href[1].split('_')
if len(code) == 2:
diff --git a/searx/engines/google.py b/searx/engines/google.py
index 03f0523e7..eed3a044e 100644
--- a/searx/engines/google.py
+++ b/searx/engines/google.py
@@ -14,7 +14,7 @@ from lxml import html, etree
from searx.engines.xpath import extract_text, extract_url
from searx import logger
from searx.url_utils import urlencode, urlparse, parse_qsl
-from searx.utils import match_language
+from searx.utils import match_language, eval_xpath
logger = logger.getChild('google engine')
@@ -107,13 +107,12 @@ images_path = '/images'
supported_languages_url = 'https://www.google.com/preferences?#languages'
# specific xpath variables
-results_xpath = '//div[@class="g"]'
-url_xpath = './/h3/a/@href'
-title_xpath = './/h3'
-content_xpath = './/span[@class="st"]'
-content_misc_xpath = './/div[@class="f slp"]'
-suggestion_xpath = '//p[@class="_Bmc"]'
-spelling_suggestion_xpath = '//a[@class="spell"]'
+results_xpath = '//div[contains(@class, "ZINbbc")]'
+url_xpath = './/div[@class="kCrYT"][1]/a/@href'
+title_xpath = './/div[@class="kCrYT"][1]/a/div[1]'
+content_xpath = './/div[@class="kCrYT"][2]//div[contains(@class, "BNeawe")]//div[contains(@class, "BNeawe")]'
+suggestion_xpath = '//div[contains(@class, "ZINbbc")][last()]//div[@class="rVLSBd"]/a//div[contains(@class, "BNeawe")]'
+spelling_suggestion_xpath = '//div[@id="scc"]//a'
# map : detail location
map_address_xpath = './/div[@class="s"]//table//td[2]/span/text()'
@@ -156,7 +155,7 @@ def parse_url(url_string, google_hostname):
# returns extract_text on the first result selected by the xpath or None
def extract_text_from_dom(result, xpath):
- r = result.xpath(xpath)
+ r = eval_xpath(result, xpath)
if len(r) > 0:
return extract_text(r[0])
return None
@@ -199,9 +198,6 @@ def request(query, params):
params['headers']['Accept-Language'] = language + ',' + language + '-' + country
params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
- # Force Internet Explorer 12 user agent to avoid loading the new UI that Searx can't parse
- params['headers']['User-Agent'] = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
-
params['google_hostname'] = google_hostname
return params
@@ -226,21 +222,21 @@ def response(resp):
# convert the text to dom
dom = html.fromstring(resp.text)
- instant_answer = dom.xpath('//div[@id="_vBb"]//text()')
+ instant_answer = eval_xpath(dom, '//div[@id="_vBb"]//text()')
if instant_answer:
results.append({'answer': u' '.join(instant_answer)})
try:
- results_num = int(dom.xpath('//div[@id="resultStats"]//text()')[0]
+ results_num = int(eval_xpath(dom, '//div[@id="resultStats"]//text()')[0]
.split()[1].replace(',', ''))
results.append({'number_of_results': results_num})
except:
pass
# parse results
- for result in dom.xpath(results_xpath):
+ for result in eval_xpath(dom, results_xpath):
try:
- title = extract_text(result.xpath(title_xpath)[0])
- url = parse_url(extract_url(result.xpath(url_xpath), google_url), google_hostname)
+ title = extract_text(eval_xpath(result, title_xpath)[0])
+ url = parse_url(extract_url(eval_xpath(result, url_xpath), google_url), google_hostname)
parsed_url = urlparse(url, google_hostname)
# map result
@@ -249,7 +245,7 @@ def response(resp):
continue
# if parsed_url.path.startswith(maps_path) or parsed_url.netloc.startswith(map_hostname_start):
# print "yooooo"*30
- # x = result.xpath(map_near)
+ # x = eval_xpath(result, map_near)
# if len(x) > 0:
# # map : near the location
# results = results + parse_map_near(parsed_url, x, google_hostname)
@@ -273,9 +269,7 @@ def response(resp):
content = extract_text_from_dom(result, content_xpath)
if content is None:
continue
- content_misc = extract_text_from_dom(result, content_misc_xpath)
- if content_misc is not None:
- content = content_misc + "<br />" + content
+
# append result
results.append({'url': url,
'title': title,
@@ -286,11 +280,11 @@ def response(resp):
continue
# parse suggestion
- for suggestion in dom.xpath(suggestion_xpath):
+ for suggestion in eval_xpath(dom, suggestion_xpath):
# append suggestion
results.append({'suggestion': extract_text(suggestion)})
- for correction in dom.xpath(spelling_suggestion_xpath):
+ for correction in eval_xpath(dom, spelling_suggestion_xpath):
results.append({'correction': extract_text(correction)})
# return results
@@ -299,9 +293,9 @@ def response(resp):
def parse_images(result, google_hostname):
results = []
- for image in result.xpath(images_xpath):
- url = parse_url(extract_text(image.xpath(image_url_xpath)[0]), google_hostname)
- img_src = extract_text(image.xpath(image_img_src_xpath)[0])
+ for image in eval_xpath(result, images_xpath):
+ url = parse_url(extract_text(eval_xpath(image, image_url_xpath)[0]), google_hostname)
+ img_src = extract_text(eval_xpath(image, image_img_src_xpath)[0])
# append result
results.append({'url': url,
@@ -388,10 +382,10 @@ def attributes_to_html(attributes):
def _fetch_supported_languages(resp):
supported_languages = {}
dom = html.fromstring(resp.text)
- options = dom.xpath('//*[@id="langSec"]//input[@name="lr"]')
+ options = eval_xpath(dom, '//*[@id="langSec"]//input[@name="lr"]')
for option in options:
- code = option.xpath('./@value')[0].split('_')[-1]
- name = option.xpath('./@data-name')[0].title()
+ code = eval_xpath(option, './@value')[0].split('_')[-1]
+ name = eval_xpath(option, './@data-name')[0].title()
supported_languages[code] = {"name": name}
return supported_languages
diff --git a/searx/engines/google_images.py b/searx/engines/google_images.py
index d9a49e9cc..636913114 100644
--- a/searx/engines/google_images.py
+++ b/searx/engines/google_images.py
@@ -70,11 +70,21 @@ def response(resp):
try:
metadata = loads(result)
- img_format = "{0} {1}x{2}".format(metadata['ity'], str(metadata['ow']), str(metadata['oh']))
- source = "{0} ({1})".format(metadata['st'], metadata['isu'])
+
+ img_format = metadata.get('ity', '')
+ img_width = metadata.get('ow', '')
+ img_height = metadata.get('oh', '')
+ if img_width and img_height:
+ img_format += " {0}x{1}".format(img_width, img_height)
+
+ source = metadata.get('st', '')
+ source_url = metadata.get('isu', '')
+ if source_url:
+ source += " ({0})".format(source_url)
+
results.append({'url': metadata['ru'],
'title': metadata['pt'],
- 'content': metadata['s'],
+ 'content': metadata.get('s', ''),
'source': source,
'img_format': img_format,
'thumbnail_src': metadata['tu'],
diff --git a/searx/engines/google_videos.py b/searx/engines/google_videos.py
index 9a41b2dfa..fd6b2e3be 100644
--- a/searx/engines/google_videos.py
+++ b/searx/engines/google_videos.py
@@ -75,15 +75,17 @@ def response(resp):
# get thumbnails
script = str(dom.xpath('//script[contains(., "_setImagesSrc")]')[0].text)
- id = result.xpath('.//div[@class="s"]//img/@id')[0]
- thumbnails_data = re.findall('s=\'(.*?)(?:\\\\[a-z,1-9,\\\\]+\'|\')\;var ii=\[(?:|[\'vidthumb\d+\',]+)\'' + id,
- script)
- tmp = []
- if len(thumbnails_data) != 0:
- tmp = re.findall('(data:image/jpeg;base64,[a-z,A-Z,0-9,/,\+]+)', thumbnails_data[0])
- thumbnail = ''
- if len(tmp) != 0:
- thumbnail = tmp[-1]
+ ids = result.xpath('.//div[@class="s"]//img/@id')
+ if len(ids) > 0:
+ thumbnails_data = \
+ re.findall('s=\'(.*?)(?:\\\\[a-z,1-9,\\\\]+\'|\')\;var ii=\[(?:|[\'vidthumb\d+\',]+)\'' + ids[0],
+ script)
+ tmp = []
+ if len(thumbnails_data) != 0:
+ tmp = re.findall('(data:image/jpeg;base64,[a-z,A-Z,0-9,/,\+]+)', thumbnails_data[0])
+ thumbnail = ''
+ if len(tmp) != 0:
+ thumbnail = tmp[-1]
# append result
results.append({'url': url,
diff --git a/searx/engines/ina.py b/searx/engines/ina.py
index 37a05f099..ea509649f 100644
--- a/searx/engines/ina.py
+++ b/searx/engines/ina.py
@@ -32,7 +32,7 @@ base_url = 'https://www.ina.fr'
search_url = base_url + '/layout/set/ajax/recherche/result?autopromote=&hf={ps}&b={start}&type=Video&r=&{query}'
# specific xpath variables
-results_xpath = '//div[contains(@class,"search-results--list")]/div[@class="media"]'
+results_xpath = '//div[contains(@class,"search-results--list")]//div[@class="media-body"]'
url_xpath = './/a/@href'
title_xpath = './/h3[@class="h3--title media-heading"]'
thumbnail_xpath = './/img/@src'
@@ -65,8 +65,11 @@ def response(resp):
videoid = result.xpath(url_xpath)[0]
url = base_url + videoid
title = p.unescape(extract_text(result.xpath(title_xpath)))
- thumbnail = extract_text(result.xpath(thumbnail_xpath)[0])
- if thumbnail[0] == '/':
+ try:
+ thumbnail = extract_text(result.xpath(thumbnail_xpath)[0])
+ except:
+ thumbnail = ''
+ if thumbnail and thumbnail[0] == '/':
thumbnail = base_url + thumbnail
d = extract_text(result.xpath(publishedDate_xpath)[0])
d = d.split('/')
diff --git a/searx/engines/invidious.py b/searx/engines/invidious.py
new file mode 100644
index 000000000..8d81691fc
--- /dev/null
+++ b/searx/engines/invidious.py
@@ -0,0 +1,100 @@
+# Invidious (Videos)
+#
+# @website https://invidio.us/
+# @provide-api yes (https://github.com/omarroth/invidious/wiki/API)
+#
+# @using-api yes
+# @results JSON
+# @stable yes
+# @parse url, title, content, publishedDate, thumbnail, embedded
+
+from searx.url_utils import quote_plus
+from dateutil import parser
+import time
+
+# engine dependent config
+categories = ["videos", "music"]
+paging = True
+language_support = True
+time_range_support = True
+
+# search-url
+base_url = "https://invidio.us/"
+
+
+# do search-request
+def request(query, params):
+ time_range_dict = {
+ "day": "today",
+ "week": "week",
+ "month": "month",
+ "year": "year",
+ }
+ search_url = base_url + "api/v1/search?q={query}"
+ params["url"] = search_url.format(
+ query=quote_plus(query)
+ ) + "&page={pageno}".format(pageno=params["pageno"])
+
+ if params["time_range"] in time_range_dict:
+ params["url"] += "&date={timerange}".format(
+ timerange=time_range_dict[params["time_range"]]
+ )
+
+ if params["language"] != "all":
+ lang = params["language"].split("-")
+ if len(lang) == 2:
+ params["url"] += "&range={lrange}".format(lrange=lang[1])
+
+ return params
+
+
+# get response from search-request
+def response(resp):
+ results = []
+
+ search_results = resp.json()
+ embedded_url = (
+ '<iframe width="540" height="304" '
+ + 'data-src="'
+ + base_url
+ + 'embed/{videoid}" '
+ + 'frameborder="0" allowfullscreen></iframe>'
+ )
+
+ base_invidious_url = base_url + "watch?v="
+
+ for result in search_results:
+ rtype = result.get("type", None)
+ if rtype == "video":
+ videoid = result.get("videoId", None)
+ if not videoid:
+ continue
+
+ url = base_invidious_url + videoid
+ embedded = embedded_url.format(videoid=videoid)
+ thumbs = result.get("videoThumbnails", [])
+ thumb = next(
+ (th for th in thumbs if th["quality"] == "sddefault"), None
+ )
+ if thumb:
+ thumbnail = thumb.get("url", "")
+ else:
+ thumbnail = ""
+
+ publishedDate = parser.parse(
+ time.ctime(result.get("published", 0))
+ )
+
+ results.append(
+ {
+ "url": url,
+ "title": result.get("title", ""),
+ "content": result.get("description", ""),
+ "template": "videos.html",
+ "publishedDate": publishedDate,
+ "embedded": embedded,
+ "thumbnail": thumbnail,
+ }
+ )
+
+ return results
diff --git a/searx/engines/microsoft_academic.py b/searx/engines/microsoft_academic.py
index 9387b08d0..9bac0069c 100644
--- a/searx/engines/microsoft_academic.py
+++ b/searx/engines/microsoft_academic.py
@@ -45,6 +45,8 @@ def request(query, params):
def response(resp):
results = []
response_data = loads(resp.text)
+ if not response_data:
+ return results
for result in response_data['results']:
url = _get_url(result)
diff --git a/searx/engines/openstreetmap.py b/searx/engines/openstreetmap.py
index 733ba6203..cec10a3c7 100644
--- a/searx/engines/openstreetmap.py
+++ b/searx/engines/openstreetmap.py
@@ -24,7 +24,7 @@ result_base_url = 'https://openstreetmap.org/{osm_type}/{osm_id}'
# do search-request
def request(query, params):
- params['url'] = base_url + search_string.format(query=query)
+ params['url'] = base_url + search_string.format(query=query.decode('utf-8'))
return params
diff --git a/searx/engines/qwant.py b/searx/engines/qwant.py
index de12955c6..54e9dafad 100644
--- a/searx/engines/qwant.py
+++ b/searx/engines/qwant.py
@@ -50,6 +50,7 @@ def request(query, params):
language = match_language(params['language'], supported_languages, language_aliases)
params['url'] += '&locale=' + language.replace('-', '_').lower()
+ params['headers']['User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0'
return params
diff --git a/searx/engines/scanr_structures.py b/searx/engines/scanr_structures.py
index 72fd2b3c9..7208dcb70 100644
--- a/searx/engines/scanr_structures.py
+++ b/searx/engines/scanr_structures.py
@@ -29,7 +29,7 @@ def request(query, params):
params['url'] = search_url
params['method'] = 'POST'
params['headers']['Content-type'] = "application/json"
- params['data'] = dumps({"query": query,
+ params['data'] = dumps({"query": query.decode('utf-8'),
"searchField": "ALL",
"sortDirection": "ASC",
"sortOrder": "RELEVANCY",
diff --git a/searx/engines/seedpeer.py b/searx/engines/seedpeer.py
new file mode 100644
index 000000000..f9b1f99c8
--- /dev/null
+++ b/searx/engines/seedpeer.py
@@ -0,0 +1,78 @@
+# Seedpeer (Videos, Music, Files)
+#
+# @website https://seedpeer.me
+# @provide-api no (nothing found)
+#
+# @using-api no
+# @results HTML (using search portal)
+# @stable yes (HTML can change)
+# @parse url, title, content, seed, leech, magnetlink
+
+from lxml import html
+from json import loads
+from operator import itemgetter
+from searx.url_utils import quote, urljoin
+from searx.engines.xpath import extract_text
+
+
+url = 'https://seedpeer.me/'
+search_url = url + 'search/{search_term}?page={page_no}'
+torrent_file_url = url + 'torrent/{torrent_hash}'
+
+# specific xpath variables
+script_xpath = '//script[@type="text/javascript"][not(@src)]'
+torrent_xpath = '(//table)[2]/tbody/tr'
+link_xpath = '(./td)[1]/a/@href'
+age_xpath = '(./td)[2]'
+size_xpath = '(./td)[3]'
+
+
+# do search-request
+def request(query, params):
+ params['url'] = search_url.format(search_term=quote(query),
+ page_no=params['pageno'])
+ return params
+
+
+# get response from search-request
+def response(resp):
+ results = []
+ dom = html.fromstring(resp.text)
+ result_rows = dom.xpath(torrent_xpath)
+
+ try:
+ script_element = dom.xpath(script_xpath)[0]
+ json_string = script_element.text[script_element.text.find('{'):]
+ torrents_json = loads(json_string)
+ except:
+ return []
+
+ # parse results
+ for torrent_row, torrent_json in zip(result_rows, torrents_json['data']['list']):
+ title = torrent_json['name']
+ seed = int(torrent_json['seeds'])
+ leech = int(torrent_json['peers'])
+ size = int(torrent_json['size'])
+ torrent_hash = torrent_json['hash']
+
+ torrentfile = torrent_file_url.format(torrent_hash=torrent_hash)
+ magnetlink = 'magnet:?xt=urn:btih:{}'.format(torrent_hash)
+
+ age = extract_text(torrent_row.xpath(age_xpath))
+ link = torrent_row.xpath(link_xpath)[0]
+
+ href = urljoin(url, link)
+
+ # append result
+ results.append({'url': href,
+ 'title': title,
+ 'content': age,
+ 'seed': seed,
+ 'leech': leech,
+ 'filesize': size,
+ 'torrentfile': torrentfile,
+ 'magnetlink': magnetlink,
+ 'template': 'torrent.html'})
+
+ # return results sorted by seeder
+ return sorted(results, key=itemgetter('seed'), reverse=True)
diff --git a/searx/engines/soundcloud.py b/searx/engines/soundcloud.py
index d59755e04..284689bf6 100644
--- a/searx/engines/soundcloud.py
+++ b/searx/engines/soundcloud.py
@@ -28,8 +28,10 @@ categories = ['music']
paging = True
# search-url
-url = 'https://api.soundcloud.com/'
+# missing attribute: user_id, app_version, app_locale
+url = 'https://api-v2.soundcloud.com/'
search_url = url + 'search?{query}'\
+ '&variant_ids='\
'&facet=model'\
'&limit=20'\
'&offset={offset}'\
@@ -49,7 +51,9 @@ def get_client_id():
if response.ok:
tree = html.fromstring(response.content)
- script_tags = tree.xpath("//script[contains(@src, '/assets/app')]")
+ # script_tags has been moved from /assets/app/ to /assets/ path. I
+ # found client_id in https://a-v2.sndcdn.com/assets/49-a0c01933-3.js
+ script_tags = tree.xpath("//script[contains(@src, '/assets/')]")
app_js_urls = [script_tag.get('src') for script_tag in script_tags if script_tag is not None]
# extracts valid app_js urls from soundcloud.com content
@@ -57,14 +61,14 @@ def get_client_id():
# gets app_js and searches for the clientid
response = http_get(app_js_url)
if response.ok:
- cids = cid_re.search(response.text)
+ cids = cid_re.search(response.content.decode("utf-8"))
if cids is not None and len(cids.groups()):
return cids.groups()[0]
logger.warning("Unable to fetch guest client_id from SoundCloud, check parser!")
return ""
-def init():
+def init(engine_settings=None):
global guest_client_id
# api-key
guest_client_id = get_client_id()
diff --git a/searx/engines/spotify.py b/searx/engines/spotify.py
index aed756be3..00c395706 100644
--- a/searx/engines/spotify.py
+++ b/searx/engines/spotify.py
@@ -12,10 +12,14 @@
from json import loads
from searx.url_utils import urlencode
+import requests
+import base64
# engine dependent config
categories = ['music']
paging = True
+api_client_id = None
+api_client_secret = None
# search-url
url = 'https://api.spotify.com/'
@@ -31,6 +35,16 @@ def request(query, params):
params['url'] = search_url.format(query=urlencode({'q': query}), offset=offset)
+ r = requests.post(
+ 'https://accounts.spotify.com/api/token',
+ data={'grant_type': 'client_credentials'},
+ headers={'Authorization': 'Basic ' + base64.b64encode(
+ "{}:{}".format(api_client_id, api_client_secret).encode('utf-8')
+ ).decode('utf-8')}
+ )
+ j = loads(r.text)
+ params['headers'] = {'Authorization': 'Bearer {}'.format(j.get('access_token'))}
+
return params
diff --git a/searx/engines/startpage.py b/searx/engines/startpage.py
index 6638f3d83..76567396f 100644
--- a/searx/engines/startpage.py
+++ b/searx/engines/startpage.py
@@ -15,6 +15,8 @@ from dateutil import parser
from datetime import datetime, timedelta
import re
from searx.engines.xpath import extract_text
+from searx.languages import language_codes
+from searx.utils import eval_xpath
# engine dependent config
categories = ['general']
@@ -22,7 +24,7 @@ categories = ['general']
# (probably the parameter qid), require
# storing of qid's between mulitble search-calls
-# paging = False
+paging = True
language_support = True
# search-url
@@ -32,23 +34,32 @@ search_url = base_url + 'do/search'
# specific xpath variables
# ads xpath //div[@id="results"]/div[@id="sponsored"]//div[@class="result"]
# not ads: div[@class="result"] are the direct childs of div[@id="results"]
-results_xpath = '//li[contains(@class, "search-result") and contains(@class, "search-item")]'
-link_xpath = './/h3/a'
-content_xpath = './p[@class="search-item__body"]'
+results_xpath = '//div[@class="w-gl__result"]'
+link_xpath = './/a[@class="w-gl__result-title"]'
+content_xpath = './/p[@class="w-gl__description"]'
# do search-request
def request(query, params):
- offset = (params['pageno'] - 1) * 10
params['url'] = search_url
params['method'] = 'POST'
- params['data'] = {'query': query,
- 'startat': offset}
+ params['data'] = {
+ 'query': query,
+ 'page': params['pageno'],
+ 'cat': 'web',
+ 'cmd': 'process_search',
+ 'engine0': 'v1all',
+ }
# set language if specified
if params['language'] != 'all':
- params['data']['with_language'] = ('lang_' + params['language'].split('-')[0])
+ language = 'english'
+ for lc, _, _, lang in language_codes:
+ if lc == params['language']:
+ language = lang
+ params['data']['language'] = language
+ params['data']['lui'] = language
return params
@@ -60,8 +71,8 @@ def response(resp):
dom = html.fromstring(resp.text)
# parse results
- for result in dom.xpath(results_xpath):
- links = result.xpath(link_xpath)
+ for result in eval_xpath(dom, results_xpath):
+ links = eval_xpath(result, link_xpath)
if not links:
continue
link = links[0]
@@ -77,8 +88,8 @@ def response(resp):
title = extract_text(link)
- if result.xpath(content_xpath):
- content = extract_text(result.xpath(content_xpath))
+ if eval_xpath(result, content_xpath):
+ content = extract_text(eval_xpath(result, content_xpath))
else:
content = ''
diff --git a/searx/engines/vimeo.py b/searx/engines/vimeo.py
index 1408be8df..a92271019 100644
--- a/searx/engines/vimeo.py
+++ b/searx/engines/vimeo.py
@@ -24,7 +24,7 @@ paging = True
base_url = 'https://vimeo.com/'
search_url = base_url + '/search/page:{pageno}?{query}'
-embedded_url = '<iframe data-src="//player.vimeo.com/video/{videoid}" ' +\
+embedded_url = '<iframe data-src="https://player.vimeo.com/video/{videoid}" ' +\
'width="540" height="304" frameborder="0" ' +\
'webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>'
diff --git a/searx/engines/wikidata.py b/searx/engines/wikidata.py
index 03a58a31a..e913b3915 100644
--- a/searx/engines/wikidata.py
+++ b/searx/engines/wikidata.py
@@ -16,10 +16,11 @@ from searx.poolrequests import get
from searx.engines.xpath import extract_text
from searx.engines.wikipedia import _fetch_supported_languages, supported_languages_url
from searx.url_utils import urlencode
-from searx.utils import match_language
+from searx.utils import match_language, eval_xpath
from json import loads
from lxml.html import fromstring
+from lxml import etree
logger = logger.getChild('wikidata')
result_count = 1
@@ -27,23 +28,23 @@ result_count = 1
# urls
wikidata_host = 'https://www.wikidata.org'
url_search = wikidata_host \
- + '/w/index.php?{query}'
+ + '/w/index.php?{query}&ns0=1'
wikidata_api = wikidata_host + '/w/api.php'
url_detail = wikidata_api\
+ '?action=parse&format=json&{query}'\
- + '&redirects=1&prop=text%7Cdisplaytitle%7Clanglinks%7Crevid'\
- + '&disableeditsection=1&disabletidy=1&preview=1&sectionpreview=1&disabletoc=1&utf8=1&formatversion=2'
+ + '&redirects=1&prop=text%7Cdisplaytitle%7Cparsewarnings'\
+ + '&disableeditsection=1&preview=1&sectionpreview=1&disabletoc=1&utf8=1&formatversion=2'
url_map = 'https://www.openstreetmap.org/'\
+ '?lat={latitude}&lon={longitude}&zoom={zoom}&layers=M'
url_image = 'https://commons.wikimedia.org/wiki/Special:FilePath/{filename}?width=500&height=400'
# xpaths
+div_ids_xpath = '//div[@id]'
wikidata_ids_xpath = '//ul[@class="mw-search-results"]/li//a/@href'
title_xpath = '//*[contains(@class,"wikibase-title-label")]'
description_xpath = '//div[contains(@class,"wikibase-entitytermsview-heading-description")]'
-property_xpath = '//div[@id="{propertyid}"]'
label_xpath = './/div[contains(@class,"wikibase-statementgroupview-property-label")]/a'
url_xpath = './/a[contains(@class,"external free") or contains(@class, "wb-external-id")]'
wikilink_xpath = './/ul[contains(@class,"wikibase-sitelinklistview-listview")]'\
@@ -57,6 +58,15 @@ calendar_name_xpath = './/sup[contains(@class,"wb-calendar-name")]'
media_xpath = value_xpath + '//div[contains(@class,"commons-media-caption")]//a'
+def get_id_cache(result):
+ id_cache = {}
+ for e in eval_xpath(result, div_ids_xpath):
+ id = e.get('id')
+ if id.startswith('P'):
+ id_cache[id] = e
+ return id_cache
+
+
def request(query, params):
params['url'] = url_search.format(
query=urlencode({'search': query}))
@@ -65,8 +75,9 @@ def request(query, params):
def response(resp):
results = []
- html = fromstring(resp.text)
- search_results = html.xpath(wikidata_ids_xpath)
+ htmlparser = etree.HTMLParser()
+ html = fromstring(resp.content.decode("utf-8"), parser=htmlparser)
+ search_results = eval_xpath(html, wikidata_ids_xpath)
if resp.search_params['language'].split('-')[0] == 'all':
language = 'en'
@@ -78,13 +89,13 @@ def response(resp):
wikidata_id = search_result.split('/')[-1]
url = url_detail.format(query=urlencode({'page': wikidata_id, 'uselang': language}))
htmlresponse = get(url)
- jsonresponse = loads(htmlresponse.text)
- results += getDetail(jsonresponse, wikidata_id, language, resp.search_params['language'])
+ jsonresponse = loads(htmlresponse.content.decode("utf-8"))
+ results += getDetail(jsonresponse, wikidata_id, language, resp.search_params['language'], htmlparser)
return results
-def getDetail(jsonresponse, wikidata_id, language, locale):
+def getDetail(jsonresponse, wikidata_id, language, locale, htmlparser):
results = []
urls = []
attributes = []
@@ -95,21 +106,23 @@ def getDetail(jsonresponse, wikidata_id, language, locale):
if not title or not result:
return results
- title = fromstring(title)
- for elem in title.xpath(language_fallback_xpath):
+ title = fromstring(title, parser=htmlparser)
+ for elem in eval_xpath(title, language_fallback_xpath):
elem.getparent().remove(elem)
- title = extract_text(title.xpath(title_xpath))
+ title = extract_text(eval_xpath(title, title_xpath))
- result = fromstring(result)
- for elem in result.xpath(language_fallback_xpath):
+ result = fromstring(result, parser=htmlparser)
+ for elem in eval_xpath(result, language_fallback_xpath):
elem.getparent().remove(elem)
- description = extract_text(result.xpath(description_xpath))
+ description = extract_text(eval_xpath(result, description_xpath))
+
+ id_cache = get_id_cache(result)
# URLS
# official website
- add_url(urls, result, 'P856', results=results)
+ add_url(urls, result, id_cache, 'P856', results=results)
# wikipedia
wikipedia_link_count = 0
@@ -130,30 +143,30 @@ def getDetail(jsonresponse, wikidata_id, language, locale):
# if wikipedia_link_count == 0:
# more wikis
- add_url(urls, result, default_label='Wikivoyage (' + language + ')', link_type=language + 'wikivoyage')
- add_url(urls, result, default_label='Wikiquote (' + language + ')', link_type=language + 'wikiquote')
- add_url(urls, result, default_label='Wikimedia Commons', link_type='commonswiki')
+ add_url(urls, result, id_cache, default_label='Wikivoyage (' + language + ')', link_type=language + 'wikivoyage')
+ add_url(urls, result, id_cache, default_label='Wikiquote (' + language + ')', link_type=language + 'wikiquote')
+ add_url(urls, result, id_cache, default_label='Wikimedia Commons', link_type='commonswiki')
- add_url(urls, result, 'P625', 'OpenStreetMap', link_type='geo')
+ add_url(urls, result, id_cache, 'P625', 'OpenStreetMap', link_type='geo')
# musicbrainz
- add_url(urls, result, 'P434', 'MusicBrainz', 'http://musicbrainz.org/artist/')
- add_url(urls, result, 'P435', 'MusicBrainz', 'http://musicbrainz.org/work/')
- add_url(urls, result, 'P436', 'MusicBrainz', 'http://musicbrainz.org/release-group/')
- add_url(urls, result, 'P966', 'MusicBrainz', 'http://musicbrainz.org/label/')
+ add_url(urls, result, id_cache, 'P434', 'MusicBrainz', 'http://musicbrainz.org/artist/')
+ add_url(urls, result, id_cache, 'P435', 'MusicBrainz', 'http://musicbrainz.org/work/')
+ add_url(urls, result, id_cache, 'P436', 'MusicBrainz', 'http://musicbrainz.org/release-group/')
+ add_url(urls, result, id_cache, 'P966', 'MusicBrainz', 'http://musicbrainz.org/label/')
# IMDb
- add_url(urls, result, 'P345', 'IMDb', 'https://www.imdb.com/', link_type='imdb')
+ add_url(urls, result, id_cache, 'P345', 'IMDb', 'https://www.imdb.com/', link_type='imdb')
# source code repository
- add_url(urls, result, 'P1324')
+ add_url(urls, result, id_cache, 'P1324')
# blog
- add_url(urls, result, 'P1581')
+ add_url(urls, result, id_cache, 'P1581')
# social media links
- add_url(urls, result, 'P2397', 'YouTube', 'https://www.youtube.com/channel/')
- add_url(urls, result, 'P1651', 'YouTube', 'https://www.youtube.com/watch?v=')
- add_url(urls, result, 'P2002', 'Twitter', 'https://twitter.com/')
- add_url(urls, result, 'P2013', 'Facebook', 'https://facebook.com/')
- add_url(urls, result, 'P2003', 'Instagram', 'https://instagram.com/')
+ add_url(urls, result, id_cache, 'P2397', 'YouTube', 'https://www.youtube.com/channel/')
+ add_url(urls, result, id_cache, 'P1651', 'YouTube', 'https://www.youtube.com/watch?v=')
+ add_url(urls, result, id_cache, 'P2002', 'Twitter', 'https://twitter.com/')
+ add_url(urls, result, id_cache, 'P2013', 'Facebook', 'https://facebook.com/')
+ add_url(urls, result, id_cache, 'P2003', 'Instagram', 'https://instagram.com/')
urls.append({'title': 'Wikidata',
'url': 'https://www.wikidata.org/wiki/'
@@ -163,132 +176,132 @@ def getDetail(jsonresponse, wikidata_id, language, locale):
# DATES
# inception date
- add_attribute(attributes, result, 'P571', date=True)
+ add_attribute(attributes, id_cache, 'P571', date=True)
# dissolution date
- add_attribute(attributes, result, 'P576', date=True)
+ add_attribute(attributes, id_cache, 'P576', date=True)
# start date
- add_attribute(attributes, result, 'P580', date=True)
+ add_attribute(attributes, id_cache, 'P580', date=True)
# end date
- add_attribute(attributes, result, 'P582', date=True)
+ add_attribute(attributes, id_cache, 'P582', date=True)
# date of birth
- add_attribute(attributes, result, 'P569', date=True)
+ add_attribute(attributes, id_cache, 'P569', date=True)
# date of death
- add_attribute(attributes, result, 'P570', date=True)
+ add_attribute(attributes, id_cache, 'P570', date=True)
# date of spacecraft launch
- add_attribute(attributes, result, 'P619', date=True)
+ add_attribute(attributes, id_cache, 'P619', date=True)
# date of spacecraft landing
- add_attribute(attributes, result, 'P620', date=True)
+ add_attribute(attributes, id_cache, 'P620', date=True)
# nationality
- add_attribute(attributes, result, 'P27')
+ add_attribute(attributes, id_cache, 'P27')
# country of origin
- add_attribute(attributes, result, 'P495')
+ add_attribute(attributes, id_cache, 'P495')
# country
- add_attribute(attributes, result, 'P17')
+ add_attribute(attributes, id_cache, 'P17')
# headquarters
- add_attribute(attributes, result, 'Q180')
+ add_attribute(attributes, id_cache, 'Q180')
# PLACES
# capital
- add_attribute(attributes, result, 'P36', trim=True)
+ add_attribute(attributes, id_cache, 'P36', trim=True)
# head of state
- add_attribute(attributes, result, 'P35', trim=True)
+ add_attribute(attributes, id_cache, 'P35', trim=True)
# head of government
- add_attribute(attributes, result, 'P6', trim=True)
+ add_attribute(attributes, id_cache, 'P6', trim=True)
# type of government
- add_attribute(attributes, result, 'P122')
+ add_attribute(attributes, id_cache, 'P122')
# official language
- add_attribute(attributes, result, 'P37')
+ add_attribute(attributes, id_cache, 'P37')
# population
- add_attribute(attributes, result, 'P1082', trim=True)
+ add_attribute(attributes, id_cache, 'P1082', trim=True)
# area
- add_attribute(attributes, result, 'P2046')
+ add_attribute(attributes, id_cache, 'P2046')
# currency
- add_attribute(attributes, result, 'P38', trim=True)
+ add_attribute(attributes, id_cache, 'P38', trim=True)
# heigth (building)
- add_attribute(attributes, result, 'P2048')
+ add_attribute(attributes, id_cache, 'P2048')
# MEDIA
# platform (videogames)
- add_attribute(attributes, result, 'P400')
+ add_attribute(attributes, id_cache, 'P400')
# author
- add_attribute(attributes, result, 'P50')
+ add_attribute(attributes, id_cache, 'P50')
# creator
- add_attribute(attributes, result, 'P170')
+ add_attribute(attributes, id_cache, 'P170')
# director
- add_attribute(attributes, result, 'P57')
+ add_attribute(attributes, id_cache, 'P57')
# performer
- add_attribute(attributes, result, 'P175')
+ add_attribute(attributes, id_cache, 'P175')
# developer
- add_attribute(attributes, result, 'P178')
+ add_attribute(attributes, id_cache, 'P178')
# producer
- add_attribute(attributes, result, 'P162')
+ add_attribute(attributes, id_cache, 'P162')
# manufacturer
- add_attribute(attributes, result, 'P176')
+ add_attribute(attributes, id_cache, 'P176')
# screenwriter
- add_attribute(attributes, result, 'P58')
+ add_attribute(attributes, id_cache, 'P58')
# production company
- add_attribute(attributes, result, 'P272')
+ add_attribute(attributes, id_cache, 'P272')
# record label
- add_attribute(attributes, result, 'P264')
+ add_attribute(attributes, id_cache, 'P264')
# publisher
- add_attribute(attributes, result, 'P123')
+ add_attribute(attributes, id_cache, 'P123')
# original network
- add_attribute(attributes, result, 'P449')
+ add_attribute(attributes, id_cache, 'P449')
# distributor
- add_attribute(attributes, result, 'P750')
+ add_attribute(attributes, id_cache, 'P750')
# composer
- add_attribute(attributes, result, 'P86')
+ add_attribute(attributes, id_cache, 'P86')
# publication date
- add_attribute(attributes, result, 'P577', date=True)
+ add_attribute(attributes, id_cache, 'P577', date=True)
# genre
- add_attribute(attributes, result, 'P136')
+ add_attribute(attributes, id_cache, 'P136')
# original language
- add_attribute(attributes, result, 'P364')
+ add_attribute(attributes, id_cache, 'P364')
# isbn
- add_attribute(attributes, result, 'Q33057')
+ add_attribute(attributes, id_cache, 'Q33057')
# software license
- add_attribute(attributes, result, 'P275')
+ add_attribute(attributes, id_cache, 'P275')
# programming language
- add_attribute(attributes, result, 'P277')
+ add_attribute(attributes, id_cache, 'P277')
# version
- add_attribute(attributes, result, 'P348', trim=True)
+ add_attribute(attributes, id_cache, 'P348', trim=True)
# narrative location
- add_attribute(attributes, result, 'P840')
+ add_attribute(attributes, id_cache, 'P840')
# LANGUAGES
# number of speakers
- add_attribute(attributes, result, 'P1098')
+ add_attribute(attributes, id_cache, 'P1098')
# writing system
- add_attribute(attributes, result, 'P282')
+ add_attribute(attributes, id_cache, 'P282')
# regulatory body
- add_attribute(attributes, result, 'P1018')
+ add_attribute(attributes, id_cache, 'P1018')
# language code
- add_attribute(attributes, result, 'P218')
+ add_attribute(attributes, id_cache, 'P218')
# OTHER
# ceo
- add_attribute(attributes, result, 'P169', trim=True)
+ add_attribute(attributes, id_cache, 'P169', trim=True)
# founder
- add_attribute(attributes, result, 'P112')
+ add_attribute(attributes, id_cache, 'P112')
# legal form (company/organization)
- add_attribute(attributes, result, 'P1454')
+ add_attribute(attributes, id_cache, 'P1454')
# operator
- add_attribute(attributes, result, 'P137')
+ add_attribute(attributes, id_cache, 'P137')
# crew members (tripulation)
- add_attribute(attributes, result, 'P1029')
+ add_attribute(attributes, id_cache, 'P1029')
# taxon
- add_attribute(attributes, result, 'P225')
+ add_attribute(attributes, id_cache, 'P225')
# chemical formula
- add_attribute(attributes, result, 'P274')
+ add_attribute(attributes, id_cache, 'P274')
# winner (sports/contests)
- add_attribute(attributes, result, 'P1346')
+ add_attribute(attributes, id_cache, 'P1346')
# number of deaths
- add_attribute(attributes, result, 'P1120')
+ add_attribute(attributes, id_cache, 'P1120')
# currency code
- add_attribute(attributes, result, 'P498')
+ add_attribute(attributes, id_cache, 'P498')
- image = add_image(result)
+ image = add_image(id_cache)
if len(attributes) == 0 and len(urls) == 2 and len(description) == 0:
results.append({
@@ -310,43 +323,42 @@ def getDetail(jsonresponse, wikidata_id, language, locale):
# only returns first match
-def add_image(result):
+def add_image(id_cache):
# P15: route map, P242: locator map, P154: logo, P18: image, P242: map, P41: flag, P2716: collage, P2910: icon
property_ids = ['P15', 'P242', 'P154', 'P18', 'P242', 'P41', 'P2716', 'P2910']
for property_id in property_ids:
- image = result.xpath(property_xpath.replace('{propertyid}', property_id))
- if image:
- image_name = image[0].xpath(media_xpath)
+ image = id_cache.get(property_id, None)
+ if image is not None:
+ image_name = eval_xpath(image, media_xpath)
image_src = url_image.replace('{filename}', extract_text(image_name[0]))
return image_src
# setting trim will only returned high ranked rows OR the first row
-def add_attribute(attributes, result, property_id, default_label=None, date=False, trim=False):
- attribute = result.xpath(property_xpath.replace('{propertyid}', property_id))
- if attribute:
+def add_attribute(attributes, id_cache, property_id, default_label=None, date=False, trim=False):
+ attribute = id_cache.get(property_id, None)
+ if attribute is not None:
if default_label:
label = default_label
else:
- label = extract_text(attribute[0].xpath(label_xpath))
+ label = extract_text(eval_xpath(attribute, label_xpath))
label = label[0].upper() + label[1:]
if date:
trim = True
# remove calendar name
- calendar_name = attribute[0].xpath(calendar_name_xpath)
+ calendar_name = eval_xpath(attribute, calendar_name_xpath)
for calendar in calendar_name:
calendar.getparent().remove(calendar)
concat_values = ""
values = []
first_value = None
- for row in attribute[0].xpath(property_row_xpath):
- if not first_value or not trim or row.xpath(preferred_rank_xpath):
-
- value = row.xpath(value_xpath)
+ for row in eval_xpath(attribute, property_row_xpath):
+ if not first_value or not trim or eval_xpath(row, preferred_rank_xpath):
+ value = eval_xpath(row, value_xpath)
if not value:
continue
value = extract_text(value)
@@ -369,18 +381,18 @@ def add_attribute(attributes, result, property_id, default_label=None, date=Fals
# requires property_id unless it's a wiki link (defined in link_type)
-def add_url(urls, result, property_id=None, default_label=None, url_prefix=None, results=None, link_type=None):
+def add_url(urls, result, id_cache, property_id=None, default_label=None, url_prefix=None, results=None,
+ link_type=None):
links = []
# wiki links don't have property in wikidata page
if link_type and 'wiki' in link_type:
links.append(get_wikilink(result, link_type))
else:
- dom_element = result.xpath(property_xpath.replace('{propertyid}', property_id))
- if dom_element:
- dom_element = dom_element[0]
+ dom_element = id_cache.get(property_id, None)
+ if dom_element is not None:
if not default_label:
- label = extract_text(dom_element.xpath(label_xpath))
+ label = extract_text(eval_xpath(dom_element, label_xpath))
label = label[0].upper() + label[1:]
if link_type == 'geo':
@@ -390,7 +402,7 @@ def add_url(urls, result, property_id=None, default_label=None, url_prefix=None,
links.append(get_imdblink(dom_element, url_prefix))
else:
- url_results = dom_element.xpath(url_xpath)
+ url_results = eval_xpath(dom_element, url_xpath)
for link in url_results:
if link is not None:
if url_prefix:
@@ -410,7 +422,7 @@ def add_url(urls, result, property_id=None, default_label=None, url_prefix=None,
def get_imdblink(result, url_prefix):
- imdb_id = result.xpath(value_xpath)
+ imdb_id = eval_xpath(result, value_xpath)
if imdb_id:
imdb_id = extract_text(imdb_id)
id_prefix = imdb_id[:2]
@@ -430,7 +442,7 @@ def get_imdblink(result, url_prefix):
def get_geolink(result):
- coordinates = result.xpath(value_xpath)
+ coordinates = eval_xpath(result, value_xpath)
if not coordinates:
return None
coordinates = extract_text(coordinates[0])
@@ -477,7 +489,7 @@ def get_geolink(result):
def get_wikilink(result, wikiid):
- url = result.xpath(wikilink_xpath.replace('{wikiid}', wikiid))
+ url = eval_xpath(result, wikilink_xpath.replace('{wikiid}', wikiid))
if not url:
return None
url = url[0]
diff --git a/searx/engines/wikipedia.py b/searx/engines/wikipedia.py
index 4dae735d1..a216ba886 100644
--- a/searx/engines/wikipedia.py
+++ b/searx/engines/wikipedia.py
@@ -21,7 +21,8 @@ search_url = base_url + u'w/api.php?'\
'action=query'\
'&format=json'\
'&{query}'\
- '&prop=extracts|pageimages'\
+ '&prop=extracts|pageimages|pageprops'\
+ '&ppprop=disambiguation'\
'&exintro'\
'&explaintext'\
'&pithumbsize=300'\
@@ -79,12 +80,15 @@ def response(resp):
# wikipedia article's unique id
# first valid id is assumed to be the requested article
+ if 'pages' not in search_result['query']:
+ return results
+
for article_id in search_result['query']['pages']:
page = search_result['query']['pages'][article_id]
if int(article_id) > 0:
break
- if int(article_id) < 0:
+ if int(article_id) < 0 or 'disambiguation' in page.get('pageprops', {}):
return []
title = page.get('title')
@@ -96,6 +100,7 @@ def response(resp):
extract = page.get('extract')
summary = extract_first_paragraph(extract, title, image)
+ summary = summary.replace('() ', '')
# link to wikipedia article
wikipedia_link = base_url.format(language=url_lang(resp.search_params['language'])) \
diff --git a/searx/engines/wolframalpha_noapi.py b/searx/engines/wolframalpha_noapi.py
index 2cbbc5adc..387c9fa17 100644
--- a/searx/engines/wolframalpha_noapi.py
+++ b/searx/engines/wolframalpha_noapi.py
@@ -55,7 +55,7 @@ def obtain_token():
return token
-def init():
+def init(engine_settings=None):
obtain_token()
diff --git a/searx/engines/www1x.py b/searx/engines/www1x.py
index 508803240..f1154b16d 100644
--- a/searx/engines/www1x.py
+++ b/searx/engines/www1x.py
@@ -11,8 +11,8 @@
"""
from lxml import html
-import re
from searx.url_utils import urlencode, urljoin
+from searx.engines.xpath import extract_text
# engine dependent config
categories = ['images']
@@ -34,41 +34,18 @@ def request(query, params):
def response(resp):
results = []
- # get links from result-text
- regex = re.compile('(</a>|<a)')
- results_parts = re.split(regex, resp.text)
-
- cur_element = ''
-
- # iterate over link parts
- for result_part in results_parts:
+ dom = html.fromstring(resp.text)
+ for res in dom.xpath('//div[@class="List-item MainListing"]'):
# processed start and end of link
- if result_part == '<a':
- cur_element = result_part
- continue
- elif result_part != '</a>':
- cur_element += result_part
- continue
-
- cur_element += result_part
-
- # fix xml-error
- cur_element = cur_element.replace('"></a>', '"/></a>')
-
- dom = html.fromstring(cur_element)
- link = dom.xpath('//a')[0]
+ link = res.xpath('//a')[0]
url = urljoin(base_url, link.attrib.get('href'))
- title = link.attrib.get('title', '')
+ title = extract_text(link)
- thumbnail_src = urljoin(base_url, link.xpath('.//img')[0].attrib['src'])
+ thumbnail_src = urljoin(base_url, res.xpath('.//img')[0].attrib['src'])
# TODO: get image with higher resolution
img_src = thumbnail_src
- # check if url is showing to a photo
- if '/photo/' not in url:
- continue
-
# append result
results.append({'url': url,
'title': title,
diff --git a/searx/engines/xpath.py b/searx/engines/xpath.py
index 50f98d935..b75896cc7 100644
--- a/searx/engines/xpath.py
+++ b/searx/engines/xpath.py
@@ -1,12 +1,13 @@
from lxml import html
from lxml.etree import _ElementStringResult, _ElementUnicodeResult
-from searx.utils import html_to_text
+from searx.utils import html_to_text, eval_xpath
from searx.url_utils import unquote, urlencode, urljoin, urlparse
search_url = None
url_xpath = None
content_xpath = None
title_xpath = None
+thumbnail_xpath = False
paging = False
suggestion_xpath = ''
results_xpath = ''
@@ -40,7 +41,9 @@ def extract_text(xpath_results):
return ''.join(xpath_results)
else:
# it's a element
- text = html.tostring(xpath_results, encoding='unicode', method='text', with_tail=False)
+ text = html.tostring(
+ xpath_results, encoding='unicode', method='text', with_tail=False
+ )
text = text.strip().replace('\n', ' ')
return ' '.join(text.split())
@@ -101,22 +104,30 @@ def response(resp):
results = []
dom = html.fromstring(resp.text)
if results_xpath:
- for result in dom.xpath(results_xpath):
- url = extract_url(result.xpath(url_xpath), search_url)
- title = extract_text(result.xpath(title_xpath))
- content = extract_text(result.xpath(content_xpath))
- results.append({'url': url, 'title': title, 'content': content})
+ for result in eval_xpath(dom, results_xpath):
+ url = extract_url(eval_xpath(result, url_xpath), search_url)
+ title = extract_text(eval_xpath(result, title_xpath))
+ content = extract_text(eval_xpath(result, content_xpath))
+ tmp_result = {'url': url, 'title': title, 'content': content}
+
+ # add thumbnail if available
+ if thumbnail_xpath:
+ thumbnail_xpath_result = eval_xpath(result, thumbnail_xpath)
+ if len(thumbnail_xpath_result) > 0:
+ tmp_result['img_src'] = extract_url(thumbnail_xpath_result, search_url)
+
+ results.append(tmp_result)
else:
for url, title, content in zip(
(extract_url(x, search_url) for
- x in dom.xpath(url_xpath)),
- map(extract_text, dom.xpath(title_xpath)),
- map(extract_text, dom.xpath(content_xpath))
+ x in eval_xpath(dom, url_xpath)),
+ map(extract_text, eval_xpath(dom, title_xpath)),
+ map(extract_text, eval_xpath(dom, content_xpath))
):
results.append({'url': url, 'title': title, 'content': content})
if not suggestion_xpath:
return results
- for suggestion in dom.xpath(suggestion_xpath):
+ for suggestion in eval_xpath(dom, suggestion_xpath):
results.append({'suggestion': extract_text(suggestion)})
return results
diff --git a/searx/engines/yahoo.py b/searx/engines/yahoo.py
index 73b78bcf7..36c1a11f8 100644
--- a/searx/engines/yahoo.py
+++ b/searx/engines/yahoo.py
@@ -14,7 +14,7 @@
from lxml import html
from searx.engines.xpath import extract_text, extract_url
from searx.url_utils import unquote, urlencode
-from searx.utils import match_language
+from searx.utils import match_language, eval_xpath
# engine dependent config
categories = ['general']
@@ -109,21 +109,21 @@ def response(resp):
dom = html.fromstring(resp.text)
try:
- results_num = int(dom.xpath('//div[@class="compPagination"]/span[last()]/text()')[0]
+ results_num = int(eval_xpath(dom, '//div[@class="compPagination"]/span[last()]/text()')[0]
.split()[0].replace(',', ''))
results.append({'number_of_results': results_num})
except:
pass
# parse results
- for result in dom.xpath(results_xpath):
+ for result in eval_xpath(dom, results_xpath):
try:
- url = parse_url(extract_url(result.xpath(url_xpath), search_url))
- title = extract_text(result.xpath(title_xpath)[0])
+ url = parse_url(extract_url(eval_xpath(result, url_xpath), search_url))
+ title = extract_text(eval_xpath(result, title_xpath)[0])
except:
continue
- content = extract_text(result.xpath(content_xpath)[0])
+ content = extract_text(eval_xpath(result, content_xpath)[0])
# append result
results.append({'url': url,
@@ -131,7 +131,7 @@ def response(resp):
'content': content})
# if no suggestion found, return results
- suggestions = dom.xpath(suggestion_xpath)
+ suggestions = eval_xpath(dom, suggestion_xpath)
if not suggestions:
return results
@@ -148,9 +148,9 @@ def response(resp):
def _fetch_supported_languages(resp):
supported_languages = []
dom = html.fromstring(resp.text)
- options = dom.xpath('//div[@id="yschlang"]/span/label/input')
+ options = eval_xpath(dom, '//div[@id="yschlang"]/span/label/input')
for option in options:
- code_parts = option.xpath('./@value')[0][5:].split('_')
+ code_parts = eval_xpath(option, './@value')[0][5:].split('_')
if len(code_parts) == 2:
code = code_parts[0] + '-' + code_parts[1].upper()
else:
diff --git a/searx/engines/youtube_api.py b/searx/engines/youtube_api.py
index 6de18aa2c..bc4c0d58e 100644
--- a/searx/engines/youtube_api.py
+++ b/searx/engines/youtube_api.py
@@ -23,7 +23,7 @@ base_url = 'https://www.googleapis.com/youtube/v3/search'
search_url = base_url + '?part=snippet&{query}&maxResults=20&key={api_key}'
embedded_url = '<iframe width="540" height="304" ' +\
- 'data-src="//www.youtube-nocookie.com/embed/{videoid}" ' +\
+ 'data-src="https://www.youtube-nocookie.com/embed/{videoid}" ' +\
'frameborder="0" allowfullscreen></iframe>'
base_youtube_url = 'https://www.youtube.com/watch?v='
diff --git a/searx/engines/youtube_noapi.py b/searx/engines/youtube_noapi.py
index 3bf25932b..49d0ae604 100644
--- a/searx/engines/youtube_noapi.py
+++ b/searx/engines/youtube_noapi.py
@@ -30,7 +30,7 @@ time_range_dict = {'day': 'Ag',
'year': 'BQ'}
embedded_url = '<iframe width="540" height="304" ' +\
- 'data-src="//www.youtube-nocookie.com/embed/{videoid}" ' +\
+ 'data-src="https://www.youtube-nocookie.com/embed/{videoid}" ' +\
'frameborder="0" allowfullscreen></iframe>'
base_youtube_url = 'https://www.youtube.com/watch?v='
@@ -67,12 +67,8 @@ def response(resp):
if videoid is not None:
url = base_youtube_url + videoid
thumbnail = 'https://i.ytimg.com/vi/' + videoid + '/hqdefault.jpg'
- title = video.get('title', {}).get('simpleText', videoid)
- description_snippet = video.get('descriptionSnippet', {})
- if 'runs' in description_snippet:
- content = reduce(lambda a, b: a + b.get('text', ''), description_snippet.get('runs'), '')
- else:
- content = description_snippet.get('simpleText', '')
+ title = get_text_from_json(video.get('title', {}))
+ content = get_text_from_json(video.get('descriptionSnippet', {}))
embedded = embedded_url.format(videoid=videoid)
# append result
@@ -85,3 +81,10 @@ def response(resp):
# return results
return results
+
+
+def get_text_from_json(element):
+ if 'runs' in element:
+ return reduce(lambda a, b: a + b.get('text', ''), element.get('runs'), '')
+ else:
+ return element.get('simpleText', '')
diff --git a/searx/exceptions.py b/searx/exceptions.py
index c605ddcab..0175acfa3 100644
--- a/searx/exceptions.py
+++ b/searx/exceptions.py
@@ -28,5 +28,6 @@ class SearxParameterException(SearxException):
else:
message = 'Invalid value "' + value + '" for parameter ' + name
super(SearxParameterException, self).__init__(message)
+ self.message = message
self.parameter_name = name
self.parameter_value = value
diff --git a/searx/plugins/https_rewrite.py b/searx/plugins/https_rewrite.py
index 3d986770e..82556017e 100644
--- a/searx/plugins/https_rewrite.py
+++ b/searx/plugins/https_rewrite.py
@@ -225,6 +225,9 @@ def https_url_rewrite(result):
def on_result(request, search, result):
+ if 'parsed_url' not in result:
+ return True
+
if result['parsed_url'].scheme == 'http':
https_url_rewrite(result)
return True
diff --git a/searx/plugins/oa_doi_rewrite.py b/searx/plugins/oa_doi_rewrite.py
index d4942498f..be80beb26 100644
--- a/searx/plugins/oa_doi_rewrite.py
+++ b/searx/plugins/oa_doi_rewrite.py
@@ -35,6 +35,9 @@ def get_doi_resolver(args, preference_doi_resolver):
def on_result(request, search, result):
+ if 'parsed_url' not in result:
+ return True
+
doi = extract_doi(result['parsed_url'])
if doi and len(doi) < 50:
for suffix in ('/', '.pdf', '/full', '/meta', '/abstract'):
diff --git a/searx/plugins/tracker_url_remover.py b/searx/plugins/tracker_url_remover.py
index 630c8a638..33dd621e1 100644
--- a/searx/plugins/tracker_url_remover.py
+++ b/searx/plugins/tracker_url_remover.py
@@ -17,10 +17,10 @@ along with searx. If not, see < http://www.gnu.org/licenses/ >.
from flask_babel import gettext
import re
-from searx.url_utils import urlunparse
+from searx.url_utils import urlunparse, parse_qsl, urlencode
-regexes = {re.compile(r'utm_[^&]+&?'),
- re.compile(r'(wkey|wemail)[^&]+&?'),
+regexes = {re.compile(r'utm_[^&]+'),
+ re.compile(r'(wkey|wemail)[^&]*'),
re.compile(r'&$')}
name = gettext('Tracker URL remover')
@@ -30,16 +30,23 @@ preference_section = 'privacy'
def on_result(request, search, result):
+ if 'parsed_url' not in result:
+ return True
+
query = result['parsed_url'].query
if query == "":
return True
-
- for reg in regexes:
- query = reg.sub('', query)
-
- if query != result['parsed_url'].query:
- result['parsed_url'] = result['parsed_url']._replace(query=query)
- result['url'] = urlunparse(result['parsed_url'])
+ parsed_query = parse_qsl(query)
+
+ changes = 0
+ for i, (param_name, _) in enumerate(list(parsed_query)):
+ for reg in regexes:
+ if reg.match(param_name):
+ parsed_query.pop(i - changes)
+ changes += 1
+ result['parsed_url'] = result['parsed_url']._replace(query=urlencode(parsed_query))
+ result['url'] = urlunparse(result['parsed_url'])
+ break
return True
diff --git a/searx/preferences.py b/searx/preferences.py
index 912e89c01..669232b12 100644
--- a/searx/preferences.py
+++ b/searx/preferences.py
@@ -104,6 +104,31 @@ class MultipleChoiceSetting(EnumStringSetting):
resp.set_cookie(name, ','.join(self.value), max_age=COOKIE_MAX_AGE)
+class SetSetting(Setting):
+ def _post_init(self):
+ if not hasattr(self, 'values'):
+ self.values = set()
+
+ def get_value(self):
+ return ','.join(self.values)
+
+ def parse(self, data):
+ if data == '':
+ self.values = set()
+ return
+
+ elements = data.split(',')
+ for element in elements:
+ self.values.add(element)
+
+ def parse_form(self, data):
+ elements = data.split(',')
+ self.values = set(elements)
+
+ def save(self, name, resp):
+ resp.set_cookie(name, ','.join(self.values), max_age=COOKIE_MAX_AGE)
+
+
class SearchLanguageSetting(EnumStringSetting):
"""Available choices may change, so user's value may not be in choices anymore"""
@@ -272,6 +297,7 @@ class Preferences(object):
self.engines = EnginesSetting('engines', choices=engines)
self.plugins = PluginsSetting('plugins', choices=plugins)
+ self.tokens = SetSetting('tokens')
self.unknown_params = {}
def get_as_url_params(self):
@@ -288,11 +314,16 @@ class Preferences(object):
settings_kv['disabled_plugins'] = ','.join(self.plugins.disabled)
settings_kv['enabled_plugins'] = ','.join(self.plugins.enabled)
+ settings_kv['tokens'] = ','.join(self.tokens.values)
+
return urlsafe_b64encode(compress(urlencode(settings_kv).encode('utf-8'))).decode('utf-8')
def parse_encoded_data(self, input_data):
decoded_data = decompress(urlsafe_b64decode(input_data.encode('utf-8')))
- self.parse_dict({x: y[0] for x, y in parse_qs(unicode(decoded_data)).items()})
+ dict_data = {}
+ for x, y in parse_qs(decoded_data).items():
+ dict_data[x.decode('utf8')] = y[0].decode('utf8')
+ self.parse_dict(dict_data)
def parse_dict(self, input_data):
for user_setting_name, user_setting in input_data.items():
@@ -304,6 +335,8 @@ class Preferences(object):
elif user_setting_name == 'disabled_plugins':
self.plugins.parse_cookie((input_data.get('disabled_plugins', ''),
input_data.get('enabled_plugins', '')))
+ elif user_setting_name == 'tokens':
+ self.tokens.parse(user_setting)
elif not any(user_setting_name.startswith(x) for x in [
'enabled_',
'disabled_',
@@ -325,6 +358,8 @@ class Preferences(object):
enabled_categories.append(user_setting_name[len('category_'):])
elif user_setting_name.startswith('plugin_'):
disabled_plugins.append(user_setting_name)
+ elif user_setting_name == 'tokens':
+ self.tokens.parse_form(user_setting)
else:
self.unknown_params[user_setting_name] = user_setting
self.key_value_settings['categories'].parse_form(enabled_categories)
@@ -343,6 +378,18 @@ class Preferences(object):
user_setting.save(user_setting_name, resp)
self.engines.save(resp)
self.plugins.save(resp)
+ self.tokens.save('tokens', resp)
for k, v in self.unknown_params.items():
resp.set_cookie(k, v, max_age=COOKIE_MAX_AGE)
return resp
+
+ def validate_token(self, engine):
+ valid = True
+ if hasattr(engine, 'tokens') and engine.tokens:
+ valid = False
+ for token in self.tokens.values:
+ if token in engine.tokens:
+ valid = True
+ break
+
+ return valid
diff --git a/searx/query.py b/searx/query.py
index f76bd91d3..79afa0245 100644
--- a/searx/query.py
+++ b/searx/query.py
@@ -43,6 +43,7 @@ class RawTextQuery(object):
self.query_parts = []
self.engines = []
self.languages = []
+ self.timeout_limit = None
self.specific = False
# parse query, if tags are set, which
@@ -69,6 +70,21 @@ class RawTextQuery(object):
self.query_parts.append(query_part)
continue
+ # this force the timeout
+ if query_part[0] == '<':
+ try:
+ raw_timeout_limit = int(query_part[1:])
+ if raw_timeout_limit < 100:
+ # below 100, the unit is the second ( <3 = 3 seconds timeout )
+ self.timeout_limit = float(raw_timeout_limit)
+ else:
+ # 100 or above, the unit is the millisecond ( <850 = 850 milliseconds timeout )
+ self.timeout_limit = raw_timeout_limit / 1000.0
+ parse_next = True
+ except ValueError:
+ # error not reported to the user
+ pass
+
# this force a language
if query_part[0] == ':':
lang = query_part[1:].lower().replace('_', '-')
@@ -145,6 +161,7 @@ class RawTextQuery(object):
self.query_parts[-1] = search_query
else:
self.query_parts.append(search_query)
+ return self
def getSearchQuery(self):
if len(self.query_parts):
@@ -160,14 +177,17 @@ class RawTextQuery(object):
class SearchQuery(object):
"""container for all the search parameters (query, language, etc...)"""
- def __init__(self, query, engines, categories, lang, safesearch, pageno, time_range):
+ def __init__(self, query, engines, categories, lang, safesearch, pageno, time_range,
+ timeout_limit=None, preferences=None):
self.query = query.encode('utf-8')
self.engines = engines
self.categories = categories
self.lang = lang
self.safesearch = safesearch
self.pageno = pageno
- self.time_range = time_range
+ self.time_range = None if time_range in ('', 'None', None) else time_range
+ self.timeout_limit = timeout_limit
+ self.preferences = preferences
def __str__(self):
return str(self.query) + ";" + str(self.engines)
diff --git a/searx/results.py b/searx/results.py
index cb204a682..3b1e4bd62 100644
--- a/searx/results.py
+++ b/searx/results.py
@@ -67,8 +67,9 @@ def merge_two_infoboxes(infobox1, infobox2):
for url2 in infobox2.get('urls', []):
unique_url = True
- for url1 in infobox1.get('urls', []):
- if compare_urls(urlparse(url1.get('url', '')), urlparse(url2.get('url', ''))):
+ parsed_url2 = urlparse(url2.get('url', ''))
+ for url1 in urls1:
+ if compare_urls(urlparse(url1.get('url', '')), parsed_url2):
unique_url = False
break
if unique_url:
@@ -136,6 +137,7 @@ class ResultContainer(object):
self._ordered = False
self.paging = False
self.unresponsive_engines = set()
+ self.timings = []
def extend(self, engine_name, results):
for result in list(results):
@@ -187,8 +189,9 @@ class ResultContainer(object):
add_infobox = True
infobox_id = infobox.get('id', None)
if infobox_id is not None:
+ parsed_url_infobox_id = urlparse(infobox_id)
for existingIndex in self.infoboxes:
- if compare_urls(urlparse(existingIndex.get('id', '')), urlparse(infobox_id)):
+ if compare_urls(urlparse(existingIndex.get('id', '')), parsed_url_infobox_id):
merge_two_infoboxes(existingIndex, infobox)
add_infobox = False
@@ -196,6 +199,13 @@ class ResultContainer(object):
self.infoboxes.append(infobox)
def _merge_result(self, result, position):
+ if 'url' in result:
+ self.__merge_url_result(result, position)
+ return
+
+ self.__merge_result_no_url(result, position)
+
+ def __merge_url_result(self, result, position):
result['parsed_url'] = urlparse(result['url'])
# if the result has no scheme, use http as default
@@ -209,42 +219,60 @@ class ResultContainer(object):
if result.get('content'):
result['content'] = WHITESPACE_REGEX.sub(' ', result['content'])
- # check for duplicates
- duplicated = False
- for merged_result in self._merged_results:
- if compare_urls(result['parsed_url'], merged_result['parsed_url'])\
- and result.get('template') == merged_result.get('template'):
- duplicated = merged_result
- break
-
- # merge duplicates together
+ duplicated = self.__find_duplicated_http_result(result)
if duplicated:
- # using content with more text
- if result_content_len(result.get('content', '')) >\
- result_content_len(duplicated.get('content', '')):
- duplicated['content'] = result['content']
-
- # merge all result's parameters not found in duplicate
- for key in result.keys():
- if not duplicated.get(key):
- duplicated[key] = result.get(key)
-
- # add the new position
- duplicated['positions'].append(position)
-
- # add engine to list of result-engines
- duplicated['engines'].add(result['engine'])
-
- # using https if possible
- if duplicated['parsed_url'].scheme != 'https' and result['parsed_url'].scheme == 'https':
- duplicated['url'] = result['parsed_url'].geturl()
- duplicated['parsed_url'] = result['parsed_url']
+ self.__merge_duplicated_http_result(duplicated, result, position)
+ return
# if there is no duplicate found, append result
- else:
- result['positions'] = [position]
- with RLock():
- self._merged_results.append(result)
+ result['positions'] = [position]
+ with RLock():
+ self._merged_results.append(result)
+
+ def __find_duplicated_http_result(self, result):
+ result_template = result.get('template')
+ for merged_result in self._merged_results:
+ if 'parsed_url' not in merged_result:
+ continue
+ if compare_urls(result['parsed_url'], merged_result['parsed_url'])\
+ and result_template == merged_result.get('template'):
+ if result_template != 'images.html':
+ # not an image, same template, same url : it's a duplicate
+ return merged_result
+ else:
+ # it's an image
+ # it's a duplicate if the parsed_url, template and img_src are differents
+ if result.get('img_src', '') == merged_result.get('img_src', ''):
+ return merged_result
+ return None
+
+ def __merge_duplicated_http_result(self, duplicated, result, position):
+ # using content with more text
+ if result_content_len(result.get('content', '')) >\
+ result_content_len(duplicated.get('content', '')):
+ duplicated['content'] = result['content']
+
+ # merge all result's parameters not found in duplicate
+ for key in result.keys():
+ if not duplicated.get(key):
+ duplicated[key] = result.get(key)
+
+ # add the new position
+ duplicated['positions'].append(position)
+
+ # add engine to list of result-engines
+ duplicated['engines'].add(result['engine'])
+
+ # using https if possible
+ if duplicated['parsed_url'].scheme != 'https' and result['parsed_url'].scheme == 'https':
+ duplicated['url'] = result['parsed_url'].geturl()
+ duplicated['parsed_url'] = result['parsed_url']
+
+ def __merge_result_no_url(self, result, position):
+ result['engines'] = set([result['engine']])
+ result['positions'] = [position]
+ with RLock():
+ self._merged_results.append(result)
def order_results(self):
for result in self._merged_results:
@@ -319,3 +347,13 @@ class ResultContainer(object):
def add_unresponsive_engine(self, engine_error):
self.unresponsive_engines.add(engine_error)
+
+ def add_timing(self, engine_name, engine_time, page_load_time):
+ self.timings.append({
+ 'engine': engines[engine_name].shortcut,
+ 'total': engine_time,
+ 'load': page_load_time
+ })
+
+ def get_timings(self):
+ return self.timings
diff --git a/searx/search.py b/searx/search.py
index b81542f1a..2dcc4c8f7 100644
--- a/searx/search.py
+++ b/searx/search.py
@@ -45,6 +45,16 @@ if sys.version_info[0] == 3:
logger = logger.getChild('search')
number_of_searches = 0
+max_request_timeout = settings.get('outgoing', {}).get('max_request_timeout' or None)
+if max_request_timeout is None:
+ logger.info('max_request_timeout={0}'.format(max_request_timeout))
+else:
+ if isinstance(max_request_timeout, float):
+ logger.info('max_request_timeout={0} second(s)'.format(max_request_timeout))
+ else:
+ logger.critical('outgoing.max_request_timeout if defined has to be float')
+ from sys import exit
+ exit(1)
def send_http_request(engine, request_params):
@@ -67,17 +77,17 @@ def send_http_request(engine, request_params):
return req(request_params['url'], **request_args)
-def search_one_request(engine, query, request_params):
+def search_one_http_request(engine, query, request_params):
# update request parameters dependent on
# search-engine (contained in engines folder)
engine.request(query, request_params)
# ignoring empty urls
if request_params['url'] is None:
- return []
+ return None
if not request_params['url']:
- return []
+ return None
# send request
response = send_http_request(engine, request_params)
@@ -87,7 +97,53 @@ def search_one_request(engine, query, request_params):
return engine.response(response)
+def search_one_offline_request(engine, query, request_params):
+ return engine.search(query, request_params)
+
+
def search_one_request_safe(engine_name, query, request_params, result_container, start_time, timeout_limit):
+ if engines[engine_name].offline:
+ return search_one_offline_request_safe(engine_name, query, request_params, result_container, start_time, timeout_limit) # noqa
+ return search_one_http_request_safe(engine_name, query, request_params, result_container, start_time, timeout_limit)
+
+
+def search_one_offline_request_safe(engine_name, query, request_params, result_container, start_time, timeout_limit):
+ engine = engines[engine_name]
+
+ try:
+ search_results = search_one_offline_request(engine, query, request_params)
+
+ if search_results:
+ result_container.extend(engine_name, search_results)
+
+ engine_time = time() - start_time
+ result_container.add_timing(engine_name, engine_time, engine_time)
+ with threading.RLock():
+ engine.stats['engine_time'] += engine_time
+ engine.stats['engine_time_count'] += 1
+
+ except ValueError as e:
+ record_offline_engine_stats_on_error(engine, result_container, start_time)
+ logger.exception('engine {0} : invalid input : {1}'.format(engine_name, e))
+ except Exception as e:
+ record_offline_engine_stats_on_error(engine, result_container, start_time)
+
+ result_container.add_unresponsive_engine((
+ engine_name,
+ u'{0}: {1}'.format(gettext('unexpected crash'), e),
+ ))
+ logger.exception('engine {0} : exception : {1}'.format(engine_name, e))
+
+
+def record_offline_engine_stats_on_error(engine, result_container, start_time):
+ engine_time = time() - start_time
+ result_container.add_timing(engine.name, engine_time, engine_time)
+
+ with threading.RLock():
+ engine.stats['errors'] += 1
+
+
+def search_one_http_request_safe(engine_name, query, request_params, result_container, start_time, timeout_limit):
# set timeout for all HTTP requests
requests_lib.set_timeout_for_thread(timeout_limit, start_time=start_time)
# reset the HTTP total time
@@ -101,22 +157,31 @@ def search_one_request_safe(engine_name, query, request_params, result_container
try:
# send requests and parse the results
- search_results = search_one_request(engine, query, request_params)
-
- # add results
- result_container.extend(engine_name, search_results)
-
- # update engine time when there is no exception
- with threading.RLock():
- engine.stats['engine_time'] += time() - start_time
- engine.stats['engine_time_count'] += 1
- # update stats with the total HTTP time
- engine.stats['page_load_time'] += requests_lib.get_time_for_thread()
- engine.stats['page_load_count'] += 1
+ search_results = search_one_http_request(engine, query, request_params)
+
+ # check if the engine accepted the request
+ if search_results is not None:
+ # yes, so add results
+ result_container.extend(engine_name, search_results)
+
+ # update engine time when there is no exception
+ engine_time = time() - start_time
+ page_load_time = requests_lib.get_time_for_thread()
+ result_container.add_timing(engine_name, engine_time, page_load_time)
+ with threading.RLock():
+ engine.stats['engine_time'] += engine_time
+ engine.stats['engine_time_count'] += 1
+ # update stats with the total HTTP time
+ engine.stats['page_load_time'] += page_load_time
+ engine.stats['page_load_count'] += 1
except Exception as e:
- search_duration = time() - start_time
+ # Timing
+ engine_time = time() - start_time
+ page_load_time = requests_lib.get_time_for_thread()
+ result_container.add_timing(engine_name, engine_time, page_load_time)
+ # Record the errors
with threading.RLock():
engine.stats['errors'] += 1
@@ -125,14 +190,14 @@ def search_one_request_safe(engine_name, query, request_params, result_container
# requests timeout (connect or read)
logger.error("engine {0} : HTTP requests timeout"
"(search duration : {1} s, timeout: {2} s) : {3}"
- .format(engine_name, search_duration, timeout_limit, e.__class__.__name__))
+ .format(engine_name, engine_time, timeout_limit, e.__class__.__name__))
requests_exception = True
elif (issubclass(e.__class__, requests.exceptions.RequestException)):
result_container.add_unresponsive_engine((engine_name, gettext('request exception')))
# other requests exception
logger.exception("engine {0} : requests exception"
"(search duration : {1} s, timeout: {2} s) : {3}"
- .format(engine_name, search_duration, timeout_limit, e))
+ .format(engine_name, engine_time, timeout_limit, e))
requests_exception = True
else:
result_container.add_unresponsive_engine((
@@ -189,6 +254,13 @@ def default_request_params():
}
+# remove duplicate queries.
+# FIXME: does not fix "!music !soundcloud", because the categories are 'none' and 'music'
+def deduplicate_query_engines(query_engines):
+ uniq_query_engines = {q["category"] + '|' + q["name"]: q for q in query_engines}
+ return uniq_query_engines.values()
+
+
def get_search_query_from_webapp(preferences, form):
# no text for the query ?
if not form.get('q'):
@@ -249,6 +321,18 @@ def get_search_query_from_webapp(preferences, form):
# query_engines
query_engines = raw_text_query.engines
+ # timeout_limit
+ query_timeout = raw_text_query.timeout_limit
+ if query_timeout is None and 'timeout_limit' in form:
+ raw_time_limit = form.get('timeout_limit')
+ if raw_time_limit in ['None', '']:
+ raw_time_limit = None
+ else:
+ try:
+ query_timeout = float(raw_time_limit)
+ except ValueError:
+ raise SearxParameterException('timeout_limit', raw_time_limit)
+
# query_categories
query_categories = []
@@ -319,8 +403,12 @@ def get_search_query_from_webapp(preferences, form):
for engine in categories[categ]
if (engine.name, categ) not in disabled_engines)
- return SearchQuery(query, query_engines, query_categories,
- query_lang, query_safesearch, query_pageno, query_time_range)
+ query_engines = deduplicate_query_engines(query_engines)
+
+ return (SearchQuery(query, query_engines, query_categories,
+ query_lang, query_safesearch, query_pageno,
+ query_time_range, query_timeout, preferences),
+ raw_text_query)
class Search(object):
@@ -332,6 +420,7 @@ class Search(object):
super(Search, self).__init__()
self.search_query = search_query
self.result_container = ResultContainer()
+ self.actual_timeout = None
# do search-request
def search(self):
@@ -361,7 +450,7 @@ class Search(object):
search_query = self.search_query
# max of all selected engine timeout
- timeout_limit = 0
+ default_timeout = 0
# start search-reqest for all selected engines
for selected_engine in search_query.engines:
@@ -370,6 +459,9 @@ class Search(object):
engine = engines[selected_engine['name']]
+ if not search_query.preferences.validate_token(engine):
+ continue
+
# skip suspended engines
if engine.suspend_end_time >= time():
logger.debug('Engine currently suspended: %s', selected_engine['name'])
@@ -384,29 +476,51 @@ class Search(object):
continue
# set default request parameters
- request_params = default_request_params()
- request_params['headers']['User-Agent'] = user_agent
- request_params['category'] = selected_engine['category']
- request_params['pageno'] = search_query.pageno
+ request_params = {}
+ if not engine.offline:
+ request_params = default_request_params()
+ request_params['headers']['User-Agent'] = user_agent
- if hasattr(engine, 'language') and engine.language:
- request_params['language'] = engine.language
- else:
- request_params['language'] = search_query.lang
+ if hasattr(engine, 'language') and engine.language:
+ request_params['language'] = engine.language
+ else:
+ request_params['language'] = search_query.lang
- # 0 = None, 1 = Moderate, 2 = Strict
- request_params['safesearch'] = search_query.safesearch
- request_params['time_range'] = search_query.time_range
+ request_params['safesearch'] = search_query.safesearch
+ request_params['time_range'] = search_query.time_range
+
+ request_params['category'] = selected_engine['category']
+ request_params['pageno'] = search_query.pageno
# append request to list
requests.append((selected_engine['name'], search_query.query, request_params))
- # update timeout_limit
- timeout_limit = max(timeout_limit, engine.timeout)
-
+ # update default_timeout
+ default_timeout = max(default_timeout, engine.timeout)
+
+ # adjust timeout
+ self.actual_timeout = default_timeout
+ query_timeout = self.search_query.timeout_limit
+
+ if max_request_timeout is None and query_timeout is None:
+ # No max, no user query: default_timeout
+ pass
+ elif max_request_timeout is None and query_timeout is not None:
+ # No max, but user query: From user query except if above default
+ self.actual_timeout = min(default_timeout, query_timeout)
+ elif max_request_timeout is not None and query_timeout is None:
+ # Max, no user query: Default except if above max
+ self.actual_timeout = min(default_timeout, max_request_timeout)
+ elif max_request_timeout is not None and query_timeout is not None:
+ # Max & user query: From user query except if above max
+ self.actual_timeout = min(query_timeout, max_request_timeout)
+
+ logger.debug("actual_timeout={0} (default_timeout={1}, ?timeout_limit={2}, max_request_timeout={3})"
+ .format(self.actual_timeout, default_timeout, query_timeout, max_request_timeout))
+
+ # send all search-request
if requests:
- # send all search-request
- search_multiple_requests(requests, self.result_container, start_time, timeout_limit)
+ search_multiple_requests(requests, self.result_container, start_time, self.actual_timeout)
start_new_thread(gc.collect, tuple())
# return results, suggestions, answers and infoboxes
diff --git a/searx/settings.yml b/searx/settings.yml
index 8f1a06a77..ab3de3951 100644
--- a/searx/settings.yml
+++ b/searx/settings.yml
@@ -26,12 +26,15 @@ ui:
# searx supports result proxification using an external service: https://github.com/asciimoo/morty
# uncomment below section if you have running morty proxy
+# the key is base64 encoded (keep the !!binary notation)
+# Note: since commit af77ec3, morty accepts a base64 encoded key.
#result_proxy:
# url : http://127.0.0.1:3000/
-# key : your_morty_proxy_key
+# key : !!binary "your_morty_proxy_key"
outgoing: # communication with search engines
- request_timeout : 2.0 # seconds
+ request_timeout : 2.0 # default timeout in seconds, can be override by engine
+ # max_request_timeout: 10.0 # the maximum timeout in seconds
useragent_suffix : "" # suffix of searx_useragent, could contain informations like an email address to the administrator
pool_connections : 100 # Number of different hosts
pool_maxsize : 10 # Number of simultaneous requests by host
@@ -75,9 +78,10 @@ engines:
categories : science
timeout : 4.0
- - name : base
- engine : base
- shortcut : bs
+# tmp suspended: dh key too small
+# - name : base
+# engine : base
+# shortcut : bs
- name : wikipedia
engine : wikipedia
@@ -112,6 +116,10 @@ engines:
disabled : True
shortcut : bb
+ - name : btdigg
+ engine : btdigg
+ shortcut : bt
+
- name : ccc-tv
engine : xpath
paging : False
@@ -153,11 +161,12 @@ engines:
weight : 2
disabled : True
- - name : digbt
- engine : digbt
- shortcut : dbt
- timeout : 6.0
- disabled : True
+# cloudflare protected
+# - name : digbt
+# engine : digbt
+# shortcut : dbt
+# timeout : 6.0
+# disabled : True
- name : digg
engine : digg
@@ -196,11 +205,11 @@ engines:
- name : etymonline
engine : xpath
paging : True
- search_url : http://etymonline.com/?search={query}&p={pageno}
- url_xpath : //a[contains(@class, "word--")]/@href
- title_xpath : //p[contains(@class, "word__name--")]/text()
- content_xpath : //section[contains(@class, "word__defination")]/object
- first_page_num : 0
+ search_url : https://etymonline.com/search?page={pageno}&q={query}
+ url_xpath : //a[contains(@class, "word__name--")]/@href
+ title_xpath : //a[contains(@class, "word__name--")]
+ content_xpath : //section[contains(@class, "word__defination")]
+ first_page_num : 1
shortcut : et
disabled : True
@@ -308,31 +317,37 @@ engines:
shortcut : gos
- name : google play apps
- engine : xpath
- search_url : https://play.google.com/store/search?q={query}&c=apps
- url_xpath : //a[@class="title"]/@href
- title_xpath : //a[@class="title"]
- content_xpath : //a[@class="subtitle"]
+ engine : xpath
+ search_url : https://play.google.com/store/search?q={query}&c=apps
+ results_xpath : '//div[@class="WHE7ib mpg5gc"]'
+ title_xpath : './/div[@class="RZEgze"]//div[@title and not(@title="")]/a'
+ url_xpath : './/div[@class="RZEgze"]//div[@title and not(@title="")]/a/@href'
+ content_xpath : './/div[@class="RZEgze"]//a[@class="mnKHRc"]'
+ thumbnail_xpath : './/div[@class="uzcko"]/div/span[1]//img/@data-src'
categories : files
shortcut : gpa
disabled : True
- name : google play movies
- engine : xpath
- search_url : https://play.google.com/store/search?q={query}&c=movies
- url_xpath : //a[@class="title"]/@href
- title_xpath : //a[@class="title"]/@title
- content_xpath : //a[contains(@class, "subtitle")]
+ engine : xpath
+ search_url : https://play.google.com/store/search?q={query}&c=movies
+ results_xpath : '//div[@class="WHE7ib mpg5gc"]'
+ title_xpath : './/div[@class="RZEgze"]//div[@title and not(@title="")]/a'
+ url_xpath : './/div[@class="RZEgze"]//div[@title and not(@title="")]/a/@href'
+ content_xpath : './/div[@class="RZEgze"]//a[@class="mnKHRc"]'
+ thumbnail_xpath : './/div[@class="uzcko"]/div/span[1]//img/@data-src'
categories : videos
shortcut : gpm
disabled : True
- name : google play music
- engine : xpath
- search_url : https://play.google.com/store/search?q={query}&c=music
- url_xpath : //a[@class="title"]/@href
- title_xpath : //a[@class="title"]
- content_xpath : //a[@class="subtitle"]
+ engine : xpath
+ search_url : https://play.google.com/store/search?q={query}&c=music
+ results_xpath : '//div[@class="WHE7ib mpg5gc"]'
+ title_xpath : './/div[@class="RZEgze"]//div[@title and not(@title="")]/a'
+ url_xpath : './/div[@class="RZEgze"]//div[@title and not(@title="")]/a/@href'
+ content_xpath : './/div[@class="RZEgze"]//a[@class="mnKHRc"]'
+ thumbnail_xpath : './/div[@class="uzcko"]/div/span[1]//img/@data-src'
categories : music
shortcut : gps
disabled : True
@@ -379,6 +394,12 @@ engines:
timeout : 6.0
disabled : True
+ - name : invidious
+ engine : invidious
+ base_url : 'https://invidio.us/'
+ shortcut: iv
+ timeout : 5.0
+
- name: kickass
engine : kickass
shortcut : kc
@@ -387,7 +408,7 @@ engines:
- name : library genesis
engine : xpath
- search_url : http://libgen.io/search.php?req={query}
+ search_url : https://libgen.is/search.php?req={query}
url_xpath : //a[contains(@href,"bookfi.net")]/@href
title_xpath : //a[contains(@href,"book/")]/text()[1]
content_xpath : //td/a[1][contains(@href,"=author")]/text()
@@ -415,11 +436,25 @@ engines:
engine : mixcloud
shortcut : mc
+ - name : npm
+ engine : json_engine
+ paging : True
+ search_url : https://api.npms.io/v2/search?q={query}&size=25&from={pageno}
+ results_query : results
+ url_query : package/links/npm
+ title_query : package/name
+ content_query : package/description
+ page_size : 25
+ categories : it
+ disabled: True
+ timeout: 5.0
+ shortcut : npm
+
- name : nyaa
engine : nyaa
shortcut : nt
disabled : True
-
+
- name : acgsou
engine : acgsou
shortcut : acg
@@ -429,7 +464,7 @@ engines:
- name : openairedatasets
engine : json_engine
paging : True
- search_url : http://api.openaire.eu/search/datasets?format=json&page={pageno}&size=10&title={query}
+ search_url : https://api.openaire.eu/search/datasets?format=json&page={pageno}&size=10&title={query}
results_query : response/results/result
url_query : metadata/oaf:entity/oaf:result/children/instance/webresource/url/$
title_query : metadata/oaf:entity/oaf:result/title/$
@@ -441,7 +476,7 @@ engines:
- name : openairepublications
engine : json_engine
paging : True
- search_url : http://api.openaire.eu/search/publications?format=json&page={pageno}&size=10&title={query}
+ search_url : https://api.openaire.eu/search/publications?format=json&page={pageno}&size=10&title={query}
results_query : response/results/result
url_query : metadata/oaf:entity/oaf:result/children/instance/webresource/url/$
title_query : metadata/oaf:entity/oaf:result/title/$
@@ -517,10 +552,11 @@ engines:
timeout : 10.0
disabled : True
- - name : scanr structures
- shortcut: scs
- engine : scanr_structures
- disabled : True
+# tmp suspended: bad certificate
+# - name : scanr structures
+# shortcut: scs
+# engine : scanr_structures
+# disabled : True
- name : soundcloud
engine : soundcloud
@@ -563,9 +599,12 @@ engines:
shortcut : se
categories : science
- - name : spotify
- engine : spotify
- shortcut : stf
+# Spotify needs API credentials
+# - name : spotify
+# engine : spotify
+# shortcut : stf
+# api_client_id : *******
+# api_client_secret : *******
- name : startpage
engine : startpage
@@ -669,9 +708,9 @@ engines:
shortcut: vo
categories: social media
search_url : https://searchvoat.co/?t={query}
- url_xpath : //div[@class="entry"]/p/a[@class="title"]/@href
- title_xpath : //div[@class="entry"]/p/a[@class="title"]
- content_xpath : //div[@class="entry"]/p/span[@class="domain"]
+ url_xpath : //div[@class="entry"]//p[@class="title"]/a/@href
+ title_xpath : //div[@class="entry"]//p[@class="title"]/a/text()
+ content_xpath : //div[@class="entry"]//span[@class="domain"]/a/text()
timeout : 10.0
disabled : True
@@ -680,7 +719,7 @@ engines:
shortcut : 1337x
disabled : True
- - name : Duden
+ - name : duden
engine : duden
shortcut : du
disabled : True
@@ -709,10 +748,15 @@ engines:
title_xpath : ./h2
content_xpath : ./p[@class="s"]
suggestion_xpath : /html/body//div[@class="top-info"]/p[@class="top-info spell"]/a
- first_page_num : 1
+ first_page_num : 0
page_size : 10
disabled : True
+ - name : seedpeer
+ shortcut : speu
+ engine : seedpeer
+ categories: files, music, videos
+
# - name : yacy
# engine : yacy
# shortcut : ya
@@ -731,6 +775,7 @@ locales:
en : English
ar : العَرَبِيَّة (Arabic)
bg : Български (Bulgarian)
+ bo : བོད་སྐད་ (Tibetian)
ca : Català (Catalan)
cs : Čeština (Czech)
cy : Cymraeg (Welsh)
@@ -739,6 +784,7 @@ locales:
el_GR : Ελληνικά (Greek_Greece)
eo : Esperanto (Esperanto)
es : Español (Spanish)
+ et : Eesti (Estonian)
eu : Euskara (Basque)
fa_IR : (fārsī) فارسى (Persian)
fi : Suomi (Finnish)
@@ -748,10 +794,13 @@ locales:
he : עברית (Hebrew)
hr : Hrvatski (Croatian)
hu : Magyar (Hungarian)
+ ia : Interlingua (Interlingua)
it : Italiano (Italian)
ja : 日本語 (Japanese)
+ lt : Lietuvių (Lithuanian)
nl : Nederlands (Dutch)
nl_BE : Vlaams (Dutch_Belgium)
+ oc : Lenga D'òc (Occitan)
pl : Polski (Polish)
pt : Português (Portuguese)
pt_BR : Português (Portuguese_Brazil)
@@ -762,16 +811,17 @@ locales:
sr : српски (Serbian)
sv : Svenska (Swedish)
te : తెలుగు (telugu)
+ ta : தமிழ் (Tamil)
tr : Türkçe (Turkish)
uk : українська мова (Ukrainian)
- vi : tiếng việt (㗂越)
+ vi : tiếng việt (Vietnamese)
zh : 中文 (Chinese)
zh_TW : 國語 (Taiwanese Mandarin)
doi_resolvers :
oadoi.org : 'https://oadoi.org/'
doi.org : 'https://doi.org/'
- doai.io : 'http://doai.io/'
- sci-hub.tw : 'http://sci-hub.tw/'
+ doai.io : 'https://doai.io/'
+ sci-hub.tw : 'https://sci-hub.tw/'
default_doi_resolver : 'oadoi.org'
diff --git a/searx/settings_robot.yml b/searx/settings_robot.yml
index 070a0edb6..25f229e56 100644
--- a/searx/settings_robot.yml
+++ b/searx/settings_robot.yml
@@ -39,3 +39,11 @@ engines:
locales:
en : English
hu : Magyar
+
+doi_resolvers :
+ oadoi.org : 'https://oadoi.org/'
+ doi.org : 'https://doi.org/'
+ doai.io : 'https://doai.io/'
+ sci-hub.tw : 'https://sci-hub.tw/'
+
+default_doi_resolver : 'oadoi.org'
diff --git a/searx/static/css/bootstrap.min.css b/searx/static/css/bootstrap.min.css
index 691604be6..1caa22cc6 100644
--- a/searx/static/css/bootstrap.min.css
+++ b/searx/static/css/bootstrap.min.css
@@ -1 +1 @@
-/*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.table td,.table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;width:100% \9;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:34px;line-height:1.42857143 \0}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:normal;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{position:absolute;z-index:-1;opacity:0;filter:alpha(opacity=0)}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{color:#777;min-width:30px;background-color:transparent;background-image:none;box-shadow:none}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate3d(0, -25%, 0);transform:translate3d(0, -25%, 0);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.has-warning .twitter-typeahead .tt-input,.has-warning .twitter-typeahead .tt-hint{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .twitter-typeahead .tt-input:focus,.has-warning .twitter-typeahead .tt-hint:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-error .twitter-typeahead .tt-input,.has-error .twitter-typeahead .tt-hint{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .twitter-typeahead .tt-input:focus,.has-error .twitter-typeahead .tt-hint:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-success .twitter-typeahead .tt-input,.has-success .twitter-typeahead .tt-hint{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .twitter-typeahead .tt-input:focus,.has-success .twitter-typeahead .tt-hint:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.input-group .twitter-typeahead:first-child .tt-input,.input-group .twitter-typeahead:first-child .tt-hint{border-bottom-left-radius:4px;border-top-left-radius:4px}.input-group .twitter-typeahead:last-child .tt-input,.input-group .twitter-typeahead:last-child .tt-hint{border-bottom-right-radius:4px;border-top-right-radius:4px}.input-group.input-group-sm .twitter-typeahead .tt-input,.input-group.input-group-sm .twitter-typeahead .tt-hint{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group.input-group-sm .twitter-typeahead .tt-input,select.input-group.input-group-sm .twitter-typeahead .tt-hint{height:30px;line-height:30px}textarea.input-group.input-group-sm .twitter-typeahead .tt-input,textarea.input-group.input-group-sm .twitter-typeahead .tt-hint,select[multiple].input-group.input-group-sm .twitter-typeahead .tt-input,select[multiple].input-group.input-group-sm .twitter-typeahead .tt-hint{height:auto}.input-group.input-group-sm .twitter-typeahead:not(:first-child):not(:last-child) .tt-input,.input-group.input-group-sm .twitter-typeahead:not(:first-child):not(:last-child) .tt-hint{border-radius:0}.input-group.input-group-sm .twitter-typeahead:first-child .tt-input,.input-group.input-group-sm .twitter-typeahead:first-child .tt-hint{border-bottom-left-radius:3px;border-top-left-radius:3px;border-bottom-right-radius:0;border-top-right-radius:0}.input-group.input-group-sm .twitter-typeahead:last-child .tt-input,.input-group.input-group-sm .twitter-typeahead:last-child .tt-hint{border-bottom-left-radius:0;border-top-left-radius:0;border-bottom-right-radius:3px;border-top-right-radius:3px}.input-group.input-group-lg .twitter-typeahead .tt-input,.input-group.input-group-lg .twitter-typeahead .tt-hint{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group.input-group-lg .twitter-typeahead .tt-input,select.input-group.input-group-lg .twitter-typeahead .tt-hint{height:46px;line-height:46px}textarea.input-group.input-group-lg .twitter-typeahead .tt-input,textarea.input-group.input-group-lg .twitter-typeahead .tt-hint,select[multiple].input-group.input-group-lg .twitter-typeahead .tt-input,select[multiple].input-group.input-group-lg .twitter-typeahead .tt-hint{height:auto}.input-group.input-group-lg .twitter-typeahead:not(:first-child):not(:last-child) .tt-input,.input-group.input-group-lg .twitter-typeahead:not(:first-child):not(:last-child) .tt-hint{border-radius:0}.input-group.input-group-lg .twitter-typeahead:first-child .tt-input,.input-group.input-group-lg .twitter-typeahead:first-child .tt-hint{border-bottom-left-radius:6px;border-top-left-radius:6px;border-bottom-right-radius:0;border-top-right-radius:0}.input-group.input-group-lg .twitter-typeahead:last-child .tt-input,.input-group.input-group-lg .twitter-typeahead:last-child .tt-hint{border-bottom-left-radius:0;border-top-left-radius:0;border-bottom-right-radius:6px;border-top-right-radius:6px}.twitter-typeahead{width:100%}.input-group .twitter-typeahead{display:table-cell !important;float:left}.twitter-typeahead .tt-hint{color:#777}.twitter-typeahead .tt-input{z-index:2}.twitter-typeahead .tt-input[disabled],.twitter-typeahead .tt-input[readonly],fieldset[disabled] .twitter-typeahead .tt-input{cursor:not-allowed;background-color:#eee !important}.tt-dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;min-width:160px;width:100%;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px}.tt-dropdown-menu .tt-suggestion{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap;text-align:left;cursor:pointer !important}.tt-dropdown-menu .tt-suggestion.tt-cursor{text-decoration:none;outline:0;background-color:#f5f5f5;color:#262626}.tt-dropdown-menu .tt-suggestion.tt-cursor a{color:#262626}.tt-dropdown-menu .tt-suggestion p{margin:0} \ No newline at end of file
+/*! normalize.css v3.0.1 | MIT License | git.io/normalize */.sr-only,svg:not(:root){overflow:hidden}hr,img{border:0}body,figure{margin:0}.img-thumbnail,.thumbnail{-o-transition:all .2s ease-in-out}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.pre-scrollable{max-height:340px}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{background:#ff0;color:#000}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{vertical-align:middle}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}.glyphicon,address,cite{font-style:normal}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{blockquote,img,pre,tr{page-break-inside:avoid}*{text-shadow:none!important;color:#000!important;background:0 0!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}.btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.form-control,.navbar-toggle,.open>.dropdown-toggle.btn-danger,.open>.dropdown-toggle.btn-default,.open>.dropdown-toggle.btn-info,.open>.dropdown-toggle.btn-primary,.open>.dropdown-toggle.btn-warning{background-image:none}.img-thumbnail,body{background-color:#fff}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:focus,a:hover{color:#2a6496;text-decoration:underline}a:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;width:100%\9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;width:100%\9;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}dt,label{font-weight:700}address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre{line-height:1.42857143}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{background-color:#fcf8e3;padding:.2em}.list-inline,.list-unstyled{padding-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}pre code,table{background-color:transparent}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}dl,ol,ul{margin-top:0}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child,ol ol,ol ul,ul ol,ul ul{margin-bottom:0}address,dl{margin-bottom:20px}ol,ul{margin-bottom:10px}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.container{width:750px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;color:#777}legend,pre{display:block;color:#333}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}code,kbd{padding:2px 4px;font-size:90%}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}blockquote:after,blockquote:before{content:""}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;box-shadow:none}pre{padding:9.5px;margin:0 0 10px;font-size:13px;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.container,.container-fluid{margin-right:auto;margin-left:auto}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}.container,.container-fluid{padding-left:15px;padding-right:15px}.pre-scrollable{overflow-y:scroll}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-left:-15px;margin-right:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.btn-group>.btn-group,.btn-toolbar .btn-group,.btn-toolbar .input-group,.dropdown-menu{float:left}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset,legend{padding:0;border:0}fieldset{margin:0;min-width:0}legend{width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}.form-control,output{font-size:14px;line-height:1.42857143;color:#555;display:block}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.form-control{width:100%;height:34px;padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline{color:#3c763d}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143\9}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px;margin-top:4px\9}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.form-horizontal .form-group-sm .form-control,.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-horizontal .form-group-lg .form-control,.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.collapsing,.dropdown{position:relative}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-group{display:inline-block}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active:focus,.btn:active:focus,.btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary.active,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu-right,.dropdown-menu.pull-right{left:auto;right:0}.dropdown-header,.dropdown-menu>li>a{display:block;padding:3px 20px;line-height:1.42857143;white-space:nowrap}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{clear:both;font-weight:400;color:#333}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{font-size:12px;color:#777}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group-vertical>.btn:focus,.btn-group>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn .caret,.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group,.input-group-btn>.btn+.btn{margin-left:-1px}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{position:absolute;z-index:-1;opacity:0;filter:alpha(opacity=0)}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.nav>li,.nav>li>a{display:block;position:relative}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px;margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0;border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li{float:none}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#428bca}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar{border-radius:4px}.navbar-header{float:left}.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-left:0;padding-right:0}}.embed-responsive,.modal,.modal-open,.progress{overflow:hidden}@media (max-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}.navbar-static-top{z-index:1000;border-width:0 0 1px}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}.progress-bar-striped,.progress-striped .progress-bar,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}@media (min-width:768px){.navbar-toggle{display:none}.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:8px -15px}@media (min-width:768px){.navbar-form .control-label,.navbar-form .form-group{margin-bottom:0;vertical-align:middle}.navbar-form .form-group{display:inline-block}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.breadcrumb>li,.pagination{display:inline-block}.btn .badge,.btn .label{top:-1px;position:relative}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.pagination{padding-left:0;margin:20px 0;border-radius:4px}.pager li,.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.badge,.label{font-weight:700;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;color:#fff;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;color:#fff;background-color:#777;border-radius:10px}.badge:empty{display:none}.list-group-item,.media-object,.thumbnail{display:block}.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.nav-pills>.active>a>.badge,a.list-group-item.active>.badge{color:#428bca;background-color:#fff}.jumbotron,.jumbotron .h1,.jumbotron h1{color:inherit}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;background-color:#eee}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.alert,.thumbnail{margin-bottom:20px}.alert .alert-link,.close{font-weight:700}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-left:auto;margin-right:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.modal,.modal-backdrop{top:0;right:0;bottom:0;left:0}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.close,.list-group-item>.badge{float:right}.progress-bar-striped,.progress-striped .progress-bar{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{color:#777;min-width:30px;background-color:transparent;background-image:none;box-shadow:none}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-striped .progress-bar-info,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{text-decoration:none;color:#555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#eee;color:#777}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>a{color:inherit}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-title,.panel>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-title{margin-top:0;font-size:16px}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel-group .panel-heading,.panel>.list-group:last-child .list-group-item:last-child,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.list-group:last-child .list-group-item:last-child,.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{font-size:21px;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.carousel-caption,.carousel-control{text-shadow:0 1px 2px rgba(0,0,0,.6)}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-content,.popover,.tt-dropdown-menu{background-clip:padding-box}.modal{display:none;position:fixed;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate3d(0,-25%,0);transform:translate3d(0,-25%,0);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.43px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow,.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:0;border-width:5px 5px 0;border-top-color:#000}.tooltip.top .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.top-left .tooltip-arrow{left:5px}.tooltip.top-right .tooltip-arrow{right:5px}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{border-width:0 5px 5px;border-bottom-color:#000;top:0}.tooltip.bottom .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.bottom-left .tooltip-arrow{left:5px}.tooltip.bottom-right .tooltip-arrow{right:5px}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.carousel,.carousel-inner{position:relative}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.left>.arrow:after,.popover.right>.arrow:after{content:" ";bottom:-10px}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{left:1px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff}.carousel-inner{overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:focus,.carousel-control:hover{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.carousel-caption .btn,.text-hide{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{content:" ";display:table}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}.hidden{visibility:hidden!important}.affix{position:fixed;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}.hidden-lg{display:none!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.has-warning .twitter-typeahead .tt-hint,.has-warning .twitter-typeahead .tt-input{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .twitter-typeahead .tt-hint:focus,.has-warning .twitter-typeahead .tt-input:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-error .twitter-typeahead .tt-hint,.has-error .twitter-typeahead .tt-input{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .twitter-typeahead .tt-hint:focus,.has-error .twitter-typeahead .tt-input:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-success .twitter-typeahead .tt-hint,.has-success .twitter-typeahead .tt-input{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .twitter-typeahead .tt-hint:focus,.has-success .twitter-typeahead .tt-input:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.input-group .twitter-typeahead:first-child .tt-hint,.input-group .twitter-typeahead:first-child .tt-input{border-bottom-left-radius:4px;border-top-left-radius:4px}.input-group .twitter-typeahead:last-child .tt-hint,.input-group .twitter-typeahead:last-child .tt-input{border-bottom-right-radius:4px;border-top-right-radius:4px}.input-group.input-group-sm .twitter-typeahead .tt-hint,.input-group.input-group-sm .twitter-typeahead .tt-input{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group.input-group-sm .twitter-typeahead .tt-hint,select.input-group.input-group-sm .twitter-typeahead .tt-input{height:30px;line-height:30px}select[multiple].input-group.input-group-sm .twitter-typeahead .tt-hint,select[multiple].input-group.input-group-sm .twitter-typeahead .tt-input,textarea.input-group.input-group-sm .twitter-typeahead .tt-hint,textarea.input-group.input-group-sm .twitter-typeahead .tt-input{height:auto}.input-group.input-group-sm .twitter-typeahead:not(:first-child):not(:last-child) .tt-hint,.input-group.input-group-sm .twitter-typeahead:not(:first-child):not(:last-child) .tt-input{border-radius:0}.input-group.input-group-sm .twitter-typeahead:first-child .tt-hint,.input-group.input-group-sm .twitter-typeahead:first-child .tt-input{border-radius:3px 0 0 3px}.input-group.input-group-sm .twitter-typeahead:last-child .tt-hint,.input-group.input-group-sm .twitter-typeahead:last-child .tt-input{border-radius:0 3px 3px 0}.input-group.input-group-lg .twitter-typeahead .tt-hint,.input-group.input-group-lg .twitter-typeahead .tt-input{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group.input-group-lg .twitter-typeahead .tt-hint,select.input-group.input-group-lg .twitter-typeahead .tt-input{height:46px;line-height:46px}select[multiple].input-group.input-group-lg .twitter-typeahead .tt-hint,select[multiple].input-group.input-group-lg .twitter-typeahead .tt-input,textarea.input-group.input-group-lg .twitter-typeahead .tt-hint,textarea.input-group.input-group-lg .twitter-typeahead .tt-input{height:auto}.input-group.input-group-lg .twitter-typeahead:not(:first-child):not(:last-child) .tt-hint,.input-group.input-group-lg .twitter-typeahead:not(:first-child):not(:last-child) .tt-input{border-radius:0}.input-group.input-group-lg .twitter-typeahead:first-child .tt-hint,.input-group.input-group-lg .twitter-typeahead:first-child .tt-input{border-radius:6px 0 0 6px}.input-group.input-group-lg .twitter-typeahead:last-child .tt-hint,.input-group.input-group-lg .twitter-typeahead:last-child .tt-input{border-radius:0 6px 6px 0}.twitter-typeahead{width:100%}.input-group .twitter-typeahead{display:table-cell!important;float:left}.twitter-typeahead .tt-hint{color:#777}.twitter-typeahead .tt-input{z-index:2}.twitter-typeahead .tt-input[disabled],.twitter-typeahead .tt-input[readonly],fieldset[disabled] .twitter-typeahead .tt-input{cursor:not-allowed;background-color:#eee!important}.tt-dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;min-width:160px;width:100%;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.tt-dropdown-menu .tt-suggestion{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap;text-align:left;cursor:pointer!important}.tt-dropdown-menu .tt-suggestion.tt-cursor{text-decoration:none;outline:0;background-color:#f5f5f5;color:#262626}.tt-dropdown-menu .tt-suggestion.tt-cursor a{color:#262626}.tt-dropdown-menu .tt-suggestion p{margin:0} \ No newline at end of file
diff --git a/searx/static/plugins/js/infinite_scroll.js b/searx/static/plugins/js/infinite_scroll.js
index 9cd582d7f..db84a6908 100644
--- a/searx/static/plugins/js/infinite_scroll.js
+++ b/searx/static/plugins/js/infinite_scroll.js
@@ -1,16 +1,22 @@
$(document).ready(function() {
var win = $(window);
win.scroll(function() {
- if ($(document).height() - win.height() == win.scrollTop()) {
+ if ($(document).height() - win.height() - win.scrollTop() < 150) {
var formData = $('#pagination form:last').serialize();
if (formData) {
$('#pagination').html('<div class="loading-spinner"></div>');
- $.post('./', formData, function (data) {
- var body = $(data);
- $('#pagination').remove();
- $('#main_results').append('<hr/>');
- $('#main_results').append(body.find('.result'));
- $('#main_results').append(body.find('#pagination'));
+ $.ajax({
+ type: "POST",
+ url: './',
+ data: formData,
+ dataType: 'html',
+ success: function(data) {
+ var body = $(data);
+ $('#pagination').remove();
+ $('#main_results').append('<hr/>');
+ $('#main_results').append(body.find('.result'));
+ $('#main_results').append(body.find('#pagination'));
+ }
});
}
}
diff --git a/searx/static/plugins/js/vim_hotkeys.js b/searx/static/plugins/js/vim_hotkeys.js
index 13bd070e0..b0f265cb5 100644
--- a/searx/static/plugins/js/vim_hotkeys.js
+++ b/searx/static/plugins/js/vim_hotkeys.js
@@ -125,6 +125,14 @@ $(document).ready(function() {
}
});
+ function nextResult(current, direction) {
+ var next = current[direction]();
+ while (!next.is('.result') && next.length !== 0) {
+ next = next[direction]();
+ }
+ return next
+ }
+
function highlightResult(which) {
return function() {
var current = $('.result[data-vim-selected]');
@@ -157,13 +165,13 @@ $(document).ready(function() {
}
break;
case 'down':
- next = current.next('.result');
+ next = nextResult(current, 'next');
if (next.length === 0) {
next = $('.result:first');
}
break;
case 'up':
- next = current.prev('.result');
+ next = nextResult(current, 'prev');
if (next.length === 0) {
next = $('.result:last');
}
diff --git a/searx/static/themes/courgette/css/style-rtl.css b/searx/static/themes/courgette/css/style-rtl.css
index a725ac1e8..e47453393 100644
--- a/searx/static/themes/courgette/css/style-rtl.css
+++ b/searx/static/themes/courgette/css/style-rtl.css
@@ -1 +1 @@
-.q{padding:.5em 1em .5em 3em}#search_submit{left:0;right:auto}.result .favicon{float:right;margin-left:.5em;margin-right:0}#sidebar{right:auto;left:0}#results{padding:0 32px 0 272px}.search.center{padding-right:0;padding-left:17em}.right{right:auto;left:0}#pagination form+form{float:left;margin-top:-2em}.engine-table{text-align:right} \ No newline at end of file
+#search_submit,#sidebar,.right{right:auto;left:0}.q{padding:.5em 1em .5em 3em}.result .favicon{float:right;margin-left:.5em;margin-right:0}#results{padding:0 32px 0 272px}.search.center{padding-right:0;padding-left:17em}#pagination form+form{float:left;margin-top:-2em}.engine-table{text-align:right} \ No newline at end of file
diff --git a/searx/static/themes/courgette/css/style.css b/searx/static/themes/courgette/css/style.css
index 74fbd2ac9..508c4b605 100644
--- a/searx/static/themes/courgette/css/style.css
+++ b/searx/static/themes/courgette/css/style.css
@@ -1 +1 @@
-*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]{-webkit-appearance:textfield}h2{color:#666;text-transform:uppercase}body{font-family:sans-serif;line-height:1.5;margin:0;background:#eee}html{position:relative;min-height:100%}a{color:#666}.title h1{font-size:7em;color:#3498db;margin:0 auto;line-height:100px;margin-top:-20px;padding-bottom:20px}.center{max-width:70em;text-align:center;background:rgba(255,255,255,0.6);padding:2em;margin:7% auto 0;position:relative}.center.search{position:static;width:auto;background:none;margin:auto;padding-top:1.8em}@media screen and (min-width:1001px){.center:after{content:"";z-index:-1;background:url(../img/bg-body-index.jpg) no-repeat;background-size:cover;width:100%;height:100%;top:0;left:0;position:fixed}.center.search:after{content:none}}.autocompleter-choices{position:absolute;margin:0;padding:0;background:#fff}.autocompleter-choices li{padding:.5em 1em}.autocompleter-choices li:hover{background:#3498db;color:#fff;cursor:pointer}#categories{text-align:center}.top_margin{position:absolute;bottom:-3.5em;width:100%;left:0}.top_margin a{display:inline-block;margin-right:1em;color:#fff;text-decoration:none}.top_margin a:hover,.top_margin a:focus{text-decoration:underline}@media screen and (max-width:1000px){.center{background:none}.top_margin a{color:#333}}.checkbox_container{margin-top:1.5em}.checkbox_container label{padding:.5em 1em;color:#333;cursor:pointer;font-size:.9em}.checkbox_container label:hover{background:#3498db;color:#fff}.checkbox_container input[type="checkbox"]{position:absolute;top:-9999px}.checkbox_container input[type="checkbox"]:checked+label{background:#3498db;color:#fff}#categories_container>div{display:inline-block}#categories .hidden{display:none;position:absolute;bottom:1em;left:0;text-align:center;width:100%;font-size:.9em;font-style:italic;color:#333}#categories:hover .hidden{display:block}@media screen and (max-width:900px){#categories_container{letter-spacing:-5px}#categories_container>div{letter-spacing:normal;margin-top:1em}.checkbox_container{margin:0}.checkbox_container label{display:block;background:#ccc;padding:1em;border:1px solid #fff}.top_margin{position:static}#categories .hidden{position:static;display:block}}@media screen and (max-width:900px) and (min-width:501px){#categories_container>div{width:31%;margin-left:2.333%}#categories_container>div:nth-child(3n+1){margin-left:0}}@media screen and (max-width:500px){#categories_container>div{width:48%;margin-left:2%;font-size:.9em}#categories_container>div:nth-child(2n+1){margin-left:0}.title h1{background:url(../img/searx-mobile.png) no-repeat;width:200px;height:39px}}#search_wrapper{position:relative}.q{padding:.5em 3em .5em 1em;width:100%;font-size:1.5em;border:0;color:#666}#search_submit{position:absolute;top:0;right:0;border:0;background:url("../img/search-icon.png") no-repeat scroll center center / 65% auto #3498db;text-indent:-9999px;width:5em;height:100%;cursor:pointer}#search_submit:hover,#search_submit:focus{background-color:#0665a2}#sidebar{background:#3498db;position:fixed;top:0;right:0;width:15em;height:100%;padding:1.5em;text-align:right}.right{position:fixed;bottom:1.5em;width:15em;right:0;z-index:1;padding:0 1.5em;text-align:right}.right a{color:#fff;display:block;text-decoration:none}.right a:hover,.right a:focus{text-decoration:underline}#preferences{background:url("../img/preference-icon.png") no-repeat right center / 12% auto;padding-right:1.8em}#search_url input{border:0;padding:.5em}#sidebar>div{margin-bottom:1em;color:#fff}#sidebar form{display:inline-block}#sidebar input[type="submit"]{background:#ccc;border:0;padding:.5em 1em;cursor:pointer;margin-top:.5em}#sidebar input[type="submit"]:hover,#sidebar input[type="submit"]:focus{color:#fff;background-color:#0665a2}#results{padding-right:17em;padding-left:2em;padding:0 17em 0 2em}.result p{font-size:.9em}.result .content{margin:0;color:#666}.result .url{margin-top:0;color:#ff6530}.result .favicon{float:left;position:relative;top:.5em;margin-right:.5em}.definition_result{background:#ccc;padding:1em}.definition_result .result_title,.definition_result p{margin:0}.result_title{margin-bottom:0;font-weight:normal}.highlight{font-weight:bold}.result_title a{color:#3498db;text-decoration:none}.result_title a:hover,.result_title a:focus{text-decoration:underline}.cache_link{color:#666;font-size:.9em;font-style:italic}.search.center{padding-right:17em}#answers{border:2px solid #3498db;padding:20px;color:#666;text-align:center;max-width:70em;margin:0 auto 20px}#suggestions{margin-bottom:1em}#suggestions span{color:#666}#suggestions form{display:inline-block;vertical-align:top;margin-bottom:.5em}#suggestions input[type="submit"]{color:#333;padding:.5em 1em;border:0;background:#ccc;cursor:pointer}#suggestions input[type="submit"]:hover,#suggestions input[type="submit"]:focus{background:#3498db;color:#fff}#pagination{margin:1.5em 0 2em}#pagination form+form{float:right;margin-top:-2em}input[type="submit"]{display:inline-block;background:#3498db;color:#fff;border:0;padding:.6em 1em;cursor:pointer}input[type="submit"]:hover,input[type="submit"]:focus{background:#0665a2}.row{max-width:60em;margin:auto}.row a{color:#3498db}.row form{letter-spacing:-5px}.row form>*{letter-spacing:normal}.row p{margin:0}.row fieldset{display:inline-block;width:48%;vertical-align:top}.row fieldset:last-of-type{display:block;width:auto;background:none;padding:0}.row fieldset:nth-child(odd){margin-right:2%}.row fieldset:nth-child(2){min-height:10.5em}@media screen and (max-width:900px){.row{margin:0 1em}.row fieldset{width:49%}.row fieldset,.row fieldset:nth-child(odd){margin-right:0}.row fieldset:first-child{width:100%;margin-right:0}.row fieldset:nth-child(even){margin-right:2%}}@media screen and (max-width:800px){.row fieldset{width:100%}select{width:100%}table{font-size:.8em}.right{display:none}#sidebar{display:none}#results{padding:0 2em}.search.center{padding-right:2em}}@media screen and (max-width:400px){.row #categories_container>div{width:100%;margin-left:0}}fieldset{border:0;margin:1em 0;background:#ccc;padding:1.5em}table{width:100%;text-align:left;border:1px solid #ccc;border-collapse:collapse}table th{background:#999;color:#fff}table tr:nth-child(odd){background:#ccc}table th,table td{padding:.5em 1em;border:1px solid #fff}.engine_checkbox label{padding:.5em;background:#3498db;color:#fff;cursor:pointer}.engine_checkbox .deny{background:#3498db}.engine_checkbox .allow{display:none;background:#666}.engine_checkbox input{display:none}.engine_checkbox input:checked+.allow{display:inline}.engine_checkbox input:checked+.allow+.deny{display:none}.row input[type="submit"]{font-size:1em;margin:1em 0 2em}.row .right{position:static;display:inline-block}.row .right a{color:#333;width:auto;text-align:left;padding:0}.small_font{font-size:.8em}table th{padding:1em}legend{background:#eee;padding:0 1em;position:relative}select{border:1px solid #ddd;padding:.5em .8em;font-size:1em}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#408080;font-style:italic}.highlight .err{border:1px solid #f00}.highlight .k{color:#008000;font-weight:bold}.highlight .o{color:#666}.highlight .cm{color:#408080;font-style:italic}.highlight .cp{color:#bc7a00}.highlight .c1{color:#408080;font-style:italic}.highlight .cs{color:#408080;font-style:italic}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:#f00}.highlight .gh{color:#000080;font-weight:bold}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:#000080;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#800080;font-weight:bold}.highlight .gt{color:#04d}.highlight .kc{color:#008000;font-weight:bold}.highlight .kd{color:#008000;font-weight:bold}.highlight .kn{color:#008000;font-weight:bold}.highlight .kp{color:#008000}.highlight .kr{color:#008000;font-weight:bold}.highlight .kt{color:#b00040}.highlight .m{color:#666}.highlight .s{color:#ba2121}.highlight .na{color:#7d9029}.highlight .nb{color:#008000}.highlight .nc{color:#00f;font-weight:bold}.highlight .no{color:#800}.highlight .nd{color:#a2f}.highlight .ni{color:#999;font-weight:bold}.highlight .ne{color:#d2413a;font-weight:bold}.highlight .nf{color:#00f}.highlight .nl{color:#a0a000}.highlight .nn{color:#00f;font-weight:bold}.highlight .nt{color:#008000;font-weight:bold}.highlight .nv{color:#19177c}.highlight .ow{color:#a2f;font-weight:bold}.highlight .w{color:#bbb}.highlight .mf{color:#666}.highlight .mh{color:#666}.highlight .mi{color:#666}.highlight .mo{color:#666}.highlight .sb{color:#ba2121}.highlight .sc{color:#ba2121}.highlight .sd{color:#ba2121;font-style:italic}.highlight .s2{color:#ba2121}.highlight .se{color:#b62;font-weight:bold}.highlight .sh{color:#ba2121}.highlight .si{color:#b68;font-weight:bold}.highlight .sx{color:#008000}.highlight .sr{color:#b68}.highlight .s1{color:#ba2121}.highlight .ss{color:#19177c}.highlight .bp{color:#008000}.highlight .vc{color:#19177c}.highlight .vg{color:#19177c}.highlight .vi{color:#19177c}.highlight .il{color:#666}.highlight pre{overflow:auto}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.highlight .lineno::selection{background:transparent}.highlight .lineno::-moz-selection{background:transparent} \ No newline at end of file
+a,h2{color:#666}.center,html{position:relative}#categories_container>div,.top_margin a{display:inline-block}#categories,.center{text-align:center}#categories .hidden,.cache_link,.highlight .c,.highlight .cm,.highlight .ge,.highlight .sd{font-style:italic}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]{-webkit-appearance:textfield}h2{text-transform:uppercase}body{font-family:sans-serif;line-height:1.5;margin:0;background:#EEE}html{min-height:100%}.title h1{font-size:7em;color:#3498DB;margin:-20px auto 0;line-height:100px;padding-bottom:20px}.center{max-width:70em;background:rgba(255,255,255,.6);padding:2em;margin:7% auto 0}.center.search{position:static;width:auto;background:0 0;margin:auto;padding-top:1.8em}@media screen and (min-width:1001px){.center:after{content:"";z-index:-1;background:url(../img/bg-body-index.jpg) no-repeat;background-size:cover;width:100%;height:100%;top:0;left:0;position:fixed}.center.search:after{content:none}}.autocompleter-choices{position:absolute;margin:0;padding:0;background:#FFF}.autocompleter-choices li{padding:.5em 1em}.autocompleter-choices li:hover{background:#3498DB;color:#FFF;cursor:pointer}.top_margin{position:absolute;bottom:-3.5em;width:100%;left:0}.top_margin a{margin-right:1em;color:#FFF;text-decoration:none}.top_margin a:focus,.top_margin a:hover{text-decoration:underline}@media screen and (max-width:1000px){.center{background:0 0}.top_margin a{color:#333}}.checkbox_container{margin-top:1.5em}.checkbox_container label{padding:.5em 1em;color:#333;cursor:pointer;font-size:.9em}.checkbox_container input[type=checkbox]:checked+label,.checkbox_container label:hover{background:#3498DB;color:#FFF}.checkbox_container input[type=checkbox]{position:absolute;top:-9999px}#categories .hidden{display:none;position:absolute;bottom:1em;left:0;text-align:center;width:100%;font-size:.9em;color:#333}#categories:hover .hidden,.right a{display:block}@media screen and (max-width:900px){#categories_container{letter-spacing:-5px}#categories_container>div{letter-spacing:normal;margin-top:1em}.checkbox_container{margin:0}.checkbox_container label{display:block;background:#CCC;padding:1em;border:1px solid #FFF}.top_margin{position:static}#categories .hidden{position:static;display:block}}@media screen and (max-width:900px) and (min-width:501px){#categories_container>div{width:31%;margin-left:2.333%}#categories_container>div:nth-child(3n+1){margin-left:0}}@media screen and (max-width:500px){#categories_container>div{width:48%;margin-left:2%;font-size:.9em}#categories_container>div:nth-child(2n+1){margin-left:0}.title h1{background:url(../img/searx-mobile.png) no-repeat;width:200px;height:39px}}#search_wrapper{position:relative}.q{padding:.5em 3em .5em 1em;width:100%;font-size:1.5em;border:0;color:#666}.cache_link,.result p{font-size:.9em}#search_submit{position:absolute;top:0;right:0;border:0;background:url(../img/search-icon.png) center center/65% auto no-repeat #3498DB;text-indent:-9999px;width:5em;height:100%;cursor:pointer}#sidebar,.right{position:fixed;width:15em;right:0;text-align:right}#search_submit:focus,#search_submit:hover{background-color:#0665A2}#sidebar{background:#3498DB;top:0;height:100%;padding:1.5em}.right{bottom:1.5em;z-index:1;padding:0 1.5em}.right a{color:#FFF;text-decoration:none}#sidebar form,#suggestions form,.row fieldset{display:inline-block}.right a:focus,.right a:hover{text-decoration:underline}#preferences{background:url(../img/preference-icon.png) right center/12% auto no-repeat;padding-right:1.8em}#search_url input{border:0;padding:.5em}#sidebar>div{margin-bottom:1em;color:#FFF}#sidebar input[type=submit]{background:#CCC;border:0;padding:.5em 1em;cursor:pointer;margin-top:.5em}#sidebar input[type=submit]:focus,#sidebar input[type=submit]:hover{color:#FFF;background-color:#0665A2}#results{padding:0 17em 0 2em}.result .engines{text-align:right}.result .content{margin:0;color:#666}.result .url{margin-top:0;color:#FF6530}.result .favicon{float:left;position:relative;top:.5em;margin-right:.5em}.definition_result{background:#CCC;padding:1em}.definition_result .result_title,.definition_result p{margin:0}.result_title{margin-bottom:0;font-weight:400}.result_title a{color:#3498DB;text-decoration:none}#answers,#suggestions span{color:#666}.result_title a:focus,.result_title a:hover{text-decoration:underline}.cache_link{color:#666}.search.center{padding-right:17em}#answers{border:2px solid #3498DB;padding:20px;text-align:center;max-width:70em;margin:0 auto 20px}#suggestions{margin-bottom:1em}#suggestions form{vertical-align:top;margin-bottom:.5em}#suggestions input[type=submit]{color:#333;padding:.5em 1em;border:0;background:#CCC;cursor:pointer}#suggestions input[type=submit]:focus,#suggestions input[type=submit]:hover{background:#3498DB;color:#FFF}#pagination{margin:1.5em 0 2em}#pagination form+form{float:right;margin-top:-2em}input[type=submit]{display:inline-block;background:#3498DB;color:#FFF;border:0;padding:.6em 1em;cursor:pointer}input[type=submit]:focus,input[type=submit]:hover{background:#0665A2}.row{max-width:60em;margin:auto}.row a{color:#3498DB}.row form{letter-spacing:-5px}.row form>*{letter-spacing:normal}.row p{margin:0}.row fieldset{width:48%;vertical-align:top}.row fieldset:last-of-type{display:block;width:auto;background:0 0;padding:0}fieldset,table tr:nth-child(odd){background:#CCC}.row fieldset:nth-child(odd){margin-right:2%}.row fieldset:nth-child(2){min-height:10.5em}@media screen and (max-width:900px){.row{margin:0 1em}.row fieldset{width:49%}.row fieldset,.row fieldset:nth-child(odd){margin-right:0}.row fieldset:first-child{width:100%;margin-right:0}.row fieldset:nth-child(even){margin-right:2%}}@media screen and (max-width:800px){.row fieldset,select{width:100%}table{font-size:.8em}#sidebar,.right{display:none}#results{padding:0 2em}.search.center{padding-right:2em}}@media screen and (max-width:400px){.row #categories_container>div{width:100%;margin-left:0}}fieldset{border:0;margin:1em 0;padding:1.5em}table{width:100%;text-align:left;border:1px solid #CCC;border-collapse:collapse}table th{background:#999;color:#FFF}table td,table th{padding:.5em 1em;border:1px solid #FFF}.engine_checkbox label{padding:.5em;background:#3498DB;color:#FFF;cursor:pointer}.engine_checkbox .deny{background:#3498DB}.engine_checkbox .allow{display:none;background:#666}.engine_checkbox input{display:none}.engine_checkbox input:checked+.allow{display:inline}.engine_checkbox input:checked+.allow+.deny{display:none}.row input[type=submit]{font-size:1em;margin:1em 0 2em}.row .right{position:static;display:inline-block}.row .right a{color:#333;width:auto;text-align:left;padding:0}.small_font{font-size:.8em}table th{padding:1em}legend{background:#EEE;padding:0 1em;position:relative}select{border:1px solid #DDD;padding:.5em .8em;font-size:1em}.highlight .hll{background-color:#ffc}.highlight{font-weight:700;background:#f8f8f8}.highlight .c{color:#408080}.highlight .err{border:1px solid red}.highlight .k{color:green;font-weight:700}.highlight .o{color:#666}.highlight .cm{color:#408080}.highlight .cp{color:#BC7A00}.highlight .c1,.highlight .cs{color:#408080;font-style:italic}.highlight .gd{color:#A00000}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00A000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04D}.highlight .kc,.highlight .kd,.highlight .kn{color:green;font-weight:700}.highlight .kp{color:green}.highlight .kr{color:green;font-weight:700}.highlight .kt{color:#B00040}.highlight .m{color:#666}.highlight .s{color:#BA2121}.highlight .na{color:#7D9029}.highlight .nb{color:green}.highlight .nc{color:#00F;font-weight:700}.highlight .no{color:#800}.highlight .nd{color:#A2F}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#00F}.highlight .nl{color:#A0A000}.highlight .nn{color:#00F;font-weight:700}.highlight .nt{color:green;font-weight:700}.highlight .nv{color:#19177C}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#bbb}.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:#666}.highlight .s2,.highlight .sb,.highlight .sc{color:#BA2121}.highlight .sd{color:#BA2121}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#BA2121}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:green}.highlight .sr{color:#B68}.highlight .s1{color:#BA2121}.highlight .ss{color:#19177C}.highlight .bp{color:green}.highlight .vc,.highlight .vg,.highlight .vi{color:#19177C}.highlight .il{color:#666}.highlight pre{overflow:auto}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0} \ No newline at end of file
diff --git a/searx/static/themes/courgette/less/style.less b/searx/static/themes/courgette/less/style.less
index 0387af5c0..26da72812 100644
--- a/searx/static/themes/courgette/less/style.less
+++ b/searx/static/themes/courgette/less/style.less
@@ -325,6 +325,10 @@ a {
font-size: 0.9em;
}
+.result .engines {
+ text-align: right;
+}
+
.result .content {
margin: 0;
color: #666;
diff --git a/searx/static/themes/legacy/css/style.css b/searx/static/themes/legacy/css/style.css
index 71422bc94..ca746a369 100644
--- a/searx/static/themes/legacy/css/style.css
+++ b/searx/static/themes/legacy/css/style.css
@@ -1 +1 @@
-.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#408080;font-style:italic}.highlight .err{border:1px solid #f00}.highlight .k{color:#008000;font-weight:bold}.highlight .o{color:#666}.highlight .cm{color:#408080;font-style:italic}.highlight .cp{color:#bc7a00}.highlight .c1{color:#408080;font-style:italic}.highlight .cs{color:#408080;font-style:italic}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:#f00}.highlight .gh{color:#000080;font-weight:bold}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:#000080;font-weight:bold}.highlight .gs{font-weight:bold}.highlight .gu{color:#800080;font-weight:bold}.highlight .gt{color:#04d}.highlight .kc{color:#008000;font-weight:bold}.highlight .kd{color:#008000;font-weight:bold}.highlight .kn{color:#008000;font-weight:bold}.highlight .kp{color:#008000}.highlight .kr{color:#008000;font-weight:bold}.highlight .kt{color:#b00040}.highlight .m{color:#666}.highlight .s{color:#ba2121}.highlight .na{color:#7d9029}.highlight .nb{color:#008000}.highlight .nc{color:#00f;font-weight:bold}.highlight .no{color:#800}.highlight .nd{color:#a2f}.highlight .ni{color:#999;font-weight:bold}.highlight .ne{color:#d2413a;font-weight:bold}.highlight .nf{color:#00f}.highlight .nl{color:#a0a000}.highlight .nn{color:#00f;font-weight:bold}.highlight .nt{color:#008000;font-weight:bold}.highlight .nv{color:#19177c}.highlight .ow{color:#a2f;font-weight:bold}.highlight .w{color:#bbb}.highlight .mf{color:#666}.highlight .mh{color:#666}.highlight .mi{color:#666}.highlight .mo{color:#666}.highlight .sb{color:#ba2121}.highlight .sc{color:#ba2121}.highlight .sd{color:#ba2121;font-style:italic}.highlight .s2{color:#ba2121}.highlight .se{color:#b62;font-weight:bold}.highlight .sh{color:#ba2121}.highlight .si{color:#b68;font-weight:bold}.highlight .sx{color:#008000}.highlight .sr{color:#b68}.highlight .s1{color:#ba2121}.highlight .ss{color:#19177c}.highlight .bp{color:#008000}.highlight .vc{color:#19177c}.highlight .vg{color:#19177c}.highlight .vi{color:#19177c}.highlight .il{color:#666}.highlight pre{overflow:auto}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.highlight .lineno::selection{background:transparent}.highlight .lineno::-moz-selection{background:transparent}html{font-family:sans-serif;font-size:.9em;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;color:#444;padding:0;margin:0}body,#container{padding:0;margin:0}#container{width:100%;position:absolute;top:0}.search{padding:0;margin:0}.search .checkbox_container label{font-size:.9em;border-bottom:2px solid #e8e7e6}.search .checkbox_container label:hover{border-bottom:2px solid #3498db}.search .checkbox_container input[type="checkbox"]:checked+label{border-bottom:2px solid #2980b9}#search_wrapper{position:relative;width:50em;padding:10px}.center #search_wrapper{margin-left:auto;margin-right:auto}.q{background:none repeat scroll 0 0 #fff;border:1px solid #3498db;color:#222;font-size:16px;height:28px;margin:0;outline:medium none;padding:2px;padding-left:8px;padding-right:0 !important;width:100%;z-index:2}#search_submit{position:absolute;top:13px;right:1px;padding:0;border:0;background:url('../img/search-icon.png') no-repeat;background-size:24px 24px;opacity:.8;width:24px;height:30px;font-size:0}@media screen and (max-width:50em){#search_wrapper{width:90%;clear:both;overflow:hidden}}ul.autocompleter-choices{position:absolute;margin:0;padding:0;list-style:none;border:1px solid #3498db;border-left-color:#3498db;border-right-color:#3498db;border-bottom-color:#3498db;text-align:left;font-family:Verdana,Geneva,Arial,Helvetica,sans-serif;z-index:50;background-color:#fff;color:#444}ul.autocompleter-choices li{position:relative;margin:-2px 0 0 0;padding:.2em 1.5em .2em 1em;display:block;float:none !important;cursor:pointer;font-weight:normal;white-space:nowrap;font-size:1em;line-height:1.5em}ul.autocompleter-choices li.autocompleter-selected{background-color:#444;color:#fff}ul.autocompleter-choices li.autocompleter-selected span.autocompleter-queried{color:#9fcfff}ul.autocompleter-choices span.autocompleter-queried{display:inline;float:none;font-weight:bold;margin:0;padding:0}.row{max-width:800px;margin:20px auto;text-align:justify}.row h1{font-size:3em;margin-top:50px}.row p{padding:0 10px;max-width:700px}.row h3,.row ul{margin:4px 8px}.hmarg{margin:0 20px;border:1px solid #3498db;padding:4px 10px}a:link.hmarg{color:#3498db}a:visited.hmarg{color:#3498db}a:active.hmarg{color:#3498db}a:hover.hmarg{color:#3498db}.top_margin{margin-top:60px}.center{text-align:center}h1{font-size:5em}div.title{background:url('../img/searx.png') no-repeat;width:100%;min-height:80px;background-position:center}div.title h1{visibility:hidden}input[type="submit"]{padding:2px 6px;margin:2px 4px;display:inline-block;background:#3498db;color:#fff;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:0;cursor:pointer}input[type="checkbox"]{visibility:hidden}fieldset{margin:8px;border:1px solid #3498db}#categories{margin:0 10px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.checkbox_container{display:inline-block;position:relative;margin:0 3px;padding:0}.checkbox_container input{display:none}.checkbox_container label,.engine_checkbox label{cursor:pointer;padding:4px 10px;margin:0;display:block;text-transform:capitalize;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.checkbox_container input[type="checkbox"]:checked+label{background:#3498db;color:#fff}.engine_checkbox{padding:4px}label.allow{background:#e74c3c;padding:4px 8px;color:#fff;display:none}label.deny{background:#2ecc71;padding:4px 8px;color:#444;display:inline}.engine_checkbox input[type="checkbox"]:checked+label:nth-child(2)+label{display:none}.engine_checkbox input[type="checkbox"]:checked+label.allow{display:inline}a{text-decoration:none;color:#1a11be}a:visited{color:#8e44ad}.result{margin:19px 0 18px 0;padding:0;clear:both}.result_title{margin-bottom:0}.result_title a{color:#2980b9;font-weight:normal;font-size:1.1em}.result_title a:hover{text-decoration:underline}.result_title a:visited{color:#8e44ad}.cache_link{font-size:10px !important}.result h3{font-size:1em;word-wrap:break-word;margin:5px 0 1px 0;padding:0}.result .content{font-size:.8em;margin:0;padding:0;max-width:54em;word-wrap:break-word;line-height:1.24}.result .content img{float:left;margin-right:5px;max-width:200px;max-height:100px}.result .content br.last{clear:both}.result .url{font-size:.8em;margin:0 0 3px 0;padding:0;max-width:54em;word-wrap:break-word;color:#c0392b}.result .published_date{font-size:.8em;color:#888;Margin:5px 20px}.result .thumbnail{width:400px}.engines{color:#888}.small_font{font-size:.8em}.small p{margin:2px 0}.right{float:right}.invisible{display:none}.left{float:left}.highlight{color:#094089}.content .highlight{color:#000}.image_result{display:inline-block;margin:10px 10px;position:relative;max-height:160px}.image_result img{border:0;max-height:160px}.image_result p{margin:0;padding:0}.image_result p span a{display:none;color:#fff}.image_result p:hover span a{display:block;position:absolute;bottom:0;right:0;padding:4px;background-color:rgba(0,0,0,0.6);font-size:.7em}.torrent_result{border-left:10px solid lightgray;padding-left:3px}.torrent_result p{margin:3px;font-size:.8em}.torrent_result a{color:#2980b9}.torrent_result a:hover{text-decoration:underline}.torrent_result a:visited{color:#8e44ad}.definition_result{border-left:10px solid gray;padding-left:3px}.percentage{position:relative;width:300px}.percentage div{background:#444}table{width:100%}td{padding:0 4px}tr:hover{background:#ddd}#results{margin:auto;padding:0;width:50em;margin-bottom:20px}#sidebar{position:fixed;bottom:10px;left:10px;margin:0 2px 5px 5px;padding:0 2px 2px 2px;width:14em}#sidebar input{padding:0;margin:3px;font-size:.8em;display:inline-block;background:transparent;color:#444;cursor:pointer}#sidebar input[type="submit"]{text-decoration:underline}#suggestions form{display:inline}#suggestions,#answers{margin-top:20px;max-width:45em}#suggestions input,#answers input,#infoboxes input{padding:0;margin:3px;font-size:.8em;display:inline-block;background:transparent;color:#444;cursor:pointer}#suggestions input[type="submit"],#answers input[type="submit"],#infoboxes input[type="submit"]{text-decoration:underline}#suggestions-title{color:#888}#answers{border:2px solid #2980b9;padding:20px}#answers form,#infoboxes form{min-width:210px}#infoboxes{position:absolute;top:100px;right:20px;margin:0 2px 5px 5px;padding:0 2px 2px;max-width:21em;word-wrap:break-word;}#infoboxes .infobox{margin:10px 0 10px;border:1px solid #ddd;padding:5px;font-size:.8em}#infoboxes .infobox img{max-width:90%;max-heigt:12em;display:block;margin:5px;padding:5px}#infoboxes .infobox h2{margin:0}#infoboxes .infobox table{table-layout:fixed;}#infoboxes .infobox table td{vertical-align:top}#infoboxes .infobox input{font-size:1em}#infoboxes .infobox br{clear:both}#search_url{margin-top:8px}#search_url input{border:1px solid #888;padding:4px;color:#444;width:14em;display:block;margin:4px;font-size:.8em}#preferences{top:10px;padding:0;border:0;background:url('../img/preference-icon.png') no-repeat;background-size:28px 28px;opacity:.8;width:28px;height:30px;display:block}#preferences *{display:none}#pagination{clear:both}#pagination br{clear:both}#apis{margin-top:8px;clear:both}#categories_container{position:relative}@media screen and (max-width:50em){#results{margin:auto;padding:0;width:90%}.github{display:none}.checkbox_container{display:block;width:90%}.checkbox_container label{border-bottom:0}.preferences_container{display:none;postion:fixed !important;top:100px;right:0}}@media screen and (max-width:75em){div.title h1{font-size:1em}html.touch #categories{width:95%;height:30px;text-align:left;overflow-x:scroll;overflow-y:hidden;-webkit-overflow-scrolling:touch}html.touch #categories #categories_container{width:1000px;width:-moz-max-content;width:-webkit-max-content;width:max-content}html.touch #categories #categories_container .checkbox_container{display:inline-block;width:auto}#categories{font-size:90%;clear:both}#categories .checkbox_container{margin-top:2px;margin:auto}#suggestions,#answers{margin-top:5px}#infoboxes{position:inherit;max-width:inherit}#infoboxes .infobox{clear:both}#infoboxes .infobox img{float:left;max-width:10em}#categories{font-size:90%;clear:both}#categories .checkbox_container{margin-top:2px;margin:auto}#sidebar{position:static;max-width:50em;margin:0 0 2px 0;padding:0;float:none;border:none;width:auto}#sidebar input{border:0}#apis{display:none}#search_url{display:none}.result{border-top:1px solid #e8e7e6;margin:8px 0 8px 0}.result .thumbnail{max-width:98%}.image_result{max-width:98%}.image_result img{max-width:98%}}.favicon{float:left;margin-right:4px;margin-top:2px}.preferences_back{background:none repeat scroll 0 0 #3498db;border:0 none;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;cursor:pointer;display:inline-block;margin:2px 4px;padding:4px 6px}.preferences_back a{color:#fff}.hidden{opacity:0;overflow:hidden;font-size:.8em;position:absolute;bottom:-20px;width:100%;text-position:center;background:white;transition:opacity 1s ease}#categories_container:hover .hidden{transition:opacity 1s ease;opacity:.8}
+.highlight .c,.highlight .cm,.highlight .ge,.highlight .sd{font-style:italic}#categories,.highlight .lineno{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}#container,.search,body,html{padding:0;margin:0}div.title h1,input[type=checkbox]{visibility:hidden}#categories,.checkbox_container label,.engine_checkbox label,.highlight .lineno{-webkit-touch-callout:none;-khtml-user-select:none}#answers input[type=submit],#infoboxes input[type=submit],#sidebar input[type=submit],#suggestions input[type=submit],.result_title a:hover,.torrent_result a:hover{text-decoration:underline}#infoboxes,.result .content,.result .url,.result h3{word-wrap:break-word}#apis,#infoboxes .infobox br,#pagination,#pagination br,.result,.result .content br.last{clear:both}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#408080}.highlight .err{border:1px solid red}.highlight .k{color:green;font-weight:700}.highlight .o{color:#666}.highlight .cm{color:#408080}.highlight .cp{color:#BC7A00}.highlight .c1,.highlight .cs{color:#408080;font-style:italic}.highlight .gd{color:#A00000}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00A000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04D}.highlight .kc,.highlight .kd,.highlight .kn{color:green;font-weight:700}.highlight .kp{color:green}.highlight .kr{color:green;font-weight:700}.highlight .kt{color:#B00040}.highlight .m{color:#666}.highlight .s{color:#BA2121}.highlight .na{color:#7D9029}.highlight .nb{color:green}.highlight .nc{color:#00F;font-weight:700}.highlight .no{color:#800}.highlight .nd{color:#A2F}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#00F}.highlight .nl{color:#A0A000}.highlight .nn{color:#00F;font-weight:700}.highlight .nt{color:green;font-weight:700}.highlight .nv{color:#19177C}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#bbb}.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:#666}.highlight .s2,.highlight .sb,.highlight .sc{color:#BA2121}.highlight .sd{color:#BA2121}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#BA2121}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:green}.highlight .sr{color:#B68}.highlight .s1{color:#BA2121}.highlight .ss{color:#19177C}.highlight .bp{color:green}.highlight .vc,.highlight .vg,.highlight .vi{color:#19177C}.highlight .il{color:#666}.highlight pre{overflow:auto}.highlight .lineno{user-select:none;cursor:default}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0}html{font-family:sans-serif;font-size:.9em;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;color:#444}#container{width:100%;position:absolute;top:0}.search .checkbox_container label{font-size:.9em;border-bottom:2px solid #E8E7E6}.search .checkbox_container label:hover{border-bottom:2px solid #3498DB}.search .checkbox_container input[type=checkbox]:checked+label{border-bottom:2px solid #2980B9}#search_wrapper{position:relative;width:50em;padding:10px}.center #search_wrapper{margin-left:auto;margin-right:auto}.q,ul.autocompleter-choices{margin:0;border:1px solid #3498DB}.q{background:#FFF;color:#222;font-size:16px;height:28px;outline:0;padding:2px 2px 2px 8px;padding-right:0!important;width:100%;z-index:2}#search_submit{position:absolute;top:13px;right:1px;padding:0;border:0;background:url(../img/search-icon.png) no-repeat;background-size:24px 24px;opacity:.8;width:24px;height:30px;font-size:0}@media screen and (max-width:50em){#search_wrapper{width:90%;clear:both;overflow:hidden}}ul.autocompleter-choices{position:absolute;padding:0;list-style:none;border-left-color:#3498DB;border-right-color:#3498DB;border-bottom-color:#3498DB;text-align:left;font-family:Verdana,Geneva,Arial,Helvetica,sans-serif;z-index:50;background-color:#FFF;color:#444}ul.autocompleter-choices li{position:relative;margin:-2px 0 0;padding:.2em 1.5em .2em 1em;display:block;float:none!important;cursor:pointer;font-weight:400;white-space:nowrap;font-size:1em;line-height:1.5em}ul.autocompleter-choices li.autocompleter-selected{background-color:#444;color:#FFF}ul.autocompleter-choices li.autocompleter-selected span.autocompleter-queried{color:#9FCFFF}ul.autocompleter-choices span.autocompleter-queried{display:inline;float:none;font-weight:700;margin:0;padding:0}.row{max-width:800px;margin:20px auto;text-align:justify}.row h1{font-size:3em;margin-top:50px}.row p{padding:0 10px;max-width:700px}.row h3,.row ul{margin:4px 8px}.hmarg{margin:0 20px;border:1px solid #3498DB;padding:4px 10px}a:active.hmarg,a:hover.hmarg,a:link.hmarg,a:visited.hmarg{color:#3498DB}.top_margin{margin-top:60px}.center{text-align:center}h1{font-size:5em}div.title{background:url(../img/searx.png) center no-repeat;width:100%;min-height:80px}input[type=submit]{padding:2px 6px;margin:2px 4px;display:inline-block;background:#3498DB;color:#FFF;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:0;cursor:pointer}fieldset{margin:8px;border:1px solid #3498DB}#categories{margin:0 10px;user-select:none}.checkbox_container{display:inline-block;position:relative;margin:0 3px;padding:0}.checkbox_container input{display:none}.checkbox_container label,.engine_checkbox label{cursor:pointer;padding:4px 10px;margin:0;display:block;text-transform:capitalize;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.checkbox_container input[type=checkbox]:checked+label{background:#3498DB;color:#FFF}.engine_checkbox{padding:4px}label.allow{background:#E74C3C;padding:4px 8px;color:#FFF;display:none}label.deny{background:#2ECC71;padding:4px 8px;color:#444;display:inline}.engine_checkbox input[type=checkbox]:checked+label:nth-child(2)+label{display:none}.engine_checkbox input[type=checkbox]:checked+label.allow{display:inline}a{text-decoration:none;color:#1a11be}a:visited{color:#8E44AD}.result{margin:19px 0 18px;padding:0}.result_title{margin-bottom:0}.result_title a{color:#2980B9;font-weight:400;font-size:1.1em}.result_title a:visited{color:#8E44AD}.cache_link{font-size:10px!important}.result h3{font-size:1em;margin:5px 0 1px;padding:0}.result .content,.result .url,.small_font{font-size:.8em}.result .content{margin:0;padding:0;max-width:54em;line-height:1.24}.result .content img{float:left;margin-right:5px;max-width:200px;max-height:100px}.result .url{margin:0 0 3px;padding:0;max-width:54em;color:#C0392B}.result .published_date{font-size:.8em;color:#888;Margin:5px 20px}.result .thumbnail{width:400px}.engines{color:#888}.small p{margin:2px 0}.right{float:right}.invisible{display:none}.left{float:left}.highlight{color:#094089}.content .highlight{color:#000}.image_result{display:inline-block;margin:10px;position:relative;max-height:160px}.image_result img{border:0;max-height:160px}.image_result p{margin:0;padding:0}.image_result p span a{display:none;color:#FFF}.image_result p:hover span a{display:block;position:absolute;bottom:0;right:0;padding:4px;background-color:rgba(0,0,0,.6);font-size:.7em}#categories_container,.percentage{position:relative}.torrent_result{border-left:10px solid #d3d3d3;padding-left:3px}.torrent_result p{margin:3px;font-size:.8em}.torrent_result a{color:#2980B9}.torrent_result a:visited{color:#8E44AD}.definition_result{border-left:10px solid gray;padding-left:3px}.percentage{width:300px}.percentage div{background:#444}table{width:100%}.result-table{margin-bottom:10px}#infoboxes,#sidebar{margin:0 2px 5px 5px;padding:0 2px 2px}td{padding:0 4px}tr:hover{background:#DDD}#results{margin:auto auto 20px;padding:0;width:50em}#sidebar{position:fixed;bottom:10px;left:10px;width:14em}#answers input,#infoboxes input,#sidebar input,#suggestions input{padding:0;margin:3px;font-size:.8em;display:inline-block;background:0 0;color:#444;cursor:pointer}#suggestions form{display:inline}#answers,#suggestions{margin-top:20px;max-width:45em}#suggestions-title{color:#888}#answers{border:2px solid #2980B9;padding:20px}#answers form,#infoboxes form{min-width:210px}#infoboxes{position:absolute;top:100px;right:20px;max-width:21em}#infoboxes .infobox{margin:10px 0;border:1px solid #ddd;padding:5px;font-size:.8em}#infoboxes .infobox img{max-width:90%;max-heigt:12em;display:block;margin:5px;padding:5px}#infoboxes .infobox h2{margin:0}#apis,#search_url{margin-top:8px}#infoboxes .infobox table{table-layout:fixed}#infoboxes .infobox table td{vertical-align:top}#infoboxes .infobox input{font-size:1em}#search_url input{border:1px solid #888;padding:4px;color:#444;width:14em;display:block;margin:4px;font-size:.8em}#preferences{top:10px;padding:0;border:0;background:url(../img/preference-icon.png) no-repeat;background-size:28px 28px;opacity:.8;width:28px;height:30px;display:block}#preferences *{display:none}@media screen and (max-width:50em){#results{margin:auto;padding:0;width:90%}.github{display:none}.checkbox_container{display:block;width:90%}.checkbox_container label{border-bottom:0}.preferences_container{display:none;postion:fixed!important;top:100px;right:0}}@media screen and (max-width:75em){div.title h1{font-size:1em}html.touch #categories{width:95%;height:30px;text-align:left;overflow-x:scroll;overflow-y:hidden;-webkit-overflow-scrolling:touch}html.touch #categories #categories_container{width:1000px;width:-moz-max-content;width:-webkit-max-content;width:max-content}html.touch #categories #categories_container .checkbox_container{display:inline-block;width:auto}#answers,#suggestions{margin-top:5px}#infoboxes{position:inherit;max-width:inherit}#infoboxes .infobox{clear:both}#infoboxes .infobox img{float:left;max-width:10em}#categories{font-size:90%;clear:both}#categories .checkbox_container{margin:auto}#sidebar{position:static;max-width:50em;margin:0 0 2px;padding:0;float:none;border:none;width:auto}#sidebar input{border:0}#apis,#search_url{display:none}.result{border-top:1px solid #E8E7E6;margin:8px 0}.image_result,.image_result img,.result .thumbnail{max-width:98%}}.favicon{float:left;margin-right:4px;margin-top:2px}.preferences_back{background:#3498DB;border:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;cursor:pointer;display:inline-block;margin:2px 4px;padding:4px 6px}.preferences_back a{color:#FFF}.hidden{opacity:0;overflow:hidden;font-size:.8em;position:absolute;bottom:-20px;width:100%;text-position:center;background:#fff;transition:opacity 1s ease}#categories_container:hover .hidden{transition:opacity 1s ease;opacity:.8} \ No newline at end of file
diff --git a/searx/static/themes/legacy/less/autocompleter.less b/searx/static/themes/legacy/less/autocompleter.less
index db9601aeb..4ab2508f8 100644
--- a/searx/static/themes/legacy/less/autocompleter.less
+++ b/searx/static/themes/legacy/less/autocompleter.less
@@ -1,61 +1,61 @@
-/*
- * searx, A privacy-respecting, hackable metasearch engine
- */
-
-ul {
- &.autocompleter-choices {
- position: absolute;
- margin: 0;
- padding: 0;
- list-style: none;
- border: 1px solid @color-autocompleter-choices-border;
- border-left-color: @color-autocompleter-choices-border-left-right;
- border-right-color: @color-autocompleter-choices-border-left-right;
- border-bottom-color: @color-autocompleter-choices-border-bottom;
- text-align: left;
- font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
- z-index: 50;
- background-color: @color-autocompleter-choices-background;
- color: @color-autocompleter-choices-font;
-
- li {
- position: relative;
- margin: -2px 0 0 0;
- padding: 0.2em 1.5em 0.2em 1em;
- display: block;
- float: none !important;
- cursor: pointer;
- font-weight: normal;
- white-space: nowrap;
- font-size: 1em;
- line-height: 1.5em;
-
- &.autocompleter-selected {
- background-color: @color-autocompleter-selected-background;
- color: @color-autocompleter-selected-font;
-
- span.autocompleter-queried {
- color: @color-autocompleter-selected-queried-font;
- }
- }
- }
-
- span.autocompleter-queried {
- display: inline;
- float: none;
- font-weight: bold;
- margin: 0;
- padding: 0;
- }
- }
-}
-
-/*.autocompleter-loading {
- //background-image: url(images/spinner.gif);
- background-repeat: no-repeat;
- background-position: right 50%;
-}*/
-
-/*textarea.autocompleter-loading {
- background-position: right bottom;
-}*/
+/*
+ * searx, A privacy-respecting, hackable metasearch engine
+ */
+
+ul {
+ &.autocompleter-choices {
+ position: absolute;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ border: 1px solid @color-autocompleter-choices-border;
+ border-left-color: @color-autocompleter-choices-border-left-right;
+ border-right-color: @color-autocompleter-choices-border-left-right;
+ border-bottom-color: @color-autocompleter-choices-border-bottom;
+ text-align: left;
+ font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
+ z-index: 50;
+ background-color: @color-autocompleter-choices-background;
+ color: @color-autocompleter-choices-font;
+
+ li {
+ position: relative;
+ margin: -2px 0 0 0;
+ padding: 0.2em 1.5em 0.2em 1em;
+ display: block;
+ float: none !important;
+ cursor: pointer;
+ font-weight: normal;
+ white-space: nowrap;
+ font-size: 1em;
+ line-height: 1.5em;
+
+ &.autocompleter-selected {
+ background-color: @color-autocompleter-selected-background;
+ color: @color-autocompleter-selected-font;
+
+ span.autocompleter-queried {
+ color: @color-autocompleter-selected-queried-font;
+ }
+ }
+ }
+
+ span.autocompleter-queried {
+ display: inline;
+ float: none;
+ font-weight: bold;
+ margin: 0;
+ padding: 0;
+ }
+ }
+}
+
+/*.autocompleter-loading {
+ //background-image: url(images/spinner.gif);
+ background-repeat: no-repeat;
+ background-position: right 50%;
+}*/
+
+/*textarea.autocompleter-loading {
+ background-position: right bottom;
+}*/
diff --git a/searx/static/themes/legacy/less/style.less b/searx/static/themes/legacy/less/style.less
index 4374f7d68..bbeaf105e 100644
--- a/searx/static/themes/legacy/less/style.less
+++ b/searx/static/themes/legacy/less/style.less
@@ -376,6 +376,10 @@ table {
width: 100%;
}
+.result-table {
+ margin-bottom: 10px;
+}
+
td {
padding: 0 4px;
}
diff --git a/searx/static/themes/oscar/css/logicodev-dark.css b/searx/static/themes/oscar/css/logicodev-dark.css
new file mode 100644
index 000000000..07f422f8e
--- /dev/null
+++ b/searx/static/themes/oscar/css/logicodev-dark.css
@@ -0,0 +1,732 @@
+.searx-navbar {
+ background: #29314d;
+ height: 2.3rem;
+ font-size: 1.3rem;
+ line-height: 1.3rem;
+ padding: 0.5rem;
+ font-weight: bold;
+ margin-bottom: 0.8rem;
+}
+.searx-navbar a,
+.searx-navbar a:hover {
+ margin-right: 2.0rem;
+ color: white;
+ text-decoration: none;
+}
+.searx-navbar .instance a {
+ color: #01d7d4;
+ margin-left: 2.0rem;
+}
+#main-logo {
+ margin-top: 20vh;
+ margin-bottom: 25px;
+}
+#main-logo > img {
+ max-width: 350px;
+ width: 80%;
+}
+* {
+ border-radius: 0 !important;
+}
+html {
+ position: relative;
+ min-height: 100%;
+ color: #29314d;
+}
+body {
+ /* Margin bottom by footer height */
+ font-family: 'Roboto', Helvetica, Arial, sans-serif;
+ margin-bottom: 80px;
+ background-color: white;
+}
+body a {
+ color: #0088cc;
+}
+.footer {
+ position: absolute;
+ bottom: 0;
+ width: 100%;
+ /* Set the fixed height of the footer here */
+ height: 60px;
+ text-align: center;
+ color: #999;
+}
+input[type=checkbox]:checked + .label_hide_if_checked,
+input[type=checkbox]:checked + .label_hide_if_not_checked + .label_hide_if_checked {
+ display: none;
+}
+input[type=checkbox]:not(:checked) + .label_hide_if_not_checked,
+input[type=checkbox]:not(:checked) + .label_hide_if_checked + .label_hide_if_not_checked {
+ display: none;
+}
+.onoff-checkbox {
+ width: 15%;
+}
+.onoffswitch {
+ position: relative;
+ width: 110px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+}
+.onoffswitch-checkbox {
+ display: none;
+}
+.onoffswitch-label {
+ display: block;
+ overflow: hidden;
+ cursor: pointer;
+ border: 2px solid #FFFFFF !important;
+ border-radius: 50px !important;
+}
+.onoffswitch-inner {
+ display: block;
+ transition: margin 0.3s ease-in 0s;
+}
+.onoffswitch-inner:before,
+.onoffswitch-inner:after {
+ display: block;
+ float: left;
+ width: 50%;
+ height: 30px;
+ padding: 0;
+ line-height: 40px;
+ font-size: 20px;
+ box-sizing: border-box;
+ content: "";
+ background-color: #EEEEEE;
+}
+.onoffswitch-switch {
+ display: block;
+ width: 37px;
+ background-color: #01d7d4;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ right: 0px;
+ border: 2px solid #FFFFFF !important;
+ border-radius: 50px !important;
+ transition: all 0.3s ease-in 0s;
+}
+.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner {
+ margin-right: 0;
+}
+.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch {
+ right: 71px;
+ background-color: #A1A1A1;
+}
+.result_header {
+ margin-top: 0px;
+ margin-bottom: 2px;
+ font-size: 16px;
+}
+.result_header .favicon {
+ margin-bottom: -3px;
+}
+.result_header a {
+ color: #29314d;
+ text-decoration: none;
+}
+.result_header a:hover {
+ color: #0088cc;
+}
+.result_header a:visited {
+ color: #684898;
+}
+.result_header a .highlight {
+ background-color: #f6f9fa;
+}
+.result-content,
+.result-format,
+.result-source {
+ margin-top: 2px;
+ margin-bottom: 0;
+ word-wrap: break-word;
+ color: #666666;
+ font-size: 13px;
+}
+.result-content .highlight,
+.result-format .highlight,
+.result-source .highlight {
+ font-weight: bold;
+}
+.result-source {
+ font-size: 10px;
+ float: left;
+}
+.result-format {
+ font-size: 10px;
+ float: right;
+}
+.external-link {
+ color: #069025;
+ font-size: 12px;
+ margin-bottom: 15px;
+}
+.external-link a {
+ margin-right: 3px;
+}
+.result-default,
+.result-code,
+.result-torrent,
+.result-videos,
+.result-map {
+ clear: both;
+ padding: 2px 4px;
+}
+.result-default:hover,
+.result-code:hover,
+.result-torrent:hover,
+.result-videos:hover,
+.result-map:hover {
+ background-color: #f6f9fa;
+}
+.result-images {
+ float: left !important;
+ width: 24%;
+ margin: .5%;
+}
+.result-images a {
+ display: block;
+ width: 100%;
+ background-size: cover;
+}
+.img-thumbnail {
+ margin: 5px;
+ max-height: 128px;
+ min-height: 128px;
+}
+.result-videos {
+ clear: both;
+}
+.result-videos hr {
+ margin: 5px 0 15px 0;
+}
+.result-videos .collapse {
+ width: 100%;
+}
+.result-videos .in {
+ margin-bottom: 8px;
+}
+.result-torrent {
+ clear: both;
+}
+.result-torrent b {
+ margin-right: 5px;
+ margin-left: 5px;
+}
+.result-torrent .seeders {
+ color: #2ecc71;
+}
+.result-torrent .leechers {
+ color: #f35e77;
+}
+.result-map {
+ clear: both;
+}
+.result-code {
+ clear: both;
+}
+.result-code .code-fork,
+.result-code .code-fork a {
+ color: #666666;
+}
+.suggestion_item {
+ margin: 2px 5px;
+ max-width: 100%;
+}
+.suggestion_item .btn {
+ max-width: 100%;
+ white-space: normal;
+ word-wrap: break-word;
+ text-align: left;
+}
+.result_download {
+ margin-right: 5px;
+}
+#pagination {
+ margin-top: 30px;
+ padding-bottom: 60px;
+}
+.label-default {
+ color: #a4a4a4;
+ background: transparent;
+}
+.result .text-muted small {
+ word-wrap: break-word;
+}
+.modal-wrapper {
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+}
+.modal-wrapper {
+ background-clip: padding-box;
+ background-color: #fff;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 6px;
+ box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+ outline: 0 none;
+ position: relative;
+}
+.infobox .panel-heading {
+ background-color: #f6f9fa;
+}
+.infobox .panel-heading .panel-title {
+ font-weight: 700;
+}
+.infobox p {
+ font-family: "DejaVu Serif", Georgia, Cambria, "Times New Roman", Times, serif !important;
+ font-style: italic;
+}
+.infobox .btn {
+ background-color: #2ecc71;
+ border: none;
+}
+.infobox .btn a {
+ color: white;
+ margin: 5px;
+}
+.infobox .infobox_part {
+ margin-bottom: 20px;
+ word-wrap: break-word;
+ table-layout: fixed;
+}
+.infobox .infobox_part:last-child {
+ margin-bottom: 0;
+}
+.search_categories,
+#categories {
+ text-transform: capitalize;
+ margin-bottom: 0.5rem;
+ display: flex;
+ flex-wrap: wrap;
+ flex-flow: row wrap;
+ align-content: stretch;
+}
+.search_categories label,
+#categories label,
+.search_categories .input-group-addon,
+#categories .input-group-addon {
+ flex-grow: 1;
+ flex-basis: auto;
+ font-size: 1.2rem;
+ font-weight: normal;
+ background-color: white;
+ border: #dddddd 1px solid;
+ border-right: none;
+ color: #666666;
+ padding-bottom: 0.4rem;
+ padding-top: 0.4rem;
+ text-align: center;
+ min-width: 50px;
+}
+.search_categories label:last-child,
+#categories label:last-child,
+.search_categories .input-group-addon:last-child,
+#categories .input-group-addon:last-child {
+ border-right: #dddddd 1px solid;
+}
+.search_categories input[type="checkbox"]:checked + label,
+#categories input[type="checkbox"]:checked + label {
+ color: #29314d;
+ font-weight: bold;
+ border-bottom: #01d7d4 5px solid;
+}
+#main-logo {
+ margin-top: 10vh;
+ margin-bottom: 25px;
+}
+#main-logo > img {
+ max-width: 350px;
+ width: 80%;
+}
+#q {
+ box-shadow: none;
+ border-right: none;
+ border-color: #a4a4a4;
+}
+#search_form .input-group-btn .btn {
+ border-color: #a4a4a4;
+}
+#search_form .input-group-btn .btn:hover {
+ background-color: #2ecc71;
+ color: white;
+}
+.custom-select {
+ appearance: none;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ font-size: 1.2rem;
+ font-weight: normal;
+ background-color: white;
+ border: #dddddd 1px solid;
+ color: #666666;
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAQAAACR313BAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
+AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZ
+cwAABFkAAARZAVnbJUkAAAAHdElNRQfgBxgLDwB20OFsAAAAbElEQVQY073OsQ3CMAAEwJMYwJGn
+sAehpoXJItltBkmcdZBYgIIiQoLglnz3ui+eP+bk5uneteTMZJa6OJuIqvYzSJoqwqBq8gdmTTW8
+6/dghxAUq4xsVYT9laBYXCw93Aajh7GPEF23t4fkBYevGFTANkPRAAAAJXRFWHRkYXRlOmNyZWF0
+ZQAyMDE2LTA3LTI0VDExOjU1OjU4KzAyOjAwRFqFOQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0w
+Ny0yNFQxMToxNTowMCswMjowMP7RDgQAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb
+7jwaAAAAAElFTkSuQmCC) 96% no-repeat;
+}
+.search-margin {
+ margin-bottom: 0.6em;
+}
+#advanced-search-container {
+ display: none;
+ text-align: left;
+ margin-bottom: 1rem;
+ clear: both;
+}
+#advanced-search-container label,
+#advanced-search-container .input-group-addon {
+ font-size: 1.2rem;
+ font-weight: normal;
+ background-color: white;
+ border: #dddddd 1px solid;
+ border-right: none;
+ color: #666666;
+ padding-bottom: 0.4rem;
+ padding-right: 0.7rem;
+ padding-left: 0.7rem;
+}
+#advanced-search-container label:last-child,
+#advanced-search-container .input-group-addon:last-child {
+ border-right: #dddddd 1px solid;
+}
+#advanced-search-container input[type="radio"] {
+ display: none;
+}
+#advanced-search-container input[type="radio"]:checked + label {
+ color: #29314d;
+ font-weight: bold;
+ border-bottom: #01d7d4 5px solid;
+}
+#check-advanced {
+ display: none;
+}
+#check-advanced:checked ~ #advanced-search-container {
+ display: block;
+}
+.advanced {
+ padding: 0;
+ margin-top: 0.3rem;
+ text-align: right;
+}
+.advanced label,
+.advanced select {
+ cursor: pointer;
+}
+.cursor-text {
+ cursor: text !important;
+}
+.cursor-pointer {
+ cursor: pointer !important;
+}
+pre,
+code {
+ font-family: 'Ubuntu Mono', 'Courier New', 'Lucida Console', monospace !important;
+}
+.lineno {
+ margin-right: 5px;
+}
+.highlight .hll {
+ background-color: #ffffcc;
+}
+.highlight {
+ background: #f8f8f8;
+}
+.highlight .c {
+ color: #556366;
+ font-style: italic;
+}
+/* Comment */
+.highlight .err {
+ border: 1px solid #ffa92f;
+}
+/* Error */
+.highlight .k {
+ color: #BE74D5;
+ font-weight: bold;
+}
+/* Keyword */
+.highlight .o {
+ color: #d19a66;
+}
+/* Operator */
+.highlight .cm {
+ color: #556366;
+ font-style: italic;
+}
+/* Comment.Multiline */
+.highlight .cp {
+ color: #bc7a00;
+}
+/* Comment.Preproc */
+.highlight .c1 {
+ color: #556366;
+ font-style: italic;
+}
+/* Comment.Single */
+.highlight .cs {
+ color: #556366;
+ font-style: italic;
+}
+/* Comment.Special */
+.highlight .gd {
+ color: #a00000;
+}
+/* Generic.Deleted */
+.highlight .ge {
+ font-style: italic;
+}
+/* Generic.Emph */
+.highlight .gr {
+ color: #ff0000;
+}
+/* Generic.Error */
+.highlight .gh {
+ color: #000080;
+ font-weight: bold;
+}
+/* Generic.Heading */
+.highlight .gi {
+ color: #00a000;
+}
+/* Generic.Inserted */
+.highlight .go {
+ color: #888888;
+}
+/* Generic.Output */
+.highlight .gp {
+ color: #000080;
+ font-weight: bold;
+}
+/* Generic.Prompt */
+.highlight .gs {
+ font-weight: bold;
+}
+/* Generic.Strong */
+.highlight .gu {
+ color: #800080;
+ font-weight: bold;
+}
+/* Generic.Subheading */
+.highlight .gt {
+ color: #0044dd;
+}
+/* Generic.Traceback */
+.highlight .kc {
+ color: #BE74D5;
+ font-weight: bold;
+}
+/* Keyword.Constant */
+.highlight .kd {
+ color: #BE74D5;
+ font-weight: bold;
+}
+/* Keyword.Declaration */
+.highlight .kn {
+ color: #BE74D5;
+ font-weight: bold;
+}
+/* Keyword.Namespace */
+.highlight .kp {
+ color: #be74d5;
+}
+/* Keyword.Pseudo */
+.highlight .kr {
+ color: #BE74D5;
+ font-weight: bold;
+}
+/* Keyword.Reserved */
+.highlight .kt {
+ color: #d46c72;
+}
+/* Keyword.Type */
+.highlight .m {
+ color: #d19a66;
+}
+/* Literal.Number */
+.highlight .s {
+ color: #86c372;
+}
+/* Literal.String */
+.highlight .na {
+ color: #7d9029;
+}
+/* Name.Attribute */
+.highlight .nb {
+ color: #be74d5;
+}
+/* Name.Builtin */
+.highlight .nc {
+ color: #61AFEF;
+ font-weight: bold;
+}
+/* Name.Class */
+.highlight .no {
+ color: #d19a66;
+}
+/* Name.Constant */
+.highlight .nd {
+ color: #aa22ff;
+}
+/* Name.Decorator */
+.highlight .ni {
+ color: #999999;
+ font-weight: bold;
+}
+/* Name.Entity */
+.highlight .ne {
+ color: #D2413A;
+ font-weight: bold;
+}
+/* Name.Exception */
+.highlight .nf {
+ color: #61afef;
+}
+/* Name.Function */
+.highlight .nl {
+ color: #a0a000;
+}
+/* Name.Label */
+.highlight .nn {
+ color: #61AFEF;
+ font-weight: bold;
+}
+/* Name.Namespace */
+.highlight .nt {
+ color: #BE74D5;
+ font-weight: bold;
+}
+/* Name.Tag */
+.highlight .nv {
+ color: #dfc06f;
+}
+/* Name.Variable */
+.highlight .ow {
+ color: #AA22FF;
+ font-weight: bold;
+}
+/* Operator.Word */
+.highlight .w {
+ color: #d7dae0;
+}
+/* Text.Whitespace */
+.highlight .mf {
+ color: #d19a66;
+}
+/* Literal.Number.Float */
+.highlight .mh {
+ color: #d19a66;
+}
+/* Literal.Number.Hex */
+.highlight .mi {
+ color: #d19a66;
+}
+/* Literal.Number.Integer */
+.highlight .mo {
+ color: #d19a66;
+}
+/* Literal.Number.Oct */
+.highlight .sb {
+ color: #86c372;
+}
+/* Literal.String.Backtick */
+.highlight .sc {
+ color: #86c372;
+}
+/* Literal.String.Char */
+.highlight .sd {
+ color: #86C372;
+ font-style: italic;
+}
+/* Literal.String.Doc */
+.highlight .s2 {
+ color: #86c372;
+}
+/* Literal.String.Double */
+.highlight .se {
+ color: #BB6622;
+ font-weight: bold;
+}
+/* Literal.String.Escape */
+.highlight .sh {
+ color: #86c372;
+}
+/* Literal.String.Heredoc */
+.highlight .si {
+ color: #BB6688;
+ font-weight: bold;
+}
+/* Literal.String.Interpol */
+.highlight .sx {
+ color: #be74d5;
+}
+/* Literal.String.Other */
+.highlight .sr {
+ color: #bb6688;
+}
+/* Literal.String.Regex */
+.highlight .s1 {
+ color: #86c372;
+}
+/* Literal.String.Single */
+.highlight .ss {
+ color: #dfc06f;
+}
+/* Literal.String.Symbol */
+.highlight .bp {
+ color: #be74d5;
+}
+/* Name.Builtin.Pseudo */
+.highlight .vc {
+ color: #dfc06f;
+}
+/* Name.Variable.Class */
+.highlight .vg {
+ color: #dfc06f;
+}
+/* Name.Variable.Global */
+.highlight .vi {
+ color: #dfc06f;
+}
+/* Name.Variable.Instance */
+.highlight .il {
+ color: #d19a66;
+}
+/* Literal.Number.Integer.Long */
+.highlight .lineno {
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ cursor: default;
+ color: #556366;
+}
+.highlight .lineno::selection {
+ background: transparent;
+ /* WebKit/Blink Browsers */
+}
+.highlight .lineno::-moz-selection {
+ background: transparent;
+ /* Gecko Browsers */
+}
+.highlight pre {
+ background-color: #282C34;
+ color: #D7DAE0;
+ border: none;
+ margin-bottom: 25px;
+ font-size: 15px;
+ padding: 20px 10px;
+}
+.highlight {
+ font-weight: 700;
+}
+.table > tbody > tr > td,
+.table > tbody > tr > th {
+ vertical-align: middle !important;
+}
diff --git a/searx/static/themes/oscar/css/logicodev-dark.min.css b/searx/static/themes/oscar/css/logicodev-dark.min.css
index 99915ceff..06e7fb0a9 100644
--- a/searx/static/themes/oscar/css/logicodev-dark.min.css
+++ b/searx/static/themes/oscar/css/logicodev-dark.min.css
@@ -1 +1 @@
-*{border-radius:0!important}html{position:relative;min-height:100%;color:#29314d}body{font-family:Roboto,Helvetica,Arial,sans-serif;margin-bottom:80px;background-color:#fff}body a{color:#08c}.footer{position:absolute;bottom:0;width:100%;height:60px;text-align:center;color:#999}input[type=checkbox]:checked+.label_hide_if_checked,input[type=checkbox]:checked+.label_hide_if_not_checked+.label_hide_if_checked{display:none}input[type=checkbox]:not(:checked)+.label_hide_if_not_checked,input[type=checkbox]:not(:checked)+.label_hide_if_checked+.label_hide_if_not_checked{display:none}.onoff-checkbox{width:15%}.onoffswitch{position:relative;width:110px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #FFF!important;border-radius:50px!important}.onoffswitch-inner{display:block;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;height:30px;padding:0;line-height:40px;font-size:20px;box-sizing:border-box;content:"";background-color:#EEE}.onoffswitch-switch{display:block;width:37px;background-color:#01d7d4;position:absolute;top:0;bottom:0;right:0;border:2px solid #FFF!important;border-radius:50px!important;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-right:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:71px;background-color:#A1A1A1}.result_header{margin-top:0;margin-bottom:2px;font-size:16px}.result_header .favicon{margin-bottom:-3px}.result_header a{color:#29314d;text-decoration:none}.result_header a:hover{color:#08c}.result_header a:visited{color:#684898}.result_header a .highlight{background-color:#f6f9fa}.result-content{margin-top:2px;margin-bottom:0;word-wrap:break-word;color:#666;font-size:13px}.result-content .highlight{font-weight:700}.external-link{color:#069025;font-size:12px;margin-bottom:15px}.external-link a{margin-right:3px}.result-default,.result-code,.result-torrent,.result-videos,.result-map{clear:both;padding:2px 4px}.result-default:hover,.result-code:hover,.result-torrent:hover,.result-videos:hover,.result-map:hover{background-color:#f6f9fa}.result-images{float:left!important;width:24%;margin:.5%}.result-images a{display:block;width:100%;background-size:cover}.img-thumbnail{margin:5px;max-height:128px;min-height:128px}.result-videos{clear:both}.result-videos hr{margin:5px 0 15px 0}.result-videos .collapse{width:100%}.result-videos .in{margin-bottom:8px}.result-torrent{clear:both}.result-torrent b{margin-right:5px;margin-left:5px}.result-torrent .seeders{color:#2ecc71}.result-torrent .leechers{color:#f35e77}.result-map{clear:both}.result-code{clear:both}.result-code .code-fork,.result-code .code-fork a{color:#666}.suggestion_item{margin:2px 5px;max-width:100%}.suggestion_item .btn{max-width:100%;white-space:normal;word-wrap:break-word;text-align:left}.result_download{margin-right:5px}#pagination{margin-top:30px;padding-bottom:60px}.label-default{color:#a4a4a4;background:0 0}.result .text-muted small{word-wrap:break-word}.modal-wrapper{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-wrapper{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0 none;position:relative}.infobox .panel-heading{background-color:#f6f9fa}.infobox .panel-heading .panel-title{font-weight:700}.infobox p{font-family:"DejaVu Serif",Georgia,Cambria,"Times New Roman",Times,serif!important;font-style:italic}.infobox .btn{background-color:#2ecc71;border:none}.infobox .btn a{color:#fff;margin:5px}.infobox .infobox_part{margin-bottom:20px;word-wrap:break-word;table-layout:fixed}.infobox .infobox_part:last-child{margin-bottom:0}.search_categories,#categories{text-transform:capitalize;margin-bottom:.5rem;display:flex;flex-wrap:wrap;flex-flow:row wrap;align-content:stretch}.search_categories label,#categories label,.search_categories .input-group-addon,#categories .input-group-addon{flex-grow:1;flex-basis:auto;font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;border-right:none;color:#666;padding-bottom:.4rem;padding-top:.4rem;text-align:center;min-width:50px}.search_categories label:last-child,#categories label:last-child,.search_categories .input-group-addon:last-child,#categories .input-group-addon:last-child{border-right:#ddd 1px solid}.search_categories input[type=checkbox]:checked+label,#categories input[type=checkbox]:checked+label{color:#29314d;font-weight:700;border-bottom:#01d7d4 5px solid}#main-logo{margin-top:10vh;margin-bottom:25px}#main-logo>img{max-width:350px;width:80%}#q{box-shadow:none;border-right:none;border-color:#a4a4a4}#search_form .input-group-btn .btn{border-color:#a4a4a4}#search_form .input-group-btn .btn:hover{background-color:#2ecc71;color:#fff}.custom-select{appearance:none;-webkit-appearance:none;-moz-appearance:none;font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;color:#666;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAQAAACR313BAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAABFkAAARZAVnbJUkAAAAHdElNRQfgBxgLDwB20OFsAAAAbElEQVQY073OsQ3CMAAEwJMYwJGnsAehpoXJItltBkmcdZBYgIIiQoLglnz3ui+eP+bk5uneteTMZJa6OJuIqvYzSJoqwqBq8gdmTTW86/dghxAUq4xsVYT9laBYXCw93Aajh7GPEF23t4fkBYevGFTANkPRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA3LTI0VDExOjU1OjU4KzAyOjAwRFqFOQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wNy0yNFQxMToxNTowMCswMjowMP7RDgQAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC) 96% no-repeat}.search-margin{margin-bottom:.6em}#advanced-search-container{display:none;text-align:left;margin-bottom:1rem;clear:both}#advanced-search-container label,#advanced-search-container .input-group-addon{font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;border-right:none;color:#666;padding-bottom:.4rem;padding-right:.7rem;padding-left:.7rem}#advanced-search-container label:last-child,#advanced-search-container .input-group-addon:last-child{border-right:#ddd 1px solid}#advanced-search-container input[type=radio]{display:none}#advanced-search-container input[type=radio]:checked+label{color:#29314d;font-weight:700;border-bottom:#01d7d4 5px solid}#check-advanced{display:none}#check-advanced:checked~#advanced-search-container{display:block}.advanced{padding:0;margin-top:.3rem;text-align:right}.advanced label,.advanced select{cursor:pointer}.cursor-text{cursor:text!important}.cursor-pointer{cursor:pointer!important}pre,code{font-family:'Ubuntu Mono','Courier New','Lucida Console',monospace!important}.lineno{margin-right:5px}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#556366;font-style:italic}.highlight .err{border:1px solid #ffa92f}.highlight .k{color:#BE74D5;font-weight:700}.highlight .o{color:#d19a66}.highlight .cm{color:#556366;font-style:italic}.highlight .cp{color:#bc7a00}.highlight .c1{color:#556366;font-style:italic}.highlight .cs{color:#556366;font-style:italic}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04d}.highlight .kc{color:#BE74D5;font-weight:700}.highlight .kd{color:#BE74D5;font-weight:700}.highlight .kn{color:#BE74D5;font-weight:700}.highlight .kp{color:#be74d5}.highlight .kr{color:#BE74D5;font-weight:700}.highlight .kt{color:#d46c72}.highlight .m{color:#d19a66}.highlight .s{color:#86c372}.highlight .na{color:#7d9029}.highlight .nb{color:#be74d5}.highlight .nc{color:#61AFEF;font-weight:700}.highlight .no{color:#d19a66}.highlight .nd{color:#a2f}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#61afef}.highlight .nl{color:#a0a000}.highlight .nn{color:#61AFEF;font-weight:700}.highlight .nt{color:#BE74D5;font-weight:700}.highlight .nv{color:#dfc06f}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#d7dae0}.highlight .mf{color:#d19a66}.highlight .mh{color:#d19a66}.highlight .mi{color:#d19a66}.highlight .mo{color:#d19a66}.highlight .sb{color:#86c372}.highlight .sc{color:#86c372}.highlight .sd{color:#86C372;font-style:italic}.highlight .s2{color:#86c372}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#86c372}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:#be74d5}.highlight .sr{color:#b68}.highlight .s1{color:#86c372}.highlight .ss{color:#dfc06f}.highlight .bp{color:#be74d5}.highlight .vc{color:#dfc06f}.highlight .vg{color:#dfc06f}.highlight .vi{color:#dfc06f}.highlight .il{color:#d19a66}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;color:#556366}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0}.highlight pre{background-color:#282C34;color:#D7DAE0;border:none;margin-bottom:25px;font-size:15px;padding:20px 10px}.highlight{font-weight:700}.table>tbody>tr>td,.table>tbody>tr>th{vertical-align:middle!important}body{background:#1d1f21 none!important;color:#D5D8D7!important}a{color:#41a2ce!important;text-decoration:none!important}a:hover{color:#5F89AC!important}input,button,textarea,select{border:1px solid #282a2e!important;background-color:#444!important;color:#BBB!important}input:focus,button:focus,textarea:focus,select:focus{border:1px solid #C5C8C6!important;box-shadow:initial!important}div#advanced-search-container div#categories label{background:0 0;border:1px solid #282a2e}ul.nav li a{border:0!important;border-bottom:1px solid #4d3f43!important}#categories *,.modal-wrapper *{background:#1d1f21 none!important;color:#D5D8D7!important}#categories *{border:1px solid #3d3f43!important}#categories :checked+label{border-bottom:4px solid #3d9f94!important}.result-content{color:#B5B8B7!important}.external-link{color:#35B887!important}.table-striped tr td,.table-striped tr th{border-color:#4d3f43!important}.highlight{background:#333!important}.navbar{background:#1d1f21 none;border:none}.navbar .active,.menu{background:none!important}.label-default{background:0 0;color:#BBB}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus,.nav-tabs.nav-justified>.active>a{background-color:#282a2e!important}.result-default:hover,.result-code:hover,.result-torrent:hover,.result-videos:hover,.result-map:hover{background-color:#222426}.btn{color:#BBB;background-color:#444;border:1px solid #282a2e}.btn:hover{color:#444!important;background-color:#BBB!important}.btn-primary.active{color:#C5C8C6;background-color:#5F89AC;border-color:#5F89AC}.panel{border:1px solid #111;background:0 0}.panel-heading{color:#C5C8C6!important;background:#282a2e!important;border-bottom:none}.panel-body{color:#C5C8C6!important;background:#1d1f21!important;border-color:#111!important}p.btn.btn-default{background:0 0}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th,.table-striped>thead>tr:nth-child(odd)>th{background:#2d2f32 none!important;color:#D5D8D7!important}.label-success{background:#1d6f42 none!important}.label-danger{background:#ad1f12 none!important}.searx-navbar{background:#333334;height:2.3rem;font-size:1.3rem;line-height:1.3rem;padding:.5rem;font-weight:700;margin-bottom:.8rem}.searx-navbar a,.searx-navbar a:hover{margin-right:2rem;color:#fff;text-decoration:none}.searx-navbar .instance a{color:#01d7d4;margin-left:2rem}#main-logo{margin-top:20vh;margin-bottom:25px}#main-logo>img{max-width:350px;width:80%}.onoffswitch-inner:before,.onoffswitch-inner:after{background:#1d1f21 none!important}.onoffswitch-switch,.onoffswitch-label{border:2px solid #3d3f43!important}.nav>li>a:hover,.nav>li>a:focus{background-color:#3d3f43!important}.img-thumbnail,.thumbnail{padding:0;line-height:1.42857143;background:0 0;border:none}.modal-content{background:#1d1f21 none!important}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background:rgba(240,0,0,.56)!important;color:#C5C8C6!important}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background:rgba(237,59,59,.61)!important;color:#C5C8C6!important}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background:#66696e!important}.btn-success{color:#C5C8C6;background:#449d44}.btn-danger{color:#C5C8C6;background:#d9534f}.well{background:#444;border-color:#282a2e}.highlight{background-color:transparent!important} \ No newline at end of file
+*{border-radius:0!important}html{position:relative;min-height:100%;color:#29314d}body{font-family:Roboto,Helvetica,Arial,sans-serif;margin-bottom:80px;background-color:#fff}body a{color:#08c}.footer{position:absolute;bottom:0;width:100%;height:60px;text-align:center;color:#999}input[type=checkbox]:checked+.label_hide_if_checked,input[type=checkbox]:checked+.label_hide_if_not_checked+.label_hide_if_checked{display:none}input[type=checkbox]:not(:checked)+.label_hide_if_not_checked,input[type=checkbox]:not(:checked)+.label_hide_if_checked+.label_hide_if_not_checked{display:none}.onoff-checkbox{width:15%}.onoffswitch{position:relative;width:110px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #FFF!important;border-radius:50px!important}.onoffswitch-inner{display:block;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;height:30px;padding:0;line-height:40px;font-size:20px;box-sizing:border-box;content:"";background-color:#EEE}.onoffswitch-switch{display:block;width:37px;background-color:#01d7d4;position:absolute;top:0;bottom:0;right:0;border:2px solid #FFF!important;border-radius:50px!important;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-right:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:71px;background-color:#A1A1A1}.result_header{margin-top:0;margin-bottom:2px;font-size:16px}.result_header .favicon{margin-bottom:-3px}.result_header a{color:#29314d;text-decoration:none}.result_header a:hover{color:#08c}.result_header a:visited{color:#684898}.result_header a .highlight{background-color:#f6f9fa}.result-content,.result-format,.result-source{margin-top:2px;margin-bottom:0;word-wrap:break-word;color:#666;font-size:13px}.result-content .highlight,.result-format .highlight,.result-source .highlight{font-weight:700}.result-source{font-size:10px;float:left}.result-format{font-size:10px;float:right}.external-link{color:#069025;font-size:12px;margin-bottom:15px}.external-link a{margin-right:3px}.result-default,.result-code,.result-torrent,.result-videos,.result-map{clear:both;padding:2px 4px}.result-default:hover,.result-code:hover,.result-torrent:hover,.result-videos:hover,.result-map:hover{background-color:#f6f9fa}.result-images{float:left!important;width:24%;margin:.5%}.result-images a{display:block;width:100%;background-size:cover}.img-thumbnail{margin:5px;max-height:128px;min-height:128px}.result-videos{clear:both}.result-videos hr{margin:5px 0 15px 0}.result-videos .collapse{width:100%}.result-videos .in{margin-bottom:8px}.result-torrent{clear:both}.result-torrent b{margin-right:5px;margin-left:5px}.result-torrent .seeders{color:#2ecc71}.result-torrent .leechers{color:#f35e77}.result-map{clear:both}.result-code{clear:both}.result-code .code-fork,.result-code .code-fork a{color:#666}.suggestion_item{margin:2px 5px;max-width:100%}.suggestion_item .btn{max-width:100%;white-space:normal;word-wrap:break-word;text-align:left}.result_download{margin-right:5px}#pagination{margin-top:30px;padding-bottom:60px}.label-default{color:#a4a4a4;background:0 0}.result .text-muted small{word-wrap:break-word}.modal-wrapper{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-wrapper{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0 none;position:relative}.infobox .panel-heading{background-color:#f6f9fa}.infobox .panel-heading .panel-title{font-weight:700}.infobox p{font-family:"DejaVu Serif",Georgia,Cambria,"Times New Roman",Times,serif!important;font-style:italic}.infobox .btn{background-color:#2ecc71;border:none}.infobox .btn a{color:#fff;margin:5px}.infobox .infobox_part{margin-bottom:20px;word-wrap:break-word;table-layout:fixed}.infobox .infobox_part:last-child{margin-bottom:0}.search_categories,#categories{text-transform:capitalize;margin-bottom:.5rem;display:flex;flex-wrap:wrap;flex-flow:row wrap;align-content:stretch}.search_categories label,#categories label,.search_categories .input-group-addon,#categories .input-group-addon{flex-grow:1;flex-basis:auto;font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;border-right:none;color:#666;padding-bottom:.4rem;padding-top:.4rem;text-align:center;min-width:50px}.search_categories label:last-child,#categories label:last-child,.search_categories .input-group-addon:last-child,#categories .input-group-addon:last-child{border-right:#ddd 1px solid}.search_categories input[type=checkbox]:checked+label,#categories input[type=checkbox]:checked+label{color:#29314d;font-weight:700;border-bottom:#01d7d4 5px solid}#main-logo{margin-top:10vh;margin-bottom:25px}#main-logo>img{max-width:350px;width:80%}#q{box-shadow:none;border-right:none;border-color:#a4a4a4}#search_form .input-group-btn .btn{border-color:#a4a4a4}#search_form .input-group-btn .btn:hover{background-color:#2ecc71;color:#fff}.custom-select{appearance:none;-webkit-appearance:none;-moz-appearance:none;font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;color:#666;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAQAAACR313BAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAABFkAAARZAVnbJUkAAAAHdElNRQfgBxgLDwB20OFsAAAAbElEQVQY073OsQ3CMAAEwJMYwJGnsAehpoXJItltBkmcdZBYgIIiQoLglnz3ui+eP+bk5uneteTMZJa6OJuIqvYzSJoqwqBq8gdmTTW86/dghxAUq4xsVYT9laBYXCw93Aajh7GPEF23t4fkBYevGFTANkPRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA3LTI0VDExOjU1OjU4KzAyOjAwRFqFOQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wNy0yNFQxMToxNTowMCswMjowMP7RDgQAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC) 96% no-repeat}.search-margin{margin-bottom:.6em}#advanced-search-container{display:none;text-align:left;margin-bottom:1rem;clear:both}#advanced-search-container label,#advanced-search-container .input-group-addon{font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;border-right:none;color:#666;padding-bottom:.4rem;padding-right:.7rem;padding-left:.7rem}#advanced-search-container label:last-child,#advanced-search-container .input-group-addon:last-child{border-right:#ddd 1px solid}#advanced-search-container input[type=radio]{display:none}#advanced-search-container input[type=radio]:checked+label{color:#29314d;font-weight:700;border-bottom:#01d7d4 5px solid}#check-advanced{display:none}#check-advanced:checked~#advanced-search-container{display:block}.advanced{padding:0;margin-top:.3rem;text-align:right}.advanced label,.advanced select{cursor:pointer}.cursor-text{cursor:text!important}.cursor-pointer{cursor:pointer!important}pre,code{font-family:'Ubuntu Mono','Courier New','Lucida Console',monospace!important}.lineno{margin-right:5px}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#556366;font-style:italic}.highlight .err{border:1px solid #ffa92f}.highlight .k{color:#BE74D5;font-weight:700}.highlight .o{color:#d19a66}.highlight .cm{color:#556366;font-style:italic}.highlight .cp{color:#bc7a00}.highlight .c1{color:#556366;font-style:italic}.highlight .cs{color:#556366;font-style:italic}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04d}.highlight .kc{color:#BE74D5;font-weight:700}.highlight .kd{color:#BE74D5;font-weight:700}.highlight .kn{color:#BE74D5;font-weight:700}.highlight .kp{color:#be74d5}.highlight .kr{color:#BE74D5;font-weight:700}.highlight .kt{color:#d46c72}.highlight .m{color:#d19a66}.highlight .s{color:#86c372}.highlight .na{color:#7d9029}.highlight .nb{color:#be74d5}.highlight .nc{color:#61AFEF;font-weight:700}.highlight .no{color:#d19a66}.highlight .nd{color:#a2f}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#61afef}.highlight .nl{color:#a0a000}.highlight .nn{color:#61AFEF;font-weight:700}.highlight .nt{color:#BE74D5;font-weight:700}.highlight .nv{color:#dfc06f}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#d7dae0}.highlight .mf{color:#d19a66}.highlight .mh{color:#d19a66}.highlight .mi{color:#d19a66}.highlight .mo{color:#d19a66}.highlight .sb{color:#86c372}.highlight .sc{color:#86c372}.highlight .sd{color:#86C372;font-style:italic}.highlight .s2{color:#86c372}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#86c372}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:#be74d5}.highlight .sr{color:#b68}.highlight .s1{color:#86c372}.highlight .ss{color:#dfc06f}.highlight .bp{color:#be74d5}.highlight .vc{color:#dfc06f}.highlight .vg{color:#dfc06f}.highlight .vi{color:#dfc06f}.highlight .il{color:#d19a66}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;color:#556366}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0}.highlight pre{background-color:#282C34;color:#D7DAE0;border:none;margin-bottom:25px;font-size:15px;padding:20px 10px}.highlight{font-weight:700}.table>tbody>tr>td,.table>tbody>tr>th{vertical-align:middle!important}body{background:#1d1f21 none!important;color:#D5D8D7!important}a{color:#41a2ce!important;text-decoration:none!important}a:hover{color:#5F89AC!important}input,button,textarea,select{border:1px solid #282a2e!important;background-color:#444!important;color:#BBB!important}input:focus,button:focus,textarea:focus,select:focus{border:1px solid #C5C8C6!important;box-shadow:initial!important}div#advanced-search-container div#categories label{background:0 0;border:1px solid #282a2e}ul.nav li a{border:0!important;border-bottom:1px solid #4d3f43!important}#categories *,.modal-wrapper *{background:#1d1f21 none!important;color:#D5D8D7!important}#categories *{border:1px solid #3d3f43!important}#categories :checked+label{border-bottom:4px solid #3d9f94!important}.result-content,.result-source,.result-format{color:#B5B8B7!important}.external-link{color:#35B887!important}.table-striped tr td,.table-striped tr th{border-color:#4d3f43!important}.highlight{background:#333!important}.navbar{background:#1d1f21 none;border:none}.navbar .active,.menu{background:none!important}.label-default{background:0 0;color:#BBB}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus,.nav-tabs.nav-justified>.active>a{background-color:#282a2e!important}.result-default:hover,.result-code:hover,.result-torrent:hover,.result-videos:hover,.result-map:hover{background-color:#222426}.btn{color:#BBB;background-color:#444;border:1px solid #282a2e}.btn:hover{color:#444!important;background-color:#BBB!important}.btn-primary.active{color:#C5C8C6;background-color:#5F89AC;border-color:#5F89AC}.panel{border:1px solid #111;background:0 0}.panel-heading{color:#C5C8C6!important;background:#282a2e!important;border-bottom:none}.panel-body{color:#C5C8C6!important;background:#1d1f21!important;border-color:#111!important}p.btn.btn-default{background:0 0}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th,.table-striped>thead>tr:nth-child(odd)>th{background:#2d2f32 none!important;color:#D5D8D7!important}.label-success{background:#1d6f42 none!important}.label-danger{background:#ad1f12 none!important}.searx-navbar{background:#333334;height:2.3rem;font-size:1.3rem;line-height:1.3rem;padding:.5rem;font-weight:700;margin-bottom:.8rem}.searx-navbar a,.searx-navbar a:hover{margin-right:2rem;color:#fff;text-decoration:none}.searx-navbar .instance a{color:#01d7d4;margin-left:2rem}#main-logo{margin-top:20vh;margin-bottom:25px}#main-logo>img{max-width:350px;width:80%}.onoffswitch-inner:before,.onoffswitch-inner:after{background:#1d1f21 none!important}.onoffswitch-switch,.onoffswitch-label{border:2px solid #3d3f43!important}.nav>li>a:hover,.nav>li>a:focus{background-color:#3d3f43!important}.img-thumbnail,.thumbnail{padding:0;line-height:1.42857143;background:0 0;border:none}.modal-content{background:#1d1f21 none!important}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background:rgba(240,0,0,.56)!important;color:#C5C8C6!important}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background:rgba(237,59,59,.61)!important;color:#C5C8C6!important}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background:#66696e!important}.btn-success{color:#C5C8C6;background:#449d44}.btn-danger{color:#C5C8C6;background:#d9534f}.well{background:#444;border-color:#282a2e}.highlight{background-color:transparent!important} \ No newline at end of file
diff --git a/searx/static/themes/oscar/css/logicodev.css b/searx/static/themes/oscar/css/logicodev.css
new file mode 100644
index 000000000..5e78ac749
--- /dev/null
+++ b/searx/static/themes/oscar/css/logicodev.css
@@ -0,0 +1,931 @@
+* {
+ border-radius: 0 !important;
+}
+html {
+ position: relative;
+ min-height: 100%;
+ color: #29314d;
+}
+body {
+ /* Margin bottom by footer height */
+ font-family: 'Roboto', Helvetica, Arial, sans-serif;
+ margin-bottom: 80px;
+ background-color: white;
+}
+body a {
+ color: #0088cc;
+}
+.footer {
+ position: absolute;
+ bottom: 0;
+ width: 100%;
+ /* Set the fixed height of the footer here */
+ height: 60px;
+ text-align: center;
+ color: #999;
+}
+input[type=checkbox]:checked + .label_hide_if_checked,
+input[type=checkbox]:checked + .label_hide_if_not_checked + .label_hide_if_checked {
+ display: none;
+}
+input[type=checkbox]:not(:checked) + .label_hide_if_not_checked,
+input[type=checkbox]:not(:checked) + .label_hide_if_checked + .label_hide_if_not_checked {
+ display: none;
+}
+.onoff-checkbox {
+ width: 15%;
+}
+.onoffswitch {
+ position: relative;
+ width: 110px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+}
+.onoffswitch-checkbox {
+ display: none;
+}
+.onoffswitch-label {
+ display: block;
+ overflow: hidden;
+ cursor: pointer;
+ border: 2px solid #FFFFFF !important;
+ border-radius: 50px !important;
+}
+.onoffswitch-inner {
+ display: block;
+ transition: margin 0.3s ease-in 0s;
+}
+.onoffswitch-inner:before,
+.onoffswitch-inner:after {
+ display: block;
+ float: left;
+ width: 50%;
+ height: 30px;
+ padding: 0;
+ line-height: 40px;
+ font-size: 20px;
+ box-sizing: border-box;
+ content: "";
+ background-color: #EEEEEE;
+}
+.onoffswitch-switch {
+ display: block;
+ width: 37px;
+ background-color: #01d7d4;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ right: 0px;
+ border: 2px solid #FFFFFF !important;
+ border-radius: 50px !important;
+ transition: all 0.3s ease-in 0s;
+}
+.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner {
+ margin-right: 0;
+}
+.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch {
+ right: 71px;
+ background-color: #A1A1A1;
+}
+.result_header {
+ margin-top: 0px;
+ margin-bottom: 2px;
+ font-size: 16px;
+}
+.result_header .favicon {
+ margin-bottom: -3px;
+}
+.result_header a {
+ color: #29314d;
+ text-decoration: none;
+}
+.result_header a:hover {
+ color: #0088cc;
+}
+.result_header a:visited {
+ color: #684898;
+}
+.result_header a .highlight {
+ background-color: #f6f9fa;
+}
+.result-content,
+.result-format,
+.result-source {
+ margin-top: 2px;
+ margin-bottom: 0;
+ word-wrap: break-word;
+ color: #666666;
+ font-size: 13px;
+}
+.result-content .highlight,
+.result-format .highlight,
+.result-source .highlight {
+ font-weight: bold;
+}
+.result-source {
+ font-size: 10px;
+ float: left;
+}
+.result-format {
+ font-size: 10px;
+ float: right;
+}
+.external-link {
+ color: #069025;
+ font-size: 12px;
+ margin-bottom: 15px;
+}
+.external-link a {
+ margin-right: 3px;
+}
+.result-default,
+.result-code,
+.result-torrent,
+.result-videos,
+.result-map {
+ clear: both;
+ padding: 2px 4px;
+}
+.result-default:hover,
+.result-code:hover,
+.result-torrent:hover,
+.result-videos:hover,
+.result-map:hover {
+ background-color: #f6f9fa;
+}
+.result-images {
+ float: left !important;
+ width: 24%;
+ margin: .5%;
+}
+.result-images a {
+ display: block;
+ width: 100%;
+ background-size: cover;
+}
+.img-thumbnail {
+ margin: 5px;
+ max-height: 128px;
+ min-height: 128px;
+}
+.result-videos {
+ clear: both;
+}
+.result-videos hr {
+ margin: 5px 0 15px 0;
+}
+.result-videos .collapse {
+ width: 100%;
+}
+.result-videos .in {
+ margin-bottom: 8px;
+}
+.result-torrent {
+ clear: both;
+}
+.result-torrent b {
+ margin-right: 5px;
+ margin-left: 5px;
+}
+.result-torrent .seeders {
+ color: #2ecc71;
+}
+.result-torrent .leechers {
+ color: #f35e77;
+}
+.result-map {
+ clear: both;
+}
+.result-code {
+ clear: both;
+}
+.result-code .code-fork,
+.result-code .code-fork a {
+ color: #666666;
+}
+.suggestion_item {
+ margin: 2px 5px;
+ max-width: 100%;
+}
+.suggestion_item .btn {
+ max-width: 100%;
+ white-space: normal;
+ word-wrap: break-word;
+ text-align: left;
+}
+.result_download {
+ margin-right: 5px;
+}
+#pagination {
+ margin-top: 30px;
+ padding-bottom: 60px;
+}
+.label-default {
+ color: #a4a4a4;
+ background: transparent;
+}
+.result .text-muted small {
+ word-wrap: break-word;
+}
+.modal-wrapper {
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+}
+.modal-wrapper {
+ background-clip: padding-box;
+ background-color: #fff;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 6px;
+ box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+ outline: 0 none;
+ position: relative;
+}
+.infobox .panel-heading {
+ background-color: #f6f9fa;
+}
+.infobox .panel-heading .panel-title {
+ font-weight: 700;
+}
+.infobox p {
+ font-family: "DejaVu Serif", Georgia, Cambria, "Times New Roman", Times, serif !important;
+ font-style: italic;
+}
+.infobox .btn {
+ background-color: #2ecc71;
+ border: none;
+}
+.infobox .btn a {
+ color: white;
+ margin: 5px;
+}
+.infobox .infobox_part {
+ margin-bottom: 20px;
+ word-wrap: break-word;
+ table-layout: fixed;
+}
+.infobox .infobox_part:last-child {
+ margin-bottom: 0;
+}
+.search_categories,
+#categories {
+ text-transform: capitalize;
+ margin-bottom: 0.5rem;
+ display: flex;
+ flex-wrap: wrap;
+ flex-flow: row wrap;
+ align-content: stretch;
+}
+.search_categories label,
+#categories label,
+.search_categories .input-group-addon,
+#categories .input-group-addon {
+ flex-grow: 1;
+ flex-basis: auto;
+ font-size: 1.2rem;
+ font-weight: normal;
+ background-color: white;
+ border: #dddddd 1px solid;
+ border-right: none;
+ color: #666666;
+ padding-bottom: 0.4rem;
+ padding-top: 0.4rem;
+ text-align: center;
+ min-width: 50px;
+}
+.search_categories label:last-child,
+#categories label:last-child,
+.search_categories .input-group-addon:last-child,
+#categories .input-group-addon:last-child {
+ border-right: #dddddd 1px solid;
+}
+.search_categories input[type="checkbox"]:checked + label,
+#categories input[type="checkbox"]:checked + label {
+ color: #29314d;
+ font-weight: bold;
+ border-bottom: #01d7d4 5px solid;
+}
+#main-logo {
+ margin-top: 10vh;
+ margin-bottom: 25px;
+}
+#main-logo > img {
+ max-width: 350px;
+ width: 80%;
+}
+#q {
+ box-shadow: none;
+ border-right: none;
+ border-color: #a4a4a4;
+}
+#search_form .input-group-btn .btn {
+ border-color: #a4a4a4;
+}
+#search_form .input-group-btn .btn:hover {
+ background-color: #2ecc71;
+ color: white;
+}
+.custom-select {
+ appearance: none;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ font-size: 1.2rem;
+ font-weight: normal;
+ background-color: white;
+ border: #dddddd 1px solid;
+ color: #666666;
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAQAAACR313BAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
+AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZ
+cwAABFkAAARZAVnbJUkAAAAHdElNRQfgBxgLDwB20OFsAAAAbElEQVQY073OsQ3CMAAEwJMYwJGn
+sAehpoXJItltBkmcdZBYgIIiQoLglnz3ui+eP+bk5uneteTMZJa6OJuIqvYzSJoqwqBq8gdmTTW8
+6/dghxAUq4xsVYT9laBYXCw93Aajh7GPEF23t4fkBYevGFTANkPRAAAAJXRFWHRkYXRlOmNyZWF0
+ZQAyMDE2LTA3LTI0VDExOjU1OjU4KzAyOjAwRFqFOQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0w
+Ny0yNFQxMToxNTowMCswMjowMP7RDgQAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb
+7jwaAAAAAElFTkSuQmCC) 96% no-repeat;
+}
+.search-margin {
+ margin-bottom: 0.6em;
+}
+#advanced-search-container {
+ display: none;
+ text-align: left;
+ margin-bottom: 1rem;
+ clear: both;
+}
+#advanced-search-container label,
+#advanced-search-container .input-group-addon {
+ font-size: 1.2rem;
+ font-weight: normal;
+ background-color: white;
+ border: #dddddd 1px solid;
+ border-right: none;
+ color: #666666;
+ padding-bottom: 0.4rem;
+ padding-right: 0.7rem;
+ padding-left: 0.7rem;
+}
+#advanced-search-container label:last-child,
+#advanced-search-container .input-group-addon:last-child {
+ border-right: #dddddd 1px solid;
+}
+#advanced-search-container input[type="radio"] {
+ display: none;
+}
+#advanced-search-container input[type="radio"]:checked + label {
+ color: #29314d;
+ font-weight: bold;
+ border-bottom: #01d7d4 5px solid;
+}
+#check-advanced {
+ display: none;
+}
+#check-advanced:checked ~ #advanced-search-container {
+ display: block;
+}
+.advanced {
+ padding: 0;
+ margin-top: 0.3rem;
+ text-align: right;
+}
+.advanced label,
+.advanced select {
+ cursor: pointer;
+}
+.cursor-text {
+ cursor: text !important;
+}
+.cursor-pointer {
+ cursor: pointer !important;
+}
+pre,
+code {
+ font-family: 'Ubuntu Mono', 'Courier New', 'Lucida Console', monospace !important;
+}
+.lineno {
+ margin-right: 5px;
+}
+.highlight .hll {
+ background-color: #ffffcc;
+}
+.highlight {
+ background: #f8f8f8;
+}
+.highlight .c {
+ color: #556366;
+ font-style: italic;
+}
+/* Comment */
+.highlight .err {
+ border: 1px solid #ffa92f;
+}
+/* Error */
+.highlight .k {
+ color: #BE74D5;
+ font-weight: bold;
+}
+/* Keyword */
+.highlight .o {
+ color: #d19a66;
+}
+/* Operator */
+.highlight .cm {
+ color: #556366;
+ font-style: italic;
+}
+/* Comment.Multiline */
+.highlight .cp {
+ color: #bc7a00;
+}
+/* Comment.Preproc */
+.highlight .c1 {
+ color: #556366;
+ font-style: italic;
+}
+/* Comment.Single */
+.highlight .cs {
+ color: #556366;
+ font-style: italic;
+}
+/* Comment.Special */
+.highlight .gd {
+ color: #a00000;
+}
+/* Generic.Deleted */
+.highlight .ge {
+ font-style: italic;
+}
+/* Generic.Emph */
+.highlight .gr {
+ color: #ff0000;
+}
+/* Generic.Error */
+.highlight .gh {
+ color: #000080;
+ font-weight: bold;
+}
+/* Generic.Heading */
+.highlight .gi {
+ color: #00a000;
+}
+/* Generic.Inserted */
+.highlight .go {
+ color: #888888;
+}
+/* Generic.Output */
+.highlight .gp {
+ color: #000080;
+ font-weight: bold;
+}
+/* Generic.Prompt */
+.highlight .gs {
+ font-weight: bold;
+}
+/* Generic.Strong */
+.highlight .gu {
+ color: #800080;
+ font-weight: bold;
+}
+/* Generic.Subheading */
+.highlight .gt {
+ color: #0044dd;
+}
+/* Generic.Traceback */
+.highlight .kc {
+ color: #BE74D5;
+ font-weight: bold;
+}
+/* Keyword.Constant */
+.highlight .kd {
+ color: #BE74D5;
+ font-weight: bold;
+}
+/* Keyword.Declaration */
+.highlight .kn {
+ color: #BE74D5;
+ font-weight: bold;
+}
+/* Keyword.Namespace */
+.highlight .kp {
+ color: #be74d5;
+}
+/* Keyword.Pseudo */
+.highlight .kr {
+ color: #BE74D5;
+ font-weight: bold;
+}
+/* Keyword.Reserved */
+.highlight .kt {
+ color: #d46c72;
+}
+/* Keyword.Type */
+.highlight .m {
+ color: #d19a66;
+}
+/* Literal.Number */
+.highlight .s {
+ color: #86c372;
+}
+/* Literal.String */
+.highlight .na {
+ color: #7d9029;
+}
+/* Name.Attribute */
+.highlight .nb {
+ color: #be74d5;
+}
+/* Name.Builtin */
+.highlight .nc {
+ color: #61AFEF;
+ font-weight: bold;
+}
+/* Name.Class */
+.highlight .no {
+ color: #d19a66;
+}
+/* Name.Constant */
+.highlight .nd {
+ color: #aa22ff;
+}
+/* Name.Decorator */
+.highlight .ni {
+ color: #999999;
+ font-weight: bold;
+}
+/* Name.Entity */
+.highlight .ne {
+ color: #D2413A;
+ font-weight: bold;
+}
+/* Name.Exception */
+.highlight .nf {
+ color: #61afef;
+}
+/* Name.Function */
+.highlight .nl {
+ color: #a0a000;
+}
+/* Name.Label */
+.highlight .nn {
+ color: #61AFEF;
+ font-weight: bold;
+}
+/* Name.Namespace */
+.highlight .nt {
+ color: #BE74D5;
+ font-weight: bold;
+}
+/* Name.Tag */
+.highlight .nv {
+ color: #dfc06f;
+}
+/* Name.Variable */
+.highlight .ow {
+ color: #AA22FF;
+ font-weight: bold;
+}
+/* Operator.Word */
+.highlight .w {
+ color: #d7dae0;
+}
+/* Text.Whitespace */
+.highlight .mf {
+ color: #d19a66;
+}
+/* Literal.Number.Float */
+.highlight .mh {
+ color: #d19a66;
+}
+/* Literal.Number.Hex */
+.highlight .mi {
+ color: #d19a66;
+}
+/* Literal.Number.Integer */
+.highlight .mo {
+ color: #d19a66;
+}
+/* Literal.Number.Oct */
+.highlight .sb {
+ color: #86c372;
+}
+/* Literal.String.Backtick */
+.highlight .sc {
+ color: #86c372;
+}
+/* Literal.String.Char */
+.highlight .sd {
+ color: #86C372;
+ font-style: italic;
+}
+/* Literal.String.Doc */
+.highlight .s2 {
+ color: #86c372;
+}
+/* Literal.String.Double */
+.highlight .se {
+ color: #BB6622;
+ font-weight: bold;
+}
+/* Literal.String.Escape */
+.highlight .sh {
+ color: #86c372;
+}
+/* Literal.String.Heredoc */
+.highlight .si {
+ color: #BB6688;
+ font-weight: bold;
+}
+/* Literal.String.Interpol */
+.highlight .sx {
+ color: #be74d5;
+}
+/* Literal.String.Other */
+.highlight .sr {
+ color: #bb6688;
+}
+/* Literal.String.Regex */
+.highlight .s1 {
+ color: #86c372;
+}
+/* Literal.String.Single */
+.highlight .ss {
+ color: #dfc06f;
+}
+/* Literal.String.Symbol */
+.highlight .bp {
+ color: #be74d5;
+}
+/* Name.Builtin.Pseudo */
+.highlight .vc {
+ color: #dfc06f;
+}
+/* Name.Variable.Class */
+.highlight .vg {
+ color: #dfc06f;
+}
+/* Name.Variable.Global */
+.highlight .vi {
+ color: #dfc06f;
+}
+/* Name.Variable.Instance */
+.highlight .il {
+ color: #d19a66;
+}
+/* Literal.Number.Integer.Long */
+.highlight .lineno {
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ cursor: default;
+ color: #556366;
+}
+.highlight .lineno::selection {
+ background: transparent;
+ /* WebKit/Blink Browsers */
+}
+.highlight .lineno::-moz-selection {
+ background: transparent;
+ /* Gecko Browsers */
+}
+.highlight pre {
+ background-color: #282C34;
+ color: #D7DAE0;
+ border: none;
+ margin-bottom: 25px;
+ font-size: 15px;
+ padding: 20px 10px;
+}
+.highlight {
+ font-weight: 700;
+}
+.table > tbody > tr > td,
+.table > tbody > tr > th {
+ vertical-align: middle !important;
+}
+/*Global*/
+body {
+ background: #1d1f21 none !important;
+ color: #D5D8D7 !important;
+}
+a {
+ color: #41a2ce !important;
+ text-decoration: none !important;
+}
+a:hover {
+ color: #5F89AC !important;
+}
+input,
+button,
+textarea,
+select {
+ border: 1px solid #282a2e !important;
+ background-color: #444 !important;
+ color: #BBB !important;
+}
+input:focus,
+button:focus,
+textarea:focus,
+select:focus {
+ border: 1px solid #C5C8C6 !important;
+ box-shadow: initial !important;
+}
+div#advanced-search-container div#categories label {
+ background: none;
+ border: 1px solid #282a2e;
+}
+ul.nav li a {
+ border: 0 !important;
+ border-bottom: 1px solid #4d3f43 !important;
+}
+#categories *,
+.modal-wrapper * {
+ background: #1d1f21 none !important;
+ color: #D5D8D7 !important;
+}
+#categories * {
+ border: 1px solid #3d3f43 !important;
+}
+#categories *:checked + label {
+ border-bottom: 4px solid #3d9f94 !important;
+}
+.result-content,
+.result-source,
+.result-format {
+ color: #B5B8B7 !important;
+}
+.external-link {
+ color: #35B887 !important;
+}
+.table-striped tr td,
+.table-striped tr th {
+ border-color: #4d3f43 !important;
+}
+.highlight {
+ background: #333333 !important;
+}
+/*nav*/
+.navbar {
+ background: #1d1f21 none;
+ border: none;
+}
+.navbar .active,
+.menu {
+ background: none !important;
+}
+.label-default {
+ background: none;
+ color: #BBB;
+}
+.navbar-default .navbar-nav > .active > a,
+.navbar-default .navbar-nav > .active > a:hover,
+.navbar-default .navbar-nav > .active > a:focus,
+.nav-tabs.nav-justified > .active > a {
+ background-color: #282a2e !important;
+}
+/*Search Page*/
+.result-default:hover,
+.result-code:hover,
+.result-torrent:hover,
+.result-videos:hover,
+.result-map:hover {
+ background-color: #222426;
+}
+/*buttons*/
+.btn {
+ color: #BBB;
+ background-color: #444 ;
+ border: 1px solid #282a2e;
+}
+.btn:hover {
+ color: #444 !important;
+ background-color: #BBB !important;
+}
+.btn-primary.active {
+ color: #C5C8C6;
+ background-color: #5F89AC;
+ border-color: #5F89AC;
+}
+/*Right Pannels*/
+.panel {
+ border: 1px solid #111;
+ background: none;
+}
+.panel-heading {
+ color: #C5C8C6 !important;
+ background: #282a2e !important;
+ border-bottom: none;
+}
+.panel-body {
+ color: #C5C8C6 !important;
+ background: #1d1f21 !important;
+ border-color: #111 !important;
+}
+p.btn.btn-default {
+ background: none;
+}
+.table-striped > tbody > tr:nth-child(odd) > td,
+.table-striped > tbody > tr:nth-child(odd) > th,
+.table-striped > thead > tr:nth-child(odd) > th {
+ background: #2d2f32 none !important;
+ color: #D5D8D7 !important;
+}
+.label-success {
+ background: #1d6f42 none !important;
+}
+.label-danger {
+ background: #ad1f12 none !important;
+}
+.searx-navbar {
+ background: #333334;
+ height: 2.3rem;
+ font-size: 1.3rem;
+ line-height: 1.3rem;
+ padding: 0.5rem;
+ font-weight: bold;
+ margin-bottom: 0.8rem;
+}
+.searx-navbar a,
+.searx-navbar a:hover {
+ margin-right: 2.0rem;
+ color: white;
+ text-decoration: none;
+}
+.searx-navbar .instance a {
+ color: #01d7d4;
+ margin-left: 2.0rem;
+}
+#main-logo {
+ margin-top: 20vh;
+ margin-bottom: 25px;
+}
+#main-logo > img {
+ max-width: 350px;
+ width: 80%;
+}
+.onoffswitch-inner:before,
+.onoffswitch-inner:after {
+ background: #1d1f21 none !important;
+}
+.onoffswitch-switch,
+.onoffswitch-label {
+ border: 2px solid #3d3f43 !important;
+}
+.nav > li > a:hover,
+.nav > li > a:focus {
+ background-color: #3d3f43 !important;
+}
+/*Images search*/
+.img-thumbnail,
+.thumbnail {
+ padding: 0px;
+ line-height: 1.42857143;
+ background: none;
+ border: none;
+}
+.modal-content {
+ background: #1d1f21 none !important;
+}
+/*Preferences*/
+.table > thead > tr > td.danger,
+.table > tbody > tr > td.danger,
+.table > tfoot > tr > td.danger,
+.table > thead > tr > th.danger,
+.table > tbody > tr > th.danger,
+.table > tfoot > tr > th.danger,
+.table > thead > tr.danger > td,
+.table > tbody > tr.danger > td,
+.table > tfoot > tr.danger > td,
+.table > thead > tr.danger > th,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr.danger > th {
+ background: rgba(240, 0, 0, 0.56) !important;
+ color: #C5C8C6 !important;
+}
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover,
+.table-hover > tbody > tr.danger:hover > td,
+.table-hover > tbody > tr:hover > .danger,
+.table-hover > tbody > tr.danger:hover > th {
+ background: rgba(237, 59, 59, 0.61) !important;
+ color: #C5C8C6 !important;
+}
+.table-hover > tbody > tr:hover > td,
+.table-hover > tbody > tr:hover > th {
+ background: #66696e !important;
+}
+.btn-success {
+ color: #C5C8C6;
+ background: #449d44;
+}
+.btn-danger {
+ color: #C5C8C6;
+ background: #d9534f;
+}
+.well {
+ background: #444;
+ border-color: #282a2e;
+}
+.highlight {
+ background-color: transparent !important;
+}
diff --git a/searx/static/themes/oscar/css/logicodev.min.css b/searx/static/themes/oscar/css/logicodev.min.css
index 237cf7fbf..7f093e717 100644
--- a/searx/static/themes/oscar/css/logicodev.min.css
+++ b/searx/static/themes/oscar/css/logicodev.min.css
@@ -1 +1 @@
-.searx-navbar{background:#29314d;height:2.3rem;font-size:1.3rem;line-height:1.3rem;padding:.5rem;font-weight:700;margin-bottom:.8rem}.searx-navbar a,.searx-navbar a:hover{margin-right:2rem;color:#fff;text-decoration:none}.searx-navbar .instance a{color:#01d7d4;margin-left:2rem}#main-logo{margin-top:20vh;margin-bottom:25px}#main-logo>img{max-width:350px;width:80%}*{border-radius:0!important}html{position:relative;min-height:100%;color:#29314d}body{font-family:Roboto,Helvetica,Arial,sans-serif;margin-bottom:80px;background-color:#fff}body a{color:#08c}.footer{position:absolute;bottom:0;width:100%;height:60px;text-align:center;color:#999}input[type=checkbox]:checked+.label_hide_if_checked,input[type=checkbox]:checked+.label_hide_if_not_checked+.label_hide_if_checked{display:none}input[type=checkbox]:not(:checked)+.label_hide_if_not_checked,input[type=checkbox]:not(:checked)+.label_hide_if_checked+.label_hide_if_not_checked{display:none}.onoff-checkbox{width:15%}.onoffswitch{position:relative;width:110px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #FFF!important;border-radius:50px!important}.onoffswitch-inner{display:block;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;height:30px;padding:0;line-height:40px;font-size:20px;box-sizing:border-box;content:"";background-color:#EEE}.onoffswitch-switch{display:block;width:37px;background-color:#01d7d4;position:absolute;top:0;bottom:0;right:0;border:2px solid #FFF!important;border-radius:50px!important;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-right:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:71px;background-color:#A1A1A1}.result_header{margin-top:0;margin-bottom:2px;font-size:16px}.result_header .favicon{margin-bottom:-3px}.result_header a{color:#29314d;text-decoration:none}.result_header a:hover{color:#08c}.result_header a:visited{color:#684898}.result_header a .highlight{background-color:#f6f9fa}.result-content{margin-top:2px;margin-bottom:0;word-wrap:break-word;color:#666;font-size:13px}.result-content .highlight{font-weight:700}.external-link{color:#069025;font-size:12px;margin-bottom:15px}.external-link a{margin-right:3px}.result-default,.result-code,.result-torrent,.result-videos,.result-map{clear:both;padding:2px 4px}.result-default:hover,.result-code:hover,.result-torrent:hover,.result-videos:hover,.result-map:hover{background-color:#f6f9fa}.result-images{float:left!important;width:24%;margin:.5%}.result-images a{display:block;width:100%;background-size:cover}.img-thumbnail{margin:5px;max-height:128px;min-height:128px}.result-videos{clear:both}.result-videos hr{margin:5px 0 15px 0}.result-videos .collapse{width:100%}.result-videos .in{margin-bottom:8px}.result-torrent{clear:both}.result-torrent b{margin-right:5px;margin-left:5px}.result-torrent .seeders{color:#2ecc71}.result-torrent .leechers{color:#f35e77}.result-map{clear:both}.result-code{clear:both}.result-code .code-fork,.result-code .code-fork a{color:#666}.suggestion_item{margin:2px 5px;max-width:100%}.suggestion_item .btn{max-width:100%;white-space:normal;word-wrap:break-word;text-align:left}.result_download{margin-right:5px}#pagination{margin-top:30px;padding-bottom:60px}.label-default{color:#a4a4a4;background:0 0}.result .text-muted small{word-wrap:break-word}.modal-wrapper{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-wrapper{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0 none;position:relative}.infobox .panel-heading{background-color:#f6f9fa}.infobox .panel-heading .panel-title{font-weight:700}.infobox p{font-family:"DejaVu Serif",Georgia,Cambria,"Times New Roman",Times,serif!important;font-style:italic}.infobox .btn{background-color:#2ecc71;border:none}.infobox .btn a{color:#fff;margin:5px}.infobox .infobox_part{margin-bottom:20px;word-wrap:break-word;table-layout:fixed}.infobox .infobox_part:last-child{margin-bottom:0}.search_categories,#categories{text-transform:capitalize;margin-bottom:.5rem;display:flex;flex-wrap:wrap;flex-flow:row wrap;align-content:stretch}.search_categories label,#categories label,.search_categories .input-group-addon,#categories .input-group-addon{flex-grow:1;flex-basis:auto;font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;border-right:none;color:#666;padding-bottom:.4rem;padding-top:.4rem;text-align:center;min-width:50px}.search_categories label:last-child,#categories label:last-child,.search_categories .input-group-addon:last-child,#categories .input-group-addon:last-child{border-right:#ddd 1px solid}.search_categories input[type=checkbox]:checked+label,#categories input[type=checkbox]:checked+label{color:#29314d;font-weight:700;border-bottom:#01d7d4 5px solid}#main-logo{margin-top:10vh;margin-bottom:25px}#main-logo>img{max-width:350px;width:80%}#q{box-shadow:none;border-right:none;border-color:#a4a4a4}#search_form .input-group-btn .btn{border-color:#a4a4a4}#search_form .input-group-btn .btn:hover{background-color:#2ecc71;color:#fff}.custom-select{appearance:none;-webkit-appearance:none;-moz-appearance:none;font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;color:#666;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAQAAACR313BAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAABFkAAARZAVnbJUkAAAAHdElNRQfgBxgLDwB20OFsAAAAbElEQVQY073OsQ3CMAAEwJMYwJGnsAehpoXJItltBkmcdZBYgIIiQoLglnz3ui+eP+bk5uneteTMZJa6OJuIqvYzSJoqwqBq8gdmTTW86/dghxAUq4xsVYT9laBYXCw93Aajh7GPEF23t4fkBYevGFTANkPRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA3LTI0VDExOjU1OjU4KzAyOjAwRFqFOQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wNy0yNFQxMToxNTowMCswMjowMP7RDgQAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC) 96% no-repeat}.search-margin{margin-bottom:.6em}#advanced-search-container{display:none;text-align:left;margin-bottom:1rem;clear:both}#advanced-search-container label,#advanced-search-container .input-group-addon{font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;border-right:none;color:#666;padding-bottom:.4rem;padding-right:.7rem;padding-left:.7rem}#advanced-search-container label:last-child,#advanced-search-container .input-group-addon:last-child{border-right:#ddd 1px solid}#advanced-search-container input[type=radio]{display:none}#advanced-search-container input[type=radio]:checked+label{color:#29314d;font-weight:700;border-bottom:#01d7d4 5px solid}#check-advanced{display:none}#check-advanced:checked~#advanced-search-container{display:block}.advanced{padding:0;margin-top:.3rem;text-align:right}.advanced label,.advanced select{cursor:pointer}.cursor-text{cursor:text!important}.cursor-pointer{cursor:pointer!important}pre,code{font-family:'Ubuntu Mono','Courier New','Lucida Console',monospace!important}.lineno{margin-right:5px}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#556366;font-style:italic}.highlight .err{border:1px solid #ffa92f}.highlight .k{color:#BE74D5;font-weight:700}.highlight .o{color:#d19a66}.highlight .cm{color:#556366;font-style:italic}.highlight .cp{color:#bc7a00}.highlight .c1{color:#556366;font-style:italic}.highlight .cs{color:#556366;font-style:italic}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04d}.highlight .kc{color:#BE74D5;font-weight:700}.highlight .kd{color:#BE74D5;font-weight:700}.highlight .kn{color:#BE74D5;font-weight:700}.highlight .kp{color:#be74d5}.highlight .kr{color:#BE74D5;font-weight:700}.highlight .kt{color:#d46c72}.highlight .m{color:#d19a66}.highlight .s{color:#86c372}.highlight .na{color:#7d9029}.highlight .nb{color:#be74d5}.highlight .nc{color:#61AFEF;font-weight:700}.highlight .no{color:#d19a66}.highlight .nd{color:#a2f}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#61afef}.highlight .nl{color:#a0a000}.highlight .nn{color:#61AFEF;font-weight:700}.highlight .nt{color:#BE74D5;font-weight:700}.highlight .nv{color:#dfc06f}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#d7dae0}.highlight .mf{color:#d19a66}.highlight .mh{color:#d19a66}.highlight .mi{color:#d19a66}.highlight .mo{color:#d19a66}.highlight .sb{color:#86c372}.highlight .sc{color:#86c372}.highlight .sd{color:#86C372;font-style:italic}.highlight .s2{color:#86c372}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#86c372}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:#be74d5}.highlight .sr{color:#b68}.highlight .s1{color:#86c372}.highlight .ss{color:#dfc06f}.highlight .bp{color:#be74d5}.highlight .vc{color:#dfc06f}.highlight .vg{color:#dfc06f}.highlight .vi{color:#dfc06f}.highlight .il{color:#d19a66}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;color:#556366}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0}.highlight pre{background-color:#282C34;color:#D7DAE0;border:none;margin-bottom:25px;font-size:15px;padding:20px 10px}.highlight{font-weight:700}.table>tbody>tr>td,.table>tbody>tr>th{vertical-align:middle!important} \ No newline at end of file
+.searx-navbar{background:#29314d;height:2.3rem;font-size:1.3rem;line-height:1.3rem;padding:.5rem;font-weight:700;margin-bottom:.8rem}.searx-navbar a,.searx-navbar a:hover{margin-right:2rem;color:#fff;text-decoration:none}.searx-navbar .instance a{color:#01d7d4;margin-left:2rem}#main-logo{margin-top:20vh;margin-bottom:25px}#main-logo>img{max-width:350px;width:80%}*{border-radius:0!important}html{position:relative;min-height:100%;color:#29314d}body{font-family:Roboto,Helvetica,Arial,sans-serif;margin-bottom:80px;background-color:#fff}body a{color:#08c}.footer{position:absolute;bottom:0;width:100%;height:60px;text-align:center;color:#999}input[type=checkbox]:checked+.label_hide_if_checked,input[type=checkbox]:checked+.label_hide_if_not_checked+.label_hide_if_checked{display:none}input[type=checkbox]:not(:checked)+.label_hide_if_not_checked,input[type=checkbox]:not(:checked)+.label_hide_if_checked+.label_hide_if_not_checked{display:none}.onoff-checkbox{width:15%}.onoffswitch{position:relative;width:110px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #FFF!important;border-radius:50px!important}.onoffswitch-inner{display:block;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;height:30px;padding:0;line-height:40px;font-size:20px;box-sizing:border-box;content:"";background-color:#EEE}.onoffswitch-switch{display:block;width:37px;background-color:#01d7d4;position:absolute;top:0;bottom:0;right:0;border:2px solid #FFF!important;border-radius:50px!important;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-right:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:71px;background-color:#A1A1A1}.result_header{margin-top:0;margin-bottom:2px;font-size:16px}.result_header .favicon{margin-bottom:-3px}.result_header a{color:#29314d;text-decoration:none}.result_header a:hover{color:#08c}.result_header a:visited{color:#684898}.result_header a .highlight{background-color:#f6f9fa}.result-content,.result-format,.result-source{margin-top:2px;margin-bottom:0;word-wrap:break-word;color:#666;font-size:13px}.result-content .highlight,.result-format .highlight,.result-source .highlight{font-weight:700}.result-source{font-size:10px;float:left}.result-format{font-size:10px;float:right}.external-link{color:#069025;font-size:12px;margin-bottom:15px}.external-link a{margin-right:3px}.result-default,.result-code,.result-torrent,.result-videos,.result-map{clear:both;padding:2px 4px}.result-default:hover,.result-code:hover,.result-torrent:hover,.result-videos:hover,.result-map:hover{background-color:#f6f9fa}.result-images{float:left!important;width:24%;margin:.5%}.result-images a{display:block;width:100%;background-size:cover}.img-thumbnail{margin:5px;max-height:128px;min-height:128px}.result-videos{clear:both}.result-videos hr{margin:5px 0 15px 0}.result-videos .collapse{width:100%}.result-videos .in{margin-bottom:8px}.result-torrent{clear:both}.result-torrent b{margin-right:5px;margin-left:5px}.result-torrent .seeders{color:#2ecc71}.result-torrent .leechers{color:#f35e77}.result-map{clear:both}.result-code{clear:both}.result-code .code-fork,.result-code .code-fork a{color:#666}.suggestion_item{margin:2px 5px;max-width:100%}.suggestion_item .btn{max-width:100%;white-space:normal;word-wrap:break-word;text-align:left}.result_download{margin-right:5px}#pagination{margin-top:30px;padding-bottom:60px}.label-default{color:#a4a4a4;background:0 0}.result .text-muted small{word-wrap:break-word}.modal-wrapper{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-wrapper{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0 none;position:relative}.infobox .panel-heading{background-color:#f6f9fa}.infobox .panel-heading .panel-title{font-weight:700}.infobox p{font-family:"DejaVu Serif",Georgia,Cambria,"Times New Roman",Times,serif!important;font-style:italic}.infobox .btn{background-color:#2ecc71;border:none}.infobox .btn a{color:#fff;margin:5px}.infobox .infobox_part{margin-bottom:20px;word-wrap:break-word;table-layout:fixed}.infobox .infobox_part:last-child{margin-bottom:0}.search_categories,#categories{text-transform:capitalize;margin-bottom:.5rem;display:flex;flex-wrap:wrap;flex-flow:row wrap;align-content:stretch}.search_categories label,#categories label,.search_categories .input-group-addon,#categories .input-group-addon{flex-grow:1;flex-basis:auto;font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;border-right:none;color:#666;padding-bottom:.4rem;padding-top:.4rem;text-align:center;min-width:50px}.search_categories label:last-child,#categories label:last-child,.search_categories .input-group-addon:last-child,#categories .input-group-addon:last-child{border-right:#ddd 1px solid}.search_categories input[type=checkbox]:checked+label,#categories input[type=checkbox]:checked+label{color:#29314d;font-weight:700;border-bottom:#01d7d4 5px solid}#main-logo{margin-top:10vh;margin-bottom:25px}#main-logo>img{max-width:350px;width:80%}#q{box-shadow:none;border-right:none;border-color:#a4a4a4}#search_form .input-group-btn .btn{border-color:#a4a4a4}#search_form .input-group-btn .btn:hover{background-color:#2ecc71;color:#fff}.custom-select{appearance:none;-webkit-appearance:none;-moz-appearance:none;font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;color:#666;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAQAAACR313BAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAABFkAAARZAVnbJUkAAAAHdElNRQfgBxgLDwB20OFsAAAAbElEQVQY073OsQ3CMAAEwJMYwJGnsAehpoXJItltBkmcdZBYgIIiQoLglnz3ui+eP+bk5uneteTMZJa6OJuIqvYzSJoqwqBq8gdmTTW86/dghxAUq4xsVYT9laBYXCw93Aajh7GPEF23t4fkBYevGFTANkPRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA3LTI0VDExOjU1OjU4KzAyOjAwRFqFOQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wNy0yNFQxMToxNTowMCswMjowMP7RDgQAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC) 96% no-repeat}.search-margin{margin-bottom:.6em}#advanced-search-container{display:none;text-align:left;margin-bottom:1rem;clear:both}#advanced-search-container label,#advanced-search-container .input-group-addon{font-size:1.2rem;font-weight:400;background-color:#fff;border:#ddd 1px solid;border-right:none;color:#666;padding-bottom:.4rem;padding-right:.7rem;padding-left:.7rem}#advanced-search-container label:last-child,#advanced-search-container .input-group-addon:last-child{border-right:#ddd 1px solid}#advanced-search-container input[type=radio]{display:none}#advanced-search-container input[type=radio]:checked+label{color:#29314d;font-weight:700;border-bottom:#01d7d4 5px solid}#check-advanced{display:none}#check-advanced:checked~#advanced-search-container{display:block}.advanced{padding:0;margin-top:.3rem;text-align:right}.advanced label,.advanced select{cursor:pointer}.cursor-text{cursor:text!important}.cursor-pointer{cursor:pointer!important}pre,code{font-family:'Ubuntu Mono','Courier New','Lucida Console',monospace!important}.lineno{margin-right:5px}.highlight .hll{background-color:#ffc}.highlight{background:#f8f8f8}.highlight .c{color:#556366;font-style:italic}.highlight .err{border:1px solid #ffa92f}.highlight .k{color:#BE74D5;font-weight:700}.highlight .o{color:#d19a66}.highlight .cm{color:#556366;font-style:italic}.highlight .cp{color:#bc7a00}.highlight .c1{color:#556366;font-style:italic}.highlight .cs{color:#556366;font-style:italic}.highlight .gd{color:#a00000}.highlight .ge{font-style:italic}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00a000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04d}.highlight .kc{color:#BE74D5;font-weight:700}.highlight .kd{color:#BE74D5;font-weight:700}.highlight .kn{color:#BE74D5;font-weight:700}.highlight .kp{color:#be74d5}.highlight .kr{color:#BE74D5;font-weight:700}.highlight .kt{color:#d46c72}.highlight .m{color:#d19a66}.highlight .s{color:#86c372}.highlight .na{color:#7d9029}.highlight .nb{color:#be74d5}.highlight .nc{color:#61AFEF;font-weight:700}.highlight .no{color:#d19a66}.highlight .nd{color:#a2f}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#61afef}.highlight .nl{color:#a0a000}.highlight .nn{color:#61AFEF;font-weight:700}.highlight .nt{color:#BE74D5;font-weight:700}.highlight .nv{color:#dfc06f}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#d7dae0}.highlight .mf{color:#d19a66}.highlight .mh{color:#d19a66}.highlight .mi{color:#d19a66}.highlight .mo{color:#d19a66}.highlight .sb{color:#86c372}.highlight .sc{color:#86c372}.highlight .sd{color:#86C372;font-style:italic}.highlight .s2{color:#86c372}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#86c372}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:#be74d5}.highlight .sr{color:#b68}.highlight .s1{color:#86c372}.highlight .ss{color:#dfc06f}.highlight .bp{color:#be74d5}.highlight .vc{color:#dfc06f}.highlight .vg{color:#dfc06f}.highlight .vi{color:#dfc06f}.highlight .il{color:#d19a66}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;color:#556366}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0}.highlight pre{background-color:#282C34;color:#D7DAE0;border:none;margin-bottom:25px;font-size:15px;padding:20px 10px}.highlight{font-weight:700}.table>tbody>tr>td,.table>tbody>tr>th{vertical-align:middle!important} \ No newline at end of file
diff --git a/searx/static/themes/oscar/css/pointhi.css b/searx/static/themes/oscar/css/pointhi.css
new file mode 100644
index 000000000..4e167687c
--- /dev/null
+++ b/searx/static/themes/oscar/css/pointhi.css
@@ -0,0 +1,562 @@
+html {
+ position: relative;
+ min-height: 100%;
+}
+body {
+ /* Margin bottom by footer height */
+ margin-bottom: 80px;
+}
+.footer {
+ position: absolute;
+ bottom: 0;
+ width: 100%;
+ /* Set the fixed height of the footer here */
+ height: 60px;
+}
+input[type=checkbox]:checked + .label_hide_if_checked,
+input[type=checkbox]:checked + .label_hide_if_not_checked + .label_hide_if_checked {
+ display: none;
+}
+input[type=checkbox]:not(:checked) + .label_hide_if_not_checked,
+input[type=checkbox]:not(:checked) + .label_hide_if_checked + .label_hide_if_not_checked {
+ display: none;
+}
+.onoff-checkbox {
+ width: 15%;
+}
+.onoffswitch {
+ position: relative;
+ width: 110px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+}
+.onoffswitch-checkbox {
+ display: none;
+}
+.onoffswitch-label {
+ display: block;
+ overflow: hidden;
+ cursor: pointer;
+ border: 2px solid #FFFFFF !important;
+ border-radius: 50px !important;
+}
+.onoffswitch-inner {
+ display: block;
+ transition: margin 0.3s ease-in 0s;
+}
+.onoffswitch-inner:before,
+.onoffswitch-inner:after {
+ display: block;
+ float: left;
+ width: 50%;
+ height: 30px;
+ padding: 0;
+ line-height: 40px;
+ font-size: 20px;
+ box-sizing: border-box;
+ content: "";
+ background-color: #EEEEEE;
+}
+.onoffswitch-switch {
+ display: block;
+ width: 37px;
+ background-color: #00CC00;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ right: 0px;
+ border: 2px solid #FFFFFF !important;
+ border-radius: 50px !important;
+ transition: all 0.3s ease-in 0s;
+}
+.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner {
+ margin-right: 0;
+}
+.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch {
+ right: 71px;
+ background-color: #A1A1A1;
+}
+.result_header {
+ margin-bottom: 5px;
+ margin-top: 20px;
+}
+.result_header .favicon {
+ margin-bottom: -3px;
+}
+.result_header a {
+ vertical-align: bottom;
+}
+.result_header a .highlight {
+ font-weight: bold;
+}
+.result-content {
+ margin-top: 5px;
+ word-wrap: break-word;
+}
+.result-content .highlight {
+ font-weight: bold;
+}
+.result-default {
+ clear: both;
+}
+.result-images {
+ float: left !important;
+ height: 138px;
+}
+.img-thumbnail {
+ margin: 5px;
+ max-height: 128px;
+}
+.result-videos {
+ clear: both;
+}
+.result-torrents {
+ clear: both;
+}
+.result-map {
+ clear: both;
+}
+.result-code {
+ clear: both;
+}
+.suggestion_item {
+ margin: 2px 5px;
+ max-width: 100%;
+}
+.suggestion_item .btn {
+ max-width: 100%;
+ white-space: normal;
+ word-wrap: break-word;
+ text-align: left;
+}
+.result_download {
+ margin-right: 5px;
+}
+#pagination {
+ margin-top: 30px;
+ padding-bottom: 50px;
+}
+.label-default {
+ color: #AAA;
+ background: #FFF;
+}
+.result .text-muted small {
+ word-wrap: break-word;
+}
+.modal-wrapper {
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+}
+.modal-wrapper {
+ background-clip: padding-box;
+ background-color: #fff;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 6px;
+ box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+ outline: 0 none;
+ position: relative;
+}
+.infobox .infobox_part {
+ margin-bottom: 20px;
+ word-wrap: break-word;
+ table-layout: fixed;
+}
+.infobox .infobox_part:last-child {
+ margin-bottom: 0;
+}
+.search_categories,
+#categories {
+ text-transform: capitalize;
+ margin-bottom: 1.5rem;
+ margin-top: 1.5rem;
+ display: flex;
+ flex-wrap: wrap;
+ align-content: stretch;
+}
+.search_categories label,
+#categories label,
+.search_categories .input-group-addon,
+#categories .input-group-addon {
+ flex-grow: 1;
+ flex-basis: auto;
+ font-size: 1.3rem;
+ font-weight: normal;
+ background-color: white;
+ border: #DDD 1px solid;
+ border-right: none;
+ color: #333;
+ padding-bottom: 0.8rem;
+ padding-top: 0.8rem;
+ text-align: center;
+ min-width: 50px;
+}
+.search_categories label:last-child,
+#categories label:last-child,
+.search_categories .input-group-addon:last-child,
+#categories .input-group-addon:last-child {
+ border-right: #DDD 1px solid;
+}
+.search_categories input[type="checkbox"]:checked + label,
+#categories input[type="checkbox"]:checked + label {
+ color: black;
+ font-weight: bold;
+ background-color: #EEE;
+}
+#advanced-search-container {
+ display: none;
+ text-align: center;
+ margin-bottom: 1rem;
+ clear: both;
+}
+#advanced-search-container label,
+#advanced-search-container .input-group-addon {
+ font-size: 1.3rem;
+ font-weight: normal;
+ background-color: white;
+ border: #DDD 1px solid;
+ border-right: none;
+ color: #333;
+ padding-bottom: 0.8rem;
+ padding-left: 1.2rem;
+ padding-right: 1.2rem;
+}
+#advanced-search-container label:last-child,
+#advanced-search-container .input-group-addon:last-child {
+ border-right: #DDD 1px solid;
+}
+#advanced-search-container input[type="radio"] {
+ display: none;
+}
+#advanced-search-container input[type="radio"]:checked + label {
+ color: black;
+ font-weight: bold;
+ background-color: #EEE;
+}
+#check-advanced {
+ display: none;
+}
+#check-advanced:checked ~ #advanced-search-container {
+ display: block;
+}
+.advanced {
+ padding: 0;
+ margin-top: 0.3rem;
+ text-align: right;
+}
+.advanced label,
+.advanced select {
+ cursor: pointer;
+}
+.cursor-text {
+ cursor: text !important;
+}
+.cursor-pointer {
+ cursor: pointer !important;
+}
+.highlight .hll {
+ background-color: #ffffcc;
+}
+.highlight {
+ background: #f8f8f8;
+}
+.highlight .c {
+ color: #408080;
+ font-style: italic;
+}
+/* Comment */
+.highlight .err {
+ border: 1px solid #ff0000;
+}
+/* Error */
+.highlight .k {
+ color: #008000;
+ font-weight: bold;
+}
+/* Keyword */
+.highlight .o {
+ color: #666666;
+}
+/* Operator */
+.highlight .cm {
+ color: #408080;
+ font-style: italic;
+}
+/* Comment.Multiline */
+.highlight .cp {
+ color: #bc7a00;
+}
+/* Comment.Preproc */
+.highlight .c1 {
+ color: #408080;
+ font-style: italic;
+}
+/* Comment.Single */
+.highlight .cs {
+ color: #408080;
+ font-style: italic;
+}
+/* Comment.Special */
+.highlight .gd {
+ color: #a00000;
+}
+/* Generic.Deleted */
+.highlight .ge {
+ font-style: italic;
+}
+/* Generic.Emph */
+.highlight .gr {
+ color: #ff0000;
+}
+/* Generic.Error */
+.highlight .gh {
+ color: #000080;
+ font-weight: bold;
+}
+/* Generic.Heading */
+.highlight .gi {
+ color: #00a000;
+}
+/* Generic.Inserted */
+.highlight .go {
+ color: #888888;
+}
+/* Generic.Output */
+.highlight .gp {
+ color: #000080;
+ font-weight: bold;
+}
+/* Generic.Prompt */
+.highlight .gs {
+ font-weight: bold;
+}
+/* Generic.Strong */
+.highlight .gu {
+ color: #800080;
+ font-weight: bold;
+}
+/* Generic.Subheading */
+.highlight .gt {
+ color: #0044dd;
+}
+/* Generic.Traceback */
+.highlight .kc {
+ color: #008000;
+ font-weight: bold;
+}
+/* Keyword.Constant */
+.highlight .kd {
+ color: #008000;
+ font-weight: bold;
+}
+/* Keyword.Declaration */
+.highlight .kn {
+ color: #008000;
+ font-weight: bold;
+}
+/* Keyword.Namespace */
+.highlight .kp {
+ color: #008000;
+}
+/* Keyword.Pseudo */
+.highlight .kr {
+ color: #008000;
+ font-weight: bold;
+}
+/* Keyword.Reserved */
+.highlight .kt {
+ color: #b00040;
+}
+/* Keyword.Type */
+.highlight .m {
+ color: #666666;
+}
+/* Literal.Number */
+.highlight .s {
+ color: #ba2121;
+}
+/* Literal.String */
+.highlight .na {
+ color: #7d9029;
+}
+/* Name.Attribute */
+.highlight .nb {
+ color: #008000;
+}
+/* Name.Builtin */
+.highlight .nc {
+ color: #0000FF;
+ font-weight: bold;
+}
+/* Name.Class */
+.highlight .no {
+ color: #880000;
+}
+/* Name.Constant */
+.highlight .nd {
+ color: #aa22ff;
+}
+/* Name.Decorator */
+.highlight .ni {
+ color: #999999;
+ font-weight: bold;
+}
+/* Name.Entity */
+.highlight .ne {
+ color: #D2413A;
+ font-weight: bold;
+}
+/* Name.Exception */
+.highlight .nf {
+ color: #0000ff;
+}
+/* Name.Function */
+.highlight .nl {
+ color: #a0a000;
+}
+/* Name.Label */
+.highlight .nn {
+ color: #0000FF;
+ font-weight: bold;
+}
+/* Name.Namespace */
+.highlight .nt {
+ color: #008000;
+ font-weight: bold;
+}
+/* Name.Tag */
+.highlight .nv {
+ color: #19177c;
+}
+/* Name.Variable */
+.highlight .ow {
+ color: #AA22FF;
+ font-weight: bold;
+}
+/* Operator.Word */
+.highlight .w {
+ color: #bbbbbb;
+}
+/* Text.Whitespace */
+.highlight .mf {
+ color: #666666;
+}
+/* Literal.Number.Float */
+.highlight .mh {
+ color: #666666;
+}
+/* Literal.Number.Hex */
+.highlight .mi {
+ color: #666666;
+}
+/* Literal.Number.Integer */
+.highlight .mo {
+ color: #666666;
+}
+/* Literal.Number.Oct */
+.highlight .sb {
+ color: #ba2121;
+}
+/* Literal.String.Backtick */
+.highlight .sc {
+ color: #ba2121;
+}
+/* Literal.String.Char */
+.highlight .sd {
+ color: #BA2121;
+ font-style: italic;
+}
+/* Literal.String.Doc */
+.highlight .s2 {
+ color: #ba2121;
+}
+/* Literal.String.Double */
+.highlight .se {
+ color: #BB6622;
+ font-weight: bold;
+}
+/* Literal.String.Escape */
+.highlight .sh {
+ color: #ba2121;
+}
+/* Literal.String.Heredoc */
+.highlight .si {
+ color: #BB6688;
+ font-weight: bold;
+}
+/* Literal.String.Interpol */
+.highlight .sx {
+ color: #008000;
+}
+/* Literal.String.Other */
+.highlight .sr {
+ color: #bb6688;
+}
+/* Literal.String.Regex */
+.highlight .s1 {
+ color: #ba2121;
+}
+/* Literal.String.Single */
+.highlight .ss {
+ color: #19177c;
+}
+/* Literal.String.Symbol */
+.highlight .bp {
+ color: #008000;
+}
+/* Name.Builtin.Pseudo */
+.highlight .vc {
+ color: #19177c;
+}
+/* Name.Variable.Class */
+.highlight .vg {
+ color: #19177c;
+}
+/* Name.Variable.Global */
+.highlight .vi {
+ color: #19177c;
+}
+/* Name.Variable.Instance */
+.highlight .il {
+ color: #666666;
+}
+/* Literal.Number.Integer.Long */
+.highlight .lineno {
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ cursor: default;
+}
+.highlight .lineno::selection {
+ background: transparent;
+ /* WebKit/Blink Browsers */
+}
+.highlight .lineno::-moz-selection {
+ background: transparent;
+ /* Gecko Browsers */
+}
+.searx-navbar {
+ background: #eee;
+ color: #aaa;
+ height: 2.3rem;
+ font-size: 1.3rem;
+ line-height: 1.3rem;
+ padding: 0.5rem;
+ font-weight: bold;
+ margin-bottom: 1.3rem;
+}
+.searx-navbar a,
+.searx-navbar a:hover {
+ margin-right: 2.0rem;
+ text-decoration: none;
+}
+.searx-navbar .instance a {
+ color: #444;
+ margin-left: 2.0rem;
+}
+.table > tbody > tr > td,
+.table > tbody > tr > th {
+ vertical-align: middle !important;
+}
diff --git a/searx/static/themes/oscar/gruntfile.js b/searx/static/themes/oscar/gruntfile.js
index 591399449..def035dba 100644
--- a/searx/static/themes/oscar/gruntfile.js
+++ b/searx/static/themes/oscar/gruntfile.js
@@ -24,7 +24,7 @@ module.exports = function(grunt) {
jshint: {
files: ['gruntfile.js', 'js/searx_src/*.js'],
options: {
- reporterOutput: "",
+ reporterOutput: "",
// options here to override JSHint defaults
globals: {
jQuery: true,
@@ -55,7 +55,7 @@ module.exports = function(grunt) {
"css/logicodev-dark.min.css": "less/logicodev-dark/oscar.less"}
},
/*
- // built with ./manage.sh styles
+ // built with ./manage.sh styles
bootstrap: {
options: {
paths: ["less/bootstrap"],
@@ -90,7 +90,7 @@ module.exports = function(grunt) {
grunt.registerTask('test', ['jshint']);
grunt.registerTask('default', ['jshint', 'concat', 'uglify', 'less']);
-
+
grunt.registerTask('styles', ['less']);
};
diff --git a/searx/static/themes/oscar/img/icons/invidious.png b/searx/static/themes/oscar/img/icons/invidious.png
new file mode 100644
index 000000000..a94c969d8
--- /dev/null
+++ b/searx/static/themes/oscar/img/icons/invidious.png
Binary files differ
diff --git a/searx/static/themes/oscar/js/searx.js b/searx/static/themes/oscar/js/searx.js
new file mode 100644
index 000000000..927aeb422
--- /dev/null
+++ b/searx/static/themes/oscar/js/searx.js
@@ -0,0 +1,356 @@
+/**
+ * searx is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * searx is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with searx. If not, see < http://www.gnu.org/licenses/ >.
+ *
+ * (C) 2014 by Thomas Pointhuber, <thomas.pointhuber@gmx.at>
+ */
+
+requirejs.config({
+ baseUrl: './static/themes/oscar/js',
+ paths: {
+ app: '../app'
+ }
+});
+;/**
+ * searx is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * searx is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with searx. If not, see < http://www.gnu.org/licenses/ >.
+ *
+ * (C) 2019 by Alexandre Flament
+ */
+window.searx = (function(d) {
+ 'use strict';
+
+ // add data- properties
+ var script = d.currentScript || (function() {
+ var scripts = d.getElementsByTagName('script');
+ return scripts[scripts.length - 1];
+ })();
+
+ return {
+ autocompleter: script.getAttribute('data-autocompleter') === 'true',
+ method: script.getAttribute('data-method')
+ };
+})(document);
+;/**
+ * searx is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * searx is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with searx. If not, see < http://www.gnu.org/licenses/ >.
+ *
+ * (C) 2014 by Thomas Pointhuber, <thomas.pointhuber@gmx.at>
+ */
+
+if(searx.autocompleter) {
+ searx.searchResults = new Bloodhound({
+ datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
+ queryTokenizer: Bloodhound.tokenizers.whitespace,
+ remote: './autocompleter?q=%QUERY'
+ });
+ searx.searchResults.initialize();
+}
+
+$(document).ready(function(){
+ if(searx.autocompleter) {
+ $('#q').typeahead(null, {
+ name: 'search-results',
+ displayKey: function(result) {
+ return result;
+ },
+ source: searx.searchResults.ttAdapter()
+ });
+ }
+});
+;/**
+ * searx is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * searx is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with searx. If not, see < http://www.gnu.org/licenses/ >.
+ *
+ * (C) 2014 by Thomas Pointhuber, <thomas.pointhuber@gmx.at>
+ */
+
+$(document).ready(function(){
+ /**
+ * focus element if class="autofocus" and id="q"
+ */
+ $('#q.autofocus').focus();
+
+ /**
+ * select full content on click if class="select-all-on-click"
+ */
+ $(".select-all-on-click").click(function () {
+ $(this).select();
+ });
+
+ /**
+ * change text during btn-collapse click if possible
+ */
+ $('.btn-collapse').click(function() {
+ var btnTextCollapsed = $(this).data('btn-text-collapsed');
+ var btnTextNotCollapsed = $(this).data('btn-text-not-collapsed');
+
+ if(btnTextCollapsed !== '' && btnTextNotCollapsed !== '') {
+ if($(this).hasClass('collapsed')) {
+ new_html = $(this).html().replace(btnTextCollapsed, btnTextNotCollapsed);
+ } else {
+ new_html = $(this).html().replace(btnTextNotCollapsed, btnTextCollapsed);
+ }
+ $(this).html(new_html);
+ }
+ });
+
+ /**
+ * change text during btn-toggle click if possible
+ */
+ $('.btn-toggle .btn').click(function() {
+ var btnClass = 'btn-' + $(this).data('btn-class');
+ var btnLabelDefault = $(this).data('btn-label-default');
+ var btnLabelToggled = $(this).data('btn-label-toggled');
+ if(btnLabelToggled !== '') {
+ if($(this).hasClass('btn-default')) {
+ new_html = $(this).html().replace(btnLabelDefault, btnLabelToggled);
+ } else {
+ new_html = $(this).html().replace(btnLabelToggled, btnLabelDefault);
+ }
+ $(this).html(new_html);
+ }
+ $(this).toggleClass(btnClass);
+ $(this).toggleClass('btn-default');
+ });
+
+ /**
+ * change text during btn-toggle click if possible
+ */
+ $('.media-loader').click(function() {
+ var target = $(this).data('target');
+ var iframe_load = $(target + ' > iframe');
+ var srctest = iframe_load.attr('src');
+ if(srctest === undefined || srctest === false){
+ iframe_load.attr('src', iframe_load.data('src'));
+ }
+ });
+
+ /**
+ * Select or deselect every categories on double clic
+ */
+ $(".btn-sm").dblclick(function() {
+ var btnClass = 'btn-' + $(this).data('btn-class'); // primary
+ if($(this).hasClass('btn-default')) {
+ $(".btn-sm > input").attr('checked', 'checked');
+ $(".btn-sm > input").prop("checked", true);
+ $(".btn-sm").addClass(btnClass);
+ $(".btn-sm").addClass('active');
+ $(".btn-sm").removeClass('btn-default');
+ } else {
+ $(".btn-sm > input").attr('checked', '');
+ $(".btn-sm > input").removeAttr('checked');
+ $(".btn-sm > input").checked = false;
+ $(".btn-sm").removeClass(btnClass);
+ $(".btn-sm").removeClass('active');
+ $(".btn-sm").addClass('btn-default');
+ }
+ });
+});
+;/**
+ * searx is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * searx is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with searx. If not, see < http://www.gnu.org/licenses/ >.
+ *
+ * (C) 2014 by Thomas Pointhuber, <thomas.pointhuber@gmx.at>
+ */
+
+$(document).ready(function(){
+ $(".searx_overpass_request").on( "click", function( event ) {
+ var overpass_url = "https://overpass-api.de/api/interpreter?data=";
+ var query_start = overpass_url + "[out:json][timeout:25];(";
+ var query_end = ");out meta;";
+
+ var osm_id = $(this).data('osm-id');
+ var osm_type = $(this).data('osm-type');
+ var result_table = $(this).data('result-table');
+ var result_table_loadicon = "#" + $(this).data('result-table-loadicon');
+
+ // tags which can be ignored
+ var osm_ignore_tags = [ "addr:city", "addr:country", "addr:housenumber", "addr:postcode", "addr:street" ];
+
+ if(osm_id && osm_type && result_table) {
+ result_table = "#" + result_table;
+ var query = null;
+ switch(osm_type) {
+ case 'node':
+ query = query_start + "node(" + osm_id + ");" + query_end;
+ break;
+ case 'way':
+ query = query_start + "way(" + osm_id + ");" + query_end;
+ break;
+ case 'relation':
+ query = query_start + "relation(" + osm_id + ");" + query_end;
+ break;
+ default:
+ break;
+ }
+ if(query) {
+ //alert(query);
+ var ajaxRequest = $.ajax( query )
+ .done(function( html) {
+ if(html && html.elements && html.elements[0]) {
+ var element = html.elements[0];
+ var newHtml = $(result_table).html();
+ for (var row in element.tags) {
+ if(element.tags.name === null || osm_ignore_tags.indexOf(row) == -1) {
+ newHtml += "<tr><td>" + row + "</td><td>";
+ switch(row) {
+ case "phone":
+ case "fax":
+ newHtml += "<a href=\"tel:" + element.tags[row].replace(/ /g,'') + "\">" + element.tags[row] + "</a>";
+ break;
+ case "email":
+ newHtml += "<a href=\"mailto:" + element.tags[row] + "\">" + element.tags[row] + "</a>";
+ break;
+ case "website":
+ case "url":
+ newHtml += "<a href=\"" + element.tags[row] + "\">" + element.tags[row] + "</a>";
+ break;
+ case "wikidata":
+ newHtml += "<a href=\"https://www.wikidata.org/wiki/" + element.tags[row] + "\">" + element.tags[row] + "</a>";
+ break;
+ case "wikipedia":
+ if(element.tags[row].indexOf(":") != -1) {
+ newHtml += "<a href=\"https://" + element.tags[row].substring(0,element.tags[row].indexOf(":")) + ".wikipedia.org/wiki/" + element.tags[row].substring(element.tags[row].indexOf(":")+1) + "\">" + element.tags[row] + "</a>";
+ break;
+ }
+ /* jshint ignore:start */
+ default:
+ /* jshint ignore:end */
+ newHtml += element.tags[row];
+ break;
+ }
+ newHtml += "</td></tr>";
+ }
+ }
+ $(result_table).html(newHtml);
+ $(result_table).removeClass('hidden');
+ $(result_table_loadicon).addClass('hidden');
+ }
+ })
+ .fail(function() {
+ $(result_table_loadicon).html($(result_table_loadicon).html() + "<p class=\"text-muted\">could not load data!</p>");
+ });
+ }
+ }
+
+ // this event occour only once per element
+ $( this ).off( event );
+ });
+
+ $(".searx_init_map").on( "click", function( event ) {
+ var leaflet_target = $(this).data('leaflet-target');
+ var map_lon = $(this).data('map-lon');
+ var map_lat = $(this).data('map-lat');
+ var map_zoom = $(this).data('map-zoom');
+ var map_boundingbox = $(this).data('map-boundingbox');
+ var map_geojson = $(this).data('map-geojson');
+
+ require(['leaflet-0.7.3.min'], function(leaflet) {
+ if(map_boundingbox) {
+ southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]);
+ northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]);
+ map_bounds = L.latLngBounds(southWest, northEast);
+ }
+
+ // TODO hack
+ // change default imagePath
+ L.Icon.Default.imagePath = "./static/themes/oscar/img/map";
+
+ // init map
+ var map = L.map(leaflet_target);
+
+ // create the tile layer with correct attribution
+ var osmMapnikUrl='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
+ var osmMapnikAttrib='Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';
+ var osmMapnik = new L.TileLayer(osmMapnikUrl, {minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib});
+
+ var osmWikimediaUrl='https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png';
+ var osmWikimediaAttrib = 'Wikimedia maps beta | Maps data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';
+ var osmWikimedia = new L.TileLayer(osmWikimediaUrl, {minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib});
+
+ // init map view
+ if(map_bounds) {
+ // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021
+ setTimeout(function () {
+ map.fitBounds(map_bounds, {
+ maxZoom:17
+ });
+ }, 0);
+ } else if (map_lon && map_lat) {
+ if(map_zoom)
+ map.setView(new L.LatLng(map_lat, map_lon),map_zoom);
+ else
+ map.setView(new L.LatLng(map_lat, map_lon),8);
+ }
+
+ map.addLayer(osmMapnik);
+
+ var baseLayers = {
+ "OSM Mapnik": osmMapnik/*,
+ "OSM Wikimedia": osmWikimedia*/
+ };
+
+ L.control.layers(baseLayers).addTo(map);
+
+
+ if(map_geojson)
+ L.geoJson(map_geojson).addTo(map);
+ /*else if(map_bounds)
+ L.rectangle(map_bounds, {color: "#ff7800", weight: 3, fill:false}).addTo(map);*/
+ });
+
+ // this event occour only once per element
+ $( this ).off( event );
+ });
+});
diff --git a/searx/static/themes/oscar/js/searx.min.js b/searx/static/themes/oscar/js/searx.min.js
index d714149f6..354d9f2fe 100644
--- a/searx/static/themes/oscar/js/searx.min.js
+++ b/searx/static/themes/oscar/js/searx.min.js
@@ -1,2 +1,2 @@
-/*! oscar/searx.min.js | 06-10-2017 | https://github.com/asciimoo/searx */
-requirejs.config({baseUrl:"./static/themes/oscar/js",paths:{app:"../app"}}),searx.autocompleter&&(searx.searchResults=new Bloodhound({datumTokenizer:Bloodhound.tokenizers.obj.whitespace("value"),queryTokenizer:Bloodhound.tokenizers.whitespace,remote:"./autocompleter?q=%QUERY"}),searx.searchResults.initialize()),$(document).ready(function(){searx.autocompleter&&$("#q").typeahead(null,{name:"search-results",displayKey:function(a){return a},source:searx.searchResults.ttAdapter()})}),$(document).ready(function(){$("#q.autofocus").focus(),$(".select-all-on-click").click(function(){$(this).select()}),$(".btn-collapse").click(function(){var a=$(this).data("btn-text-collapsed"),b=$(this).data("btn-text-not-collapsed");""!==a&&""!==b&&($(this).hasClass("collapsed")?new_html=$(this).html().replace(a,b):new_html=$(this).html().replace(b,a),$(this).html(new_html))}),$(".btn-toggle .btn").click(function(){var a="btn-"+$(this).data("btn-class"),b=$(this).data("btn-label-default"),c=$(this).data("btn-label-toggled");""!==c&&($(this).hasClass("btn-default")?new_html=$(this).html().replace(b,c):new_html=$(this).html().replace(c,b),$(this).html(new_html)),$(this).toggleClass(a),$(this).toggleClass("btn-default")}),$(".media-loader").click(function(){var a=$(this).data("target"),b=$(a+" > iframe"),c=b.attr("src");void 0!==c&&c!==!1||b.attr("src",b.data("src"))}),$(".btn-sm").dblclick(function(){var a="btn-"+$(this).data("btn-class");$(this).hasClass("btn-default")?($(".btn-sm > input").attr("checked","checked"),$(".btn-sm > input").prop("checked",!0),$(".btn-sm").addClass(a),$(".btn-sm").addClass("active"),$(".btn-sm").removeClass("btn-default")):($(".btn-sm > input").attr("checked",""),$(".btn-sm > input").removeAttr("checked"),$(".btn-sm > input").checked=!1,$(".btn-sm").removeClass(a),$(".btn-sm").removeClass("active"),$(".btn-sm").addClass("btn-default"))})}),$(document).ready(function(){$(".searx_overpass_request").on("click",function(a){var b="https://overpass-api.de/api/interpreter?data=",c=b+"[out:json][timeout:25];(",d=");out meta;",e=$(this).data("osm-id"),f=$(this).data("osm-type"),g=$(this).data("result-table"),h="#"+$(this).data("result-table-loadicon"),i=["addr:city","addr:country","addr:housenumber","addr:postcode","addr:street"];if(e&&f&&g){g="#"+g;var j=null;switch(f){case"node":j=c+"node("+e+");"+d;break;case"way":j=c+"way("+e+");"+d;break;case"relation":j=c+"relation("+e+");"+d}if(j){$.ajax(j).done(function(a){if(a&&a.elements&&a.elements[0]){var b=a.elements[0],c=$(g).html();for(var d in b.tags)if(null===b.tags.name||i.indexOf(d)==-1){switch(c+="<tr><td>"+d+"</td><td>",d){case"phone":case"fax":c+='<a href="tel:'+b.tags[d].replace(/ /g,"")+'">'+b.tags[d]+"</a>";break;case"email":c+='<a href="mailto:'+b.tags[d]+'">'+b.tags[d]+"</a>";break;case"website":case"url":c+='<a href="'+b.tags[d]+'">'+b.tags[d]+"</a>";break;case"wikidata":c+='<a href="https://www.wikidata.org/wiki/'+b.tags[d]+'">'+b.tags[d]+"</a>";break;case"wikipedia":if(b.tags[d].indexOf(":")!=-1){c+='<a href="https://'+b.tags[d].substring(0,b.tags[d].indexOf(":"))+".wikipedia.org/wiki/"+b.tags[d].substring(b.tags[d].indexOf(":")+1)+'">'+b.tags[d]+"</a>";break}default:c+=b.tags[d]}c+="</td></tr>"}$(g).html(c),$(g).removeClass("hidden"),$(h).addClass("hidden")}}).fail(function(){$(h).html($(h).html()+'<p class="text-muted">could not load data!</p>')})}}$(this).off(a)}),$(".searx_init_map").on("click",function(a){var b=$(this).data("leaflet-target"),c=$(this).data("map-lon"),d=$(this).data("map-lat"),e=$(this).data("map-zoom"),f=$(this).data("map-boundingbox"),g=$(this).data("map-geojson");require(["leaflet-0.7.3.min"],function(a){f&&(southWest=L.latLng(f[0],f[2]),northEast=L.latLng(f[1],f[3]),map_bounds=L.latLngBounds(southWest,northEast)),L.Icon.Default.imagePath="./static/themes/oscar/img/map";var h=L.map(b),i="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",j='Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors',k=new L.TileLayer(i,{minZoom:1,maxZoom:19,attribution:j}),l="https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png",m='Wikimedia maps beta | Maps data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';new L.TileLayer(l,{minZoom:1,maxZoom:19,attribution:m});map_bounds?setTimeout(function(){h.fitBounds(map_bounds,{maxZoom:17})},0):c&&d&&(e?h.setView(new L.LatLng(d,c),e):h.setView(new L.LatLng(d,c),8)),h.addLayer(k);var n={"OSM Mapnik":k};L.control.layers(n).addTo(h),g&&L.geoJson(g).addTo(h)}),$(this).off(a)})}); \ No newline at end of file
+/*! oscar/searx.min.js | 06-08-2019 | https://github.com/asciimoo/searx */
+requirejs.config({baseUrl:"./static/themes/oscar/js",paths:{app:"../app"}}),window.searx=function(a){"use strict";var b=a.currentScript||function(){var b=a.getElementsByTagName("script");return b[b.length-1]}();return{autocompleter:"true"===b.getAttribute("data-autocompleter"),method:b.getAttribute("data-method")}}(document),searx.autocompleter&&(searx.searchResults=new Bloodhound({datumTokenizer:Bloodhound.tokenizers.obj.whitespace("value"),queryTokenizer:Bloodhound.tokenizers.whitespace,remote:"./autocompleter?q=%QUERY"}),searx.searchResults.initialize()),$(document).ready(function(){searx.autocompleter&&$("#q").typeahead(null,{name:"search-results",displayKey:function(a){return a},source:searx.searchResults.ttAdapter()})}),$(document).ready(function(){$("#q.autofocus").focus(),$(".select-all-on-click").click(function(){$(this).select()}),$(".btn-collapse").click(function(){var a=$(this).data("btn-text-collapsed"),b=$(this).data("btn-text-not-collapsed");""!==a&&""!==b&&($(this).hasClass("collapsed")?new_html=$(this).html().replace(a,b):new_html=$(this).html().replace(b,a),$(this).html(new_html))}),$(".btn-toggle .btn").click(function(){var a="btn-"+$(this).data("btn-class"),b=$(this).data("btn-label-default"),c=$(this).data("btn-label-toggled");""!==c&&($(this).hasClass("btn-default")?new_html=$(this).html().replace(b,c):new_html=$(this).html().replace(c,b),$(this).html(new_html)),$(this).toggleClass(a),$(this).toggleClass("btn-default")}),$(".media-loader").click(function(){var a=$(this).data("target"),b=$(a+" > iframe"),c=b.attr("src");void 0!==c&&!1!==c||b.attr("src",b.data("src"))}),$(".btn-sm").dblclick(function(){var a="btn-"+$(this).data("btn-class");$(this).hasClass("btn-default")?($(".btn-sm > input").attr("checked","checked"),$(".btn-sm > input").prop("checked",!0),$(".btn-sm").addClass(a),$(".btn-sm").addClass("active"),$(".btn-sm").removeClass("btn-default")):($(".btn-sm > input").attr("checked",""),$(".btn-sm > input").removeAttr("checked"),$(".btn-sm > input").checked=!1,$(".btn-sm").removeClass(a),$(".btn-sm").removeClass("active"),$(".btn-sm").addClass("btn-default"))})}),$(document).ready(function(){$(".searx_overpass_request").on("click",function(a){var b="https://overpass-api.de/api/interpreter?data=",c=b+"[out:json][timeout:25];(",d=");out meta;",e=$(this).data("osm-id"),f=$(this).data("osm-type"),g=$(this).data("result-table"),h="#"+$(this).data("result-table-loadicon"),i=["addr:city","addr:country","addr:housenumber","addr:postcode","addr:street"];if(e&&f&&g){g="#"+g;var j=null;switch(f){case"node":j=c+"node("+e+");"+d;break;case"way":j=c+"way("+e+");"+d;break;case"relation":j=c+"relation("+e+");"+d}if(j){$.ajax(j).done(function(a){if(a&&a.elements&&a.elements[0]){var b=a.elements[0],c=$(g).html();for(var d in b.tags)if(null===b.tags.name||-1==i.indexOf(d)){switch(c+="<tr><td>"+d+"</td><td>",d){case"phone":case"fax":c+='<a href="tel:'+b.tags[d].replace(/ /g,"")+'">'+b.tags[d]+"</a>";break;case"email":c+='<a href="mailto:'+b.tags[d]+'">'+b.tags[d]+"</a>";break;case"website":case"url":c+='<a href="'+b.tags[d]+'">'+b.tags[d]+"</a>";break;case"wikidata":c+='<a href="https://www.wikidata.org/wiki/'+b.tags[d]+'">'+b.tags[d]+"</a>";break;case"wikipedia":if(-1!=b.tags[d].indexOf(":")){c+='<a href="https://'+b.tags[d].substring(0,b.tags[d].indexOf(":"))+".wikipedia.org/wiki/"+b.tags[d].substring(b.tags[d].indexOf(":")+1)+'">'+b.tags[d]+"</a>";break}default:c+=b.tags[d]}c+="</td></tr>"}$(g).html(c),$(g).removeClass("hidden"),$(h).addClass("hidden")}}).fail(function(){$(h).html($(h).html()+'<p class="text-muted">could not load data!</p>')})}}$(this).off(a)}),$(".searx_init_map").on("click",function(a){var b=$(this).data("leaflet-target"),c=$(this).data("map-lon"),d=$(this).data("map-lat"),e=$(this).data("map-zoom"),f=$(this).data("map-boundingbox"),g=$(this).data("map-geojson");require(["leaflet-0.7.3.min"],function(a){f&&(southWest=L.latLng(f[0],f[2]),northEast=L.latLng(f[1],f[3]),map_bounds=L.latLngBounds(southWest,northEast)),L.Icon.Default.imagePath="./static/themes/oscar/img/map";var h=L.map(b),i="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",j='Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors',k=new L.TileLayer(i,{minZoom:1,maxZoom:19,attribution:j}),l="https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png",m='Wikimedia maps beta | Maps data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';new L.TileLayer(l,{minZoom:1,maxZoom:19,attribution:m});map_bounds?setTimeout(function(){h.fitBounds(map_bounds,{maxZoom:17})},0):c&&d&&(e?h.setView(new L.LatLng(d,c),e):h.setView(new L.LatLng(d,c),8)),h.addLayer(k);var n={"OSM Mapnik":k};L.control.layers(n).addTo(h),g&&L.geoJson(g).addTo(h)}),$(this).off(a)})}); \ No newline at end of file
diff --git a/searx/static/themes/oscar/js/searx_src/00_requirejs_config.js b/searx/static/themes/oscar/js/searx_src/00_requirejs_config.js
index 1aa434902..e7c2abdac 100644
--- a/searx/static/themes/oscar/js/searx_src/00_requirejs_config.js
+++ b/searx/static/themes/oscar/js/searx_src/00_requirejs_config.js
@@ -1,23 +1,23 @@
-/**
- * searx is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * searx is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with searx. If not, see < http://www.gnu.org/licenses/ >.
- *
- * (C) 2014 by Thomas Pointhuber, <thomas.pointhuber@gmx.at>
- */
-
-requirejs.config({
- baseUrl: './static/themes/oscar/js',
- paths: {
- app: '../app'
- }
-});
+/**
+ * searx is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * searx is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with searx. If not, see < http://www.gnu.org/licenses/ >.
+ *
+ * (C) 2014 by Thomas Pointhuber, <thomas.pointhuber@gmx.at>
+ */
+
+requirejs.config({
+ baseUrl: './static/themes/oscar/js',
+ paths: {
+ app: '../app'
+ }
+});
diff --git a/searx/static/themes/oscar/js/searx_src/01_init.js b/searx/static/themes/oscar/js/searx_src/01_init.js
new file mode 100644
index 000000000..690365c7f
--- /dev/null
+++ b/searx/static/themes/oscar/js/searx_src/01_init.js
@@ -0,0 +1,30 @@
+/**
+ * searx is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * searx is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with searx. If not, see < http://www.gnu.org/licenses/ >.
+ *
+ * (C) 2019 by Alexandre Flament
+ */
+window.searx = (function(d) {
+ 'use strict';
+
+ // add data- properties
+ var script = d.currentScript || (function() {
+ var scripts = d.getElementsByTagName('script');
+ return scripts[scripts.length - 1];
+ })();
+
+ return {
+ autocompleter: script.getAttribute('data-autocompleter') === 'true',
+ method: script.getAttribute('data-method')
+ };
+})(document);
diff --git a/searx/static/themes/oscar/js/searx_src/autocompleter.js b/searx/static/themes/oscar/js/searx_src/autocompleter.js
index 70c66d2fc..0907f8e34 100644
--- a/searx/static/themes/oscar/js/searx_src/autocompleter.js
+++ b/searx/static/themes/oscar/js/searx_src/autocompleter.js
@@ -1,37 +1,37 @@
-/**
- * searx is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * searx is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with searx. If not, see < http://www.gnu.org/licenses/ >.
- *
- * (C) 2014 by Thomas Pointhuber, <thomas.pointhuber@gmx.at>
- */
-
-if(searx.autocompleter) {
- searx.searchResults = new Bloodhound({
- datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
- queryTokenizer: Bloodhound.tokenizers.whitespace,
- remote: './autocompleter?q=%QUERY'
- });
- searx.searchResults.initialize();
-}
-
-$(document).ready(function(){
- if(searx.autocompleter) {
- $('#q').typeahead(null, {
- name: 'search-results',
- displayKey: function(result) {
- return result;
- },
- source: searx.searchResults.ttAdapter()
- });
- }
-});
+/**
+ * searx is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * searx is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with searx. If not, see < http://www.gnu.org/licenses/ >.
+ *
+ * (C) 2014 by Thomas Pointhuber, <thomas.pointhuber@gmx.at>
+ */
+
+if(searx.autocompleter) {
+ searx.searchResults = new Bloodhound({
+ datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
+ queryTokenizer: Bloodhound.tokenizers.whitespace,
+ remote: './autocompleter?q=%QUERY'
+ });
+ searx.searchResults.initialize();
+}
+
+$(document).ready(function(){
+ if(searx.autocompleter) {
+ $('#q').typeahead(null, {
+ name: 'search-results',
+ displayKey: function(result) {
+ return result;
+ },
+ source: searx.searchResults.ttAdapter()
+ });
+ }
+});
diff --git a/searx/static/themes/oscar/js/searx_src/element_modifiers.js b/searx/static/themes/oscar/js/searx_src/element_modifiers.js
index 8e4280548..4264d4c0d 100644
--- a/searx/static/themes/oscar/js/searx_src/element_modifiers.js
+++ b/searx/static/themes/oscar/js/searx_src/element_modifiers.js
@@ -1,99 +1,99 @@
-/**
- * searx is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * searx is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with searx. If not, see < http://www.gnu.org/licenses/ >.
- *
- * (C) 2014 by Thomas Pointhuber, <thomas.pointhuber@gmx.at>
- */
-
-$(document).ready(function(){
- /**
- * focus element if class="autofocus" and id="q"
- */
- $('#q.autofocus').focus();
-
- /**
- * select full content on click if class="select-all-on-click"
- */
- $(".select-all-on-click").click(function () {
- $(this).select();
- });
-
- /**
- * change text during btn-collapse click if possible
- */
- $('.btn-collapse').click(function() {
- var btnTextCollapsed = $(this).data('btn-text-collapsed');
- var btnTextNotCollapsed = $(this).data('btn-text-not-collapsed');
-
- if(btnTextCollapsed !== '' && btnTextNotCollapsed !== '') {
- if($(this).hasClass('collapsed')) {
- new_html = $(this).html().replace(btnTextCollapsed, btnTextNotCollapsed);
- } else {
- new_html = $(this).html().replace(btnTextNotCollapsed, btnTextCollapsed);
- }
- $(this).html(new_html);
- }
- });
-
- /**
- * change text during btn-toggle click if possible
- */
- $('.btn-toggle .btn').click(function() {
- var btnClass = 'btn-' + $(this).data('btn-class');
- var btnLabelDefault = $(this).data('btn-label-default');
- var btnLabelToggled = $(this).data('btn-label-toggled');
- if(btnLabelToggled !== '') {
- if($(this).hasClass('btn-default')) {
- new_html = $(this).html().replace(btnLabelDefault, btnLabelToggled);
- } else {
- new_html = $(this).html().replace(btnLabelToggled, btnLabelDefault);
- }
- $(this).html(new_html);
- }
- $(this).toggleClass(btnClass);
- $(this).toggleClass('btn-default');
- });
-
- /**
- * change text during btn-toggle click if possible
- */
- $('.media-loader').click(function() {
- var target = $(this).data('target');
- var iframe_load = $(target + ' > iframe');
- var srctest = iframe_load.attr('src');
- if(srctest === undefined || srctest === false){
- iframe_load.attr('src', iframe_load.data('src'));
- }
- });
-
- /**
- * Select or deselect every categories on double clic
- */
- $(".btn-sm").dblclick(function() {
- var btnClass = 'btn-' + $(this).data('btn-class'); // primary
- if($(this).hasClass('btn-default')) {
- $(".btn-sm > input").attr('checked', 'checked');
- $(".btn-sm > input").prop("checked", true);
- $(".btn-sm").addClass(btnClass);
- $(".btn-sm").addClass('active');
- $(".btn-sm").removeClass('btn-default');
- } else {
- $(".btn-sm > input").attr('checked', '');
- $(".btn-sm > input").removeAttr('checked');
- $(".btn-sm > input").checked = false;
- $(".btn-sm").removeClass(btnClass);
- $(".btn-sm").removeClass('active');
- $(".btn-sm").addClass('btn-default');
- }
- });
-});
+/**
+ * searx is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * searx is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with searx. If not, see < http://www.gnu.org/licenses/ >.
+ *
+ * (C) 2014 by Thomas Pointhuber, <thomas.pointhuber@gmx.at>
+ */
+
+$(document).ready(function(){
+ /**
+ * focus element if class="autofocus" and id="q"
+ */
+ $('#q.autofocus').focus();
+
+ /**
+ * select full content on click if class="select-all-on-click"
+ */
+ $(".select-all-on-click").click(function () {
+ $(this).select();
+ });
+
+ /**
+ * change text during btn-collapse click if possible
+ */
+ $('.btn-collapse').click(function() {
+ var btnTextCollapsed = $(this).data('btn-text-collapsed');
+ var btnTextNotCollapsed = $(this).data('btn-text-not-collapsed');
+
+ if(btnTextCollapsed !== '' && btnTextNotCollapsed !== '') {
+ if($(this).hasClass('collapsed')) {
+ new_html = $(this).html().replace(btnTextCollapsed, btnTextNotCollapsed);
+ } else {
+ new_html = $(this).html().replace(btnTextNotCollapsed, btnTextCollapsed);
+ }
+ $(this).html(new_html);
+ }
+ });
+
+ /**
+ * change text during btn-toggle click if possible
+ */
+ $('.btn-toggle .btn').click(function() {
+ var btnClass = 'btn-' + $(this).data('btn-class');
+ var btnLabelDefault = $(this).data('btn-label-default');
+ var btnLabelToggled = $(this).data('btn-label-toggled');
+ if(btnLabelToggled !== '') {
+ if($(this).hasClass('btn-default')) {
+ new_html = $(this).html().replace(btnLabelDefault, btnLabelToggled);
+ } else {
+ new_html = $(this).html().replace(btnLabelToggled, btnLabelDefault);
+ }
+ $(this).html(new_html);
+ }
+ $(this).toggleClass(btnClass);
+ $(this).toggleClass('btn-default');
+ });
+
+ /**
+ * change text during btn-toggle click if possible
+ */
+ $('.media-loader').click(function() {
+ var target = $(this).data('target');
+ var iframe_load = $(target + ' > iframe');
+ var srctest = iframe_load.attr('src');
+ if(srctest === undefined || srctest === false){
+ iframe_load.attr('src', iframe_load.data('src'));
+ }
+ });
+
+ /**
+ * Select or deselect every categories on double clic
+ */
+ $(".btn-sm").dblclick(function() {
+ var btnClass = 'btn-' + $(this).data('btn-class'); // primary
+ if($(this).hasClass('btn-default')) {
+ $(".btn-sm > input").attr('checked', 'checked');
+ $(".btn-sm > input").prop("checked", true);
+ $(".btn-sm").addClass(btnClass);
+ $(".btn-sm").addClass('active');
+ $(".btn-sm").removeClass('btn-default');
+ } else {
+ $(".btn-sm > input").attr('checked', '');
+ $(".btn-sm > input").removeAttr('checked');
+ $(".btn-sm > input").checked = false;
+ $(".btn-sm").removeClass(btnClass);
+ $(".btn-sm").removeClass('active');
+ $(".btn-sm").addClass('btn-default');
+ }
+ });
+});
diff --git a/searx/static/themes/oscar/js/searx_src/leaflet_map.js b/searx/static/themes/oscar/js/searx_src/leaflet_map.js
index 4be46acb5..3c8c616b1 100644
--- a/searx/static/themes/oscar/js/searx_src/leaflet_map.js
+++ b/searx/static/themes/oscar/js/searx_src/leaflet_map.js
@@ -1,167 +1,167 @@
-/**
- * searx is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * searx is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with searx. If not, see < http://www.gnu.org/licenses/ >.
- *
- * (C) 2014 by Thomas Pointhuber, <thomas.pointhuber@gmx.at>
- */
-
-$(document).ready(function(){
- $(".searx_overpass_request").on( "click", function( event ) {
- var overpass_url = "https://overpass-api.de/api/interpreter?data=";
- var query_start = overpass_url + "[out:json][timeout:25];(";
- var query_end = ");out meta;";
-
- var osm_id = $(this).data('osm-id');
- var osm_type = $(this).data('osm-type');
- var result_table = $(this).data('result-table');
- var result_table_loadicon = "#" + $(this).data('result-table-loadicon');
-
- // tags which can be ignored
- var osm_ignore_tags = [ "addr:city", "addr:country", "addr:housenumber", "addr:postcode", "addr:street" ];
-
- if(osm_id && osm_type && result_table) {
- result_table = "#" + result_table;
- var query = null;
- switch(osm_type) {
- case 'node':
- query = query_start + "node(" + osm_id + ");" + query_end;
- break;
- case 'way':
- query = query_start + "way(" + osm_id + ");" + query_end;
- break;
- case 'relation':
- query = query_start + "relation(" + osm_id + ");" + query_end;
- break;
- default:
- break;
- }
- if(query) {
- //alert(query);
- var ajaxRequest = $.ajax( query )
- .done(function( html) {
- if(html && html.elements && html.elements[0]) {
- var element = html.elements[0];
- var newHtml = $(result_table).html();
- for (var row in element.tags) {
- if(element.tags.name === null || osm_ignore_tags.indexOf(row) == -1) {
- newHtml += "<tr><td>" + row + "</td><td>";
- switch(row) {
- case "phone":
- case "fax":
- newHtml += "<a href=\"tel:" + element.tags[row].replace(/ /g,'') + "\">" + element.tags[row] + "</a>";
- break;
- case "email":
- newHtml += "<a href=\"mailto:" + element.tags[row] + "\">" + element.tags[row] + "</a>";
- break;
- case "website":
- case "url":
- newHtml += "<a href=\"" + element.tags[row] + "\">" + element.tags[row] + "</a>";
- break;
- case "wikidata":
- newHtml += "<a href=\"https://www.wikidata.org/wiki/" + element.tags[row] + "\">" + element.tags[row] + "</a>";
- break;
- case "wikipedia":
- if(element.tags[row].indexOf(":") != -1) {
- newHtml += "<a href=\"https://" + element.tags[row].substring(0,element.tags[row].indexOf(":")) + ".wikipedia.org/wiki/" + element.tags[row].substring(element.tags[row].indexOf(":")+1) + "\">" + element.tags[row] + "</a>";
- break;
- }
- /* jshint ignore:start */
- default:
- /* jshint ignore:end */
- newHtml += element.tags[row];
- break;
- }
- newHtml += "</td></tr>";
- }
- }
- $(result_table).html(newHtml);
- $(result_table).removeClass('hidden');
- $(result_table_loadicon).addClass('hidden');
- }
- })
- .fail(function() {
- $(result_table_loadicon).html($(result_table_loadicon).html() + "<p class=\"text-muted\">could not load data!</p>");
- });
- }
- }
-
- // this event occour only once per element
- $( this ).off( event );
- });
-
- $(".searx_init_map").on( "click", function( event ) {
- var leaflet_target = $(this).data('leaflet-target');
- var map_lon = $(this).data('map-lon');
- var map_lat = $(this).data('map-lat');
- var map_zoom = $(this).data('map-zoom');
- var map_boundingbox = $(this).data('map-boundingbox');
- var map_geojson = $(this).data('map-geojson');
-
- require(['leaflet-0.7.3.min'], function(leaflet) {
- if(map_boundingbox) {
- southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]);
- northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]);
- map_bounds = L.latLngBounds(southWest, northEast);
- }
-
- // TODO hack
- // change default imagePath
- L.Icon.Default.imagePath = "./static/themes/oscar/img/map";
-
- // init map
- var map = L.map(leaflet_target);
-
- // create the tile layer with correct attribution
- var osmMapnikUrl='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
- var osmMapnikAttrib='Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';
- var osmMapnik = new L.TileLayer(osmMapnikUrl, {minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib});
-
- var osmWikimediaUrl='https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png';
- var osmWikimediaAttrib = 'Wikimedia maps beta | Maps data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';
- var osmWikimedia = new L.TileLayer(osmWikimediaUrl, {minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib});
-
- // init map view
- if(map_bounds) {
- // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021
- setTimeout(function () {
- map.fitBounds(map_bounds, {
- maxZoom:17
- });
- }, 0);
- } else if (map_lon && map_lat) {
- if(map_zoom)
- map.setView(new L.LatLng(map_lat, map_lon),map_zoom);
- else
- map.setView(new L.LatLng(map_lat, map_lon),8);
- }
-
- map.addLayer(osmMapnik);
-
- var baseLayers = {
- "OSM Mapnik": osmMapnik/*,
- "OSM Wikimedia": osmWikimedia*/
- };
-
- L.control.layers(baseLayers).addTo(map);
-
-
- if(map_geojson)
- L.geoJson(map_geojson).addTo(map);
- /*else if(map_bounds)
- L.rectangle(map_bounds, {color: "#ff7800", weight: 3, fill:false}).addTo(map);*/
- });
-
- // this event occour only once per element
- $( this ).off( event );
- });
-});
+/**
+ * searx is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * searx is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with searx. If not, see < http://www.gnu.org/licenses/ >.
+ *
+ * (C) 2014 by Thomas Pointhuber, <thomas.pointhuber@gmx.at>
+ */
+
+$(document).ready(function(){
+ $(".searx_overpass_request").on( "click", function( event ) {
+ var overpass_url = "https://overpass-api.de/api/interpreter?data=";
+ var query_start = overpass_url + "[out:json][timeout:25];(";
+ var query_end = ");out meta;";
+
+ var osm_id = $(this).data('osm-id');
+ var osm_type = $(this).data('osm-type');
+ var result_table = $(this).data('result-table');
+ var result_table_loadicon = "#" + $(this).data('result-table-loadicon');
+
+ // tags which can be ignored
+ var osm_ignore_tags = [ "addr:city", "addr:country", "addr:housenumber", "addr:postcode", "addr:street" ];
+
+ if(osm_id && osm_type && result_table) {
+ result_table = "#" + result_table;
+ var query = null;
+ switch(osm_type) {
+ case 'node':
+ query = query_start + "node(" + osm_id + ");" + query_end;
+ break;
+ case 'way':
+ query = query_start + "way(" + osm_id + ");" + query_end;
+ break;
+ case 'relation':
+ query = query_start + "relation(" + osm_id + ");" + query_end;
+ break;
+ default:
+ break;
+ }
+ if(query) {
+ //alert(query);
+ var ajaxRequest = $.ajax( query )
+ .done(function( html) {
+ if(html && html.elements && html.elements[0]) {
+ var element = html.elements[0];
+ var newHtml = $(result_table).html();
+ for (var row in element.tags) {
+ if(element.tags.name === null || osm_ignore_tags.indexOf(row) == -1) {
+ newHtml += "<tr><td>" + row + "</td><td>";
+ switch(row) {
+ case "phone":
+ case "fax":
+ newHtml += "<a href=\"tel:" + element.tags[row].replace(/ /g,'') + "\">" + element.tags[row] + "</a>";
+ break;
+ case "email":
+ newHtml += "<a href=\"mailto:" + element.tags[row] + "\">" + element.tags[row] + "</a>";
+ break;
+ case "website":
+ case "url":
+ newHtml += "<a href=\"" + element.tags[row] + "\">" + element.tags[row] + "</a>";
+ break;
+ case "wikidata":
+ newHtml += "<a href=\"https://www.wikidata.org/wiki/" + element.tags[row] + "\">" + element.tags[row] + "</a>";
+ break;
+ case "wikipedia":
+ if(element.tags[row].indexOf(":") != -1) {
+ newHtml += "<a href=\"https://" + element.tags[row].substring(0,element.tags[row].indexOf(":")) + ".wikipedia.org/wiki/" + element.tags[row].substring(element.tags[row].indexOf(":")+1) + "\">" + element.tags[row] + "</a>";
+ break;
+ }
+ /* jshint ignore:start */
+ default:
+ /* jshint ignore:end */
+ newHtml += element.tags[row];
+ break;
+ }
+ newHtml += "</td></tr>";
+ }
+ }
+ $(result_table).html(newHtml);
+ $(result_table).removeClass('hidden');
+ $(result_table_loadicon).addClass('hidden');
+ }
+ })
+ .fail(function() {
+ $(result_table_loadicon).html($(result_table_loadicon).html() + "<p class=\"text-muted\">could not load data!</p>");
+ });
+ }
+ }
+
+ // this event occour only once per element
+ $( this ).off( event );
+ });
+
+ $(".searx_init_map").on( "click", function( event ) {
+ var leaflet_target = $(this).data('leaflet-target');
+ var map_lon = $(this).data('map-lon');
+ var map_lat = $(this).data('map-lat');
+ var map_zoom = $(this).data('map-zoom');
+ var map_boundingbox = $(this).data('map-boundingbox');
+ var map_geojson = $(this).data('map-geojson');
+
+ require(['leaflet-0.7.3.min'], function(leaflet) {
+ if(map_boundingbox) {
+ southWest = L.latLng(map_boundingbox[0], map_boundingbox[2]);
+ northEast = L.latLng(map_boundingbox[1], map_boundingbox[3]);
+ map_bounds = L.latLngBounds(southWest, northEast);
+ }
+
+ // TODO hack
+ // change default imagePath
+ L.Icon.Default.imagePath = "./static/themes/oscar/img/map";
+
+ // init map
+ var map = L.map(leaflet_target);
+
+ // create the tile layer with correct attribution
+ var osmMapnikUrl='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
+ var osmMapnikAttrib='Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';
+ var osmMapnik = new L.TileLayer(osmMapnikUrl, {minZoom: 1, maxZoom: 19, attribution: osmMapnikAttrib});
+
+ var osmWikimediaUrl='https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png';
+ var osmWikimediaAttrib = 'Wikimedia maps beta | Maps data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';
+ var osmWikimedia = new L.TileLayer(osmWikimediaUrl, {minZoom: 1, maxZoom: 19, attribution: osmWikimediaAttrib});
+
+ // init map view
+ if(map_bounds) {
+ // TODO hack: https://github.com/Leaflet/Leaflet/issues/2021
+ setTimeout(function () {
+ map.fitBounds(map_bounds, {
+ maxZoom:17
+ });
+ }, 0);
+ } else if (map_lon && map_lat) {
+ if(map_zoom)
+ map.setView(new L.LatLng(map_lat, map_lon),map_zoom);
+ else
+ map.setView(new L.LatLng(map_lat, map_lon),8);
+ }
+
+ map.addLayer(osmMapnik);
+
+ var baseLayers = {
+ "OSM Mapnik": osmMapnik/*,
+ "OSM Wikimedia": osmWikimedia*/
+ };
+
+ L.control.layers(baseLayers).addTo(map);
+
+
+ if(map_geojson)
+ L.geoJson(map_geojson).addTo(map);
+ /*else if(map_bounds)
+ L.rectangle(map_bounds, {color: "#ff7800", weight: 3, fill:false}).addTo(map);*/
+ });
+
+ // this event occour only once per element
+ $( this ).off( event );
+ });
+});
diff --git a/searx/static/themes/oscar/less/logicodev-dark/oscar.less b/searx/static/themes/oscar/less/logicodev-dark/oscar.less
index 804dd76a0..e788b8cba 100644
--- a/searx/static/themes/oscar/less/logicodev-dark/oscar.less
+++ b/searx/static/themes/oscar/less/logicodev-dark/oscar.less
@@ -59,7 +59,7 @@ ul.nav li a {
border-bottom: 4px solid #3d9f94 !important;
}
-.result-content {
+.result-content, .result-source, .result-format {
color:#B5B8B7 !important;
}
@@ -109,7 +109,7 @@ ul.nav li a {
.btn:hover {
color:#444 !important;
- background-color: #BBB !important;
+ background-color: #BBB !important;
}
.btn-primary.active {
@@ -221,7 +221,7 @@ p.btn.btn-default{
}
.table-hover > tbody > tr:hover > td, .table-hover > tbody > tr:hover > th {
- background: rgb(102, 105, 110) !important;
+ background: rgb(102, 105, 110) !important;
}
.btn-success {
diff --git a/searx/static/themes/oscar/less/logicodev/code.less b/searx/static/themes/oscar/less/logicodev/code.less
index 96486f5aa..491b30e5a 100644
--- a/searx/static/themes/oscar/less/logicodev/code.less
+++ b/searx/static/themes/oscar/less/logicodev/code.less
@@ -78,7 +78,7 @@ pre, code{
user-select: none;
cursor: default;
color: #556366;
-
+
&::selection {
background: transparent; /* WebKit/Blink Browsers */
}
@@ -99,5 +99,3 @@ pre, code{
.highlight {
font-weight: 700;
}
-
-
diff --git a/searx/static/themes/oscar/less/logicodev/infobox.less b/searx/static/themes/oscar/less/logicodev/infobox.less
index 0d488d744..954f4507a 100644
--- a/searx/static/themes/oscar/less/logicodev/infobox.less
+++ b/searx/static/themes/oscar/less/logicodev/infobox.less
@@ -30,7 +30,7 @@
table-layout: fixed;
}
-
+
.infobox_part:last-child {
margin-bottom: 0;
}
diff --git a/searx/static/themes/oscar/less/logicodev/navbar.less b/searx/static/themes/oscar/less/logicodev/navbar.less
index 5da7115d9..6e4f9ee10 100644
--- a/searx/static/themes/oscar/less/logicodev/navbar.less
+++ b/searx/static/themes/oscar/less/logicodev/navbar.less
@@ -28,4 +28,3 @@
width: 80%;
}
}
-
diff --git a/searx/static/themes/oscar/less/logicodev/results.less b/searx/static/themes/oscar/less/logicodev/results.less
index a64dc7d16..5e7e1336a 100644
--- a/searx/static/themes/oscar/less/logicodev/results.less
+++ b/searx/static/themes/oscar/less/logicodev/results.less
@@ -27,7 +27,7 @@
}
}
-.result-content {
+.result-content, .result-format, .result-source {
margin-top: 2px;
margin-bottom: 0;
word-wrap: break-word;
@@ -41,6 +41,16 @@
}
+.result-source {
+ font-size: 10px;
+ float: left;
+}
+
+.result-format {
+ font-size: 10px;
+ float: right;
+}
+
.external-link {
color: @dark-green;
font-size: 12px;
diff --git a/searx/static/themes/oscar/less/pointhi/code.less b/searx/static/themes/oscar/less/pointhi/code.less
index 90a2cd60c..70a2a5d49 100644
--- a/searx/static/themes/oscar/less/pointhi/code.less
+++ b/searx/static/themes/oscar/less/pointhi/code.less
@@ -69,7 +69,7 @@
-ms-user-select: none;
user-select: none;
cursor: default;
-
+
&::selection {
background: transparent; /* WebKit/Blink Browsers */
}
diff --git a/searx/static/themes/oscar/less/pointhi/infobox.less b/searx/static/themes/oscar/less/pointhi/infobox.less
index 41375f277..df51b002e 100644
--- a/searx/static/themes/oscar/less/pointhi/infobox.less
+++ b/searx/static/themes/oscar/less/pointhi/infobox.less
@@ -4,7 +4,7 @@
word-wrap: break-word;
table-layout: fixed;
}
-
+
.infobox_part:last-child {
margin-bottom: 0;
}
diff --git a/searx/static/themes/oscar/package.json b/searx/static/themes/oscar/package.json
index 7eae9df2b..5b10fcf9f 100644
--- a/searx/static/themes/oscar/package.json
+++ b/searx/static/themes/oscar/package.json
@@ -2,12 +2,11 @@
"devDependencies": {
"grunt": "~0.4.5",
"grunt-contrib-uglify": "~0.6.0",
- "grunt-contrib-watch" : "~0.6.1",
- "grunt-contrib-concat" : "~0.5.0",
- "grunt-contrib-jshint" : "~0.10.0",
- "grunt-contrib-less" : "~0.11.0"
+ "grunt-contrib-watch": "~0.6.1",
+ "grunt-contrib-concat": "~0.5.0",
+ "grunt-contrib-jshint": "~0.10.0",
+ "grunt-contrib-less": "~0.11.0"
},
-
"scripts": {
"build": "npm install && grunt",
"start": "grunt watch",
diff --git a/searx/static/themes/pix-art/css/style.css b/searx/static/themes/pix-art/css/style.css
index 229cf86a2..776291335 100644
--- a/searx/static/themes/pix-art/css/style.css
+++ b/searx/static/themes/pix-art/css/style.css
@@ -1 +1 @@
-html{font-family:"Courier New",Courier,monospace;font-size:.9em;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;color:#444;padding:0;margin:0}body,#container{padding:0;margin:0}canvas{image-rendering:optimizeSpeed;image-rendering:-moz-crisp-edges;image-rendering:-webkit-optimize-contrast;image-rendering:optimize-contrast;image-rendering:pixelated;-ms-interpolation-mode:nearest-neighbor;width:32px;height:32px}#container{width:100%;position:absolute;top:0}.search{padding:0;margin:0}#search_wrapper{position:relative;width:50em;padding:10px}.center #search_wrapper{margin-left:auto;margin-right:auto}.q{background:none repeat scroll 0 0 #fff;border:1px solid #3498db;color:#222;font-size:16px;font-family:"Courier New",Courier,monospace;height:28px;margin:0;outline:medium none;padding:2px;padding-left:8px;padding-right:0 !important;width:100%;z-index:2}#search_submit{position:absolute;top:15px;right:5px;padding:0;border:0;background:url('../img/search-icon-pixel.png') no-repeat;background-size:24px 24px;opacity:.8;width:24px;height:24px;font-size:0}@media screen and (max-width:50em){#search_wrapper{width:90%;clear:both;overflow:hidden}}.row{max-width:800px;margin:20px auto;text-align:justify}.row h1{font-size:3em;margin-top:50px}.row p{padding:0 10px;max-width:700px}.row h3,.row ul{margin:4px 8px}.hmarg{margin:0 20px;border:1px solid #3498db;padding:4px 10px}a:link.hmarg{color:#3498db}a:visited.hmarg{color:#3498db}a:active.hmarg{color:#3498db}a:hover.hmarg{color:#3498db}.top_margin{margin-top:60px}.center{text-align:center}h1{font-size:5em}div.title{background:url('../img/searx-pixel.png') no-repeat;width:100%;min-height:80px;background-position:center}div.title h1{visibility:hidden}input[type="button"],input[type="submit"]{font-family:"Courier New",Courier,monospace;padding:4px 12px;margin:2px 4px;display:inline-block;background:#3498db;color:#fff;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:0;cursor:pointer}input[type="button"]:disabled{cursor:progress}input[type="checkbox"]{visibility:hidden}fieldset{margin:8px;border:1px solid #3498db}#logo{position:absolute;top:13px;left:10px}#categories{margin:0 10px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.checkbox_container{display:inline-block;position:relative;margin:0 3px;padding:0}.checkbox_container input{display:none}.checkbox_container label,.engine_checkbox label{cursor:pointer;padding:4px 10px;margin:0;display:block;text-transform:capitalize;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.checkbox_container input[type="checkbox"]:checked+label{background:#3498db;color:#fff}.engine_checkbox{padding:4px}label.allow{background:#e74c3c;padding:4px 8px;color:#fff;display:none}label.deny{background:#2ecc71;padding:4px 8px;color:#444;display:inline}.engine_checkbox input[type="checkbox"]:checked+label:nth-child(2)+label{display:none}.engine_checkbox input[type="checkbox"]:checked+label.allow{display:inline}a{text-decoration:none;color:#1a11be}a:visited{color:#8e44ad}.engines{color:#888}.small_font{font-size:.8em}.small p{margin:2px 0}.right{float:right}.invisible{display:none}.left{float:left}.highlight{color:#094089}.content .highlight{color:#000}.percentage{position:relative;width:300px}.percentage div{background:#444}table{width:100%}td{padding:0 4px}tr:hover{background:#ddd}#results{margin:auto;padding:0;width:50em;margin-bottom:20px}#search_url{margin-top:8px}#search_url input{border:1px solid #888;padding:4px;color:#444;width:14em;display:block;margin:4px;font-size:.8em}#preferences{top:10px;padding:0;border:0;background:url('../img/preference-icon-pixel.png') no-repeat;background-size:28px 28px;opacity:.8;width:28px;height:30px;display:block}#preferences *{display:none}#pagination{clear:both;text-align:center}#pagination br{clear:both}#apis{margin-top:8px;clear:both}#categories_container{position:relative}@media screen and (max-width:50em){#results{margin:auto;padding:0;width:90%}.checkbox_container{display:block;width:90%}.checkbox_container label{border-bottom:0}.preferences_container{display:none;postion:fixed !important;top:100px;right:0}}@media screen and (max-width:75em){div.title h1{font-size:1em}html.touch #categories{width:95%;height:30px;text-align:left;overflow-x:scroll;overflow-y:hidden;-webkit-overflow-scrolling:touch}html.touch #categories #categories_container{width:1000px;width:-moz-max-content;width:-webkit-max-content;width:max-content}html.touch #categories #categories_container .checkbox_container{display:inline-block;width:auto}#categories{font-size:90%;clear:both}#categories .checkbox_container{margin-top:2px;margin:auto}#categories{font-size:90%;clear:both}#categories .checkbox_container{margin-top:2px;margin:auto}#apis{display:none}#search_url{display:none}#logo{display:none}}.favicon{float:left;margin-right:4px;margin-top:2px}.preferences_back{background:none repeat scroll 0 0 #3498db;border:0 none;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;cursor:pointer;display:inline-block;margin:2px 4px;padding:4px 6px}.preferences_back a{color:#fff}.hidden{opacity:0;overflow:hidden;font-size:.8em;position:absolute;bottom:-20px;width:100%;text-position:center;background:white;transition:opacity 1s ease}#categories_container:hover .hidden{transition:opacity 1s ease;opacity:.8} \ No newline at end of file
+#container,.search,body,html{padding:0;margin:0}.q,html{font-family:"Courier New",Courier,monospace}div.title h1,input[type=checkbox]{visibility:hidden}#container,#logo,#search_submit{position:absolute}#apis,#pagination,#pagination br{clear:both}#categories_container,#search_wrapper,.percentage{position:relative}html{font-size:.9em;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;color:#444}canvas{image-rendering:optimizeSpeed;image-rendering:-moz-crisp-edges;image-rendering:-webkit-optimize-contrast;image-rendering:optimize-contrast;image-rendering:pixelated;-ms-interpolation-mode:nearest-neighbor;width:32px;height:32px}#container{width:100%;top:0}#search_wrapper{width:50em;padding:10px}.center #search_wrapper{margin-left:auto;margin-right:auto}.q{background:#FFF;border:1px solid #3498DB;color:#222;font-size:16px;height:28px;margin:0;outline:0;padding:2px 2px 2px 8px;padding-right:0!important;width:100%;z-index:2}#search_submit{top:15px;right:5px;padding:0;border:0;background:url(../img/search-icon-pixel.png) no-repeat;background-size:24px 24px;opacity:.8;width:24px;height:24px;font-size:0}@media screen and (max-width:50em){#search_wrapper{width:90%;clear:both;overflow:hidden}}.row{max-width:800px;margin:20px auto;text-align:justify}#pagination,.center{text-align:center}.row h1{font-size:3em;margin-top:50px}.row p{padding:0 10px;max-width:700px}.row h3,.row ul{margin:4px 8px}.hmarg{margin:0 20px;border:1px solid #3498DB;padding:4px 10px}a:active.hmarg,a:hover.hmarg,a:link.hmarg,a:visited.hmarg{color:#3498DB}.top_margin{margin-top:60px}h1{font-size:5em}div.title{background:url(../img/searx-pixel.png) center no-repeat;width:100%;min-height:80px}input[type=button],input[type=submit]{font-family:"Courier New",Courier,monospace;padding:4px 12px;margin:2px 4px;display:inline-block;background:#3498DB;color:#FFF;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:0;cursor:pointer}input[type=button]:disabled{cursor:progress}fieldset{margin:8px;border:1px solid #3498DB}#logo{top:13px;left:10px}#categories{margin:0 10px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.checkbox_container{display:inline-block;position:relative;margin:0 3px;padding:0}.checkbox_container input{display:none}.checkbox_container label,.engine_checkbox label{cursor:pointer;padding:4px 10px;margin:0;display:block;text-transform:capitalize;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.checkbox_container input[type=checkbox]:checked+label{background:#3498DB;color:#FFF}.engine_checkbox{padding:4px}label.allow{background:#E74C3C;padding:4px 8px;color:#FFF;display:none}label.deny{background:#2ECC71;padding:4px 8px;color:#444;display:inline}.engine_checkbox input[type=checkbox]:checked+label:nth-child(2)+label{display:none}.engine_checkbox input[type=checkbox]:checked+label.allow{display:inline}#preferences *,.invisible{display:none}a{text-decoration:none;color:#1a11be}a:visited{color:#8E44AD}.engines{color:#888}.small_font{font-size:.8em}.small p{margin:2px 0}#apis,#search_url{margin-top:8px}.right{float:right}.favicon,.left{float:left}.highlight{color:#094089}.content .highlight{color:#000}.percentage{width:300px}.percentage div{background:#444}table{width:100%}td{padding:0 4px}tr:hover{background:#DDD}#results{margin:auto auto 20px;padding:0;width:50em}#search_url input{border:1px solid #888;padding:4px;color:#444;width:14em;display:block;margin:4px;font-size:.8em}#preferences{top:10px;padding:0;border:0;background:url(../img/preference-icon-pixel.png) no-repeat;background-size:28px 28px;opacity:.8;width:28px;height:30px;display:block}@media screen and (max-width:50em){#results{margin:auto;padding:0;width:90%}.checkbox_container{display:block;width:90%}.checkbox_container label{border-bottom:0}.preferences_container{display:none;postion:fixed!important;top:100px;right:0}}@media screen and (max-width:75em){div.title h1{font-size:1em}html.touch #categories{width:95%;height:30px;text-align:left;overflow-x:scroll;overflow-y:hidden;-webkit-overflow-scrolling:touch}html.touch #categories #categories_container{width:1000px;width:-moz-max-content;width:-webkit-max-content;width:max-content}html.touch #categories #categories_container .checkbox_container{display:inline-block;width:auto}#categories{font-size:90%;clear:both}#categories .checkbox_container{margin:auto}#apis,#logo,#search_url{display:none}}.favicon{margin-right:4px;margin-top:2px}.preferences_back{background:#3498DB;border:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;cursor:pointer;display:inline-block;margin:2px 4px;padding:4px 6px}.preferences_back a{color:#FFF}.hidden{opacity:0;overflow:hidden;font-size:.8em;position:absolute;bottom:-20px;width:100%;text-position:center;background:#fff;transition:opacity 1s ease}#categories_container:hover .hidden{transition:opacity 1s ease;opacity:.8} \ No newline at end of file
diff --git a/searx/static/themes/simple/css/searx-rtl.css b/searx/static/themes/simple/css/searx-rtl.css
index a4268d7f5..2e904e5eb 100644
--- a/searx/static/themes/simple/css/searx-rtl.css
+++ b/searx/static/themes/simple/css/searx-rtl.css
@@ -1,4 +1,4 @@
-/*! searx | 14-08-2018 | https://github.com/asciimoo/searx */
+/*! searx | 06-08-2019 | https://github.com/asciimoo/searx */
/*
* searx, A privacy-respecting, hackable metasearch engine
*
diff --git a/searx/static/themes/simple/css/searx-rtl.min.css b/searx/static/themes/simple/css/searx-rtl.min.css
index 5e532fe2c..fc54981b0 100644
--- a/searx/static/themes/simple/css/searx-rtl.min.css
+++ b/searx/static/themes/simple/css/searx-rtl.min.css
@@ -1 +1 @@
-/*! searx | 14-08-2018 | https://github.com/asciimoo/searx *//*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */button,hr,input{overflow:visible}[type=checkbox],[type=radio],legend{padding:0;box-sizing:border-box}.badge,.center{text-align:center}.badge,progress,sub,sup{vertical-align:baseline}.autocomplete>ul,.list-unstyled{list-style-type:none}.tabs>section,legend{box-sizing:border-box}#main_preferences h1 span,#main_stats h1 span,.index h1{visibility:hidden}#apis,#pagination,#pagination br,#sidebar .infobox .attributes,#sidebar .infobox .urls,#sidebar .infobox br,.result .break,footer{clear:both}html{line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}.highlight pre,textarea{overflow:auto}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{color:inherit;display:table;max-width:100%;white-space:normal}.badge,.search_box{white-space:nowrap}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.highlight .c,.highlight .cm,.highlight .ge,.highlight .sd{font-style:italic}.dialog-error:before,.dialog-modal:before,.dialog-warning:before,.ion-icon-big:before,.ion-icon:before{font-family:ion}details{display:block}summary{display:list-item}[hidden],html.js .show_if_nojs,html.no-js .hide_if_nojs,template{display:none}.highlight .hll{background-color:#ffc}.highlight .c{color:#408080}.highlight .err{border:1px solid red}.highlight .k{color:green;font-weight:700}.highlight .o{color:#666}.highlight .cm{color:#408080}.highlight .cp{color:#BC7A00}.highlight .c1,.highlight .cs{color:#408080;font-style:italic}.highlight .gd{color:#A00000}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00A000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04D}.highlight .kc,.highlight .kd,.highlight .kn{color:green;font-weight:700}.highlight .kp{color:green}.highlight .kr{color:green;font-weight:700}.highlight .kt{color:#B00040}.highlight .m{color:#666}.highlight .s{color:#BA2121}.highlight .na{color:#7D9029}.highlight .nb{color:green}.highlight .nc{color:#00F;font-weight:700}.highlight .no{color:#800}.highlight .nd{color:#A2F}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#00F}.highlight .nl{color:#A0A000}.highlight .nn{color:#00F;font-weight:700}.highlight .nt{color:green;font-weight:700}.highlight .nv{color:#19177C}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#bbb}.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:#666}.highlight .s2,.highlight .sb,.highlight .sc{color:#BA2121}.highlight .sd{color:#BA2121}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#BA2121}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:green}.highlight .sr{color:#B68}.highlight .s1{color:#BA2121}.highlight .ss{color:#19177C}.highlight .bp{color:green}.highlight .vc,.highlight .vg,.highlight .vi{color:#19177C}.highlight .il{color:#666}.badge,kbd{color:#fff}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.btn-collapse,.tabs>label,select:focus,select:hover{cursor:pointer}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0}.right{float:right}.left{float:left}.invisible{display:none!important}.list-unstyled li{margin-top:4px;margin-bottom:4px}.danger{background-color:#fae1e1}.badge{display:inline-block;background-color:#777;min-width:10px;padding:1px 5px;border-radius:5px}.dialog-error tr,.dialog-modal tr,.dialog-warning tr{vertical-align:text-top}kbd{padding:2px 4px;margin:1px;font-size:90%;background:#000}table{width:100%}table.striped tr{border-bottom:1px solid #ececec}th{padding:.4em}td{padding:0 4px}tr:hover{background:#ececec}div.selectable_url{border:1px solid #888;padding:4px;color:#444;width:100%;display:block;margin:.1em;overflow:hidden;height:1.2em;line-height:1.2em}div.selectable_url pre{display:block;font-size:.8em;word-break:break-all;margin:.1em;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:element;user-select:all}#categories,.tabs>label{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-touch-callout:none;-khtml-user-select:none}.dialog-error{position:relative;width:70%;padding:1em 1em 1em 2.7em;margin:0 8% 1em;border:1px solid #db3434;border-radius:4px;text-align:left;color:#db3434;background:#fae1e1}.dialog-error:before{position:absolute;top:.5em;left:.5em;font-size:1.5em;content:"\f110"}.dialog-error .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-error ol,.dialog-error p,.dialog-error ul{margin:1px 0 0}.dialog-error table{width:auto}.dialog-error tr:hover{background:0 0}.dialog-error td{padding:0 1em 0 0}.dialog-error h4{margin-top:.3em;margin-bottom:.3em}.dialog-warning{position:relative;width:70%;padding:1em 1em 1em 2.7em;margin:0 8% 1em;border:1px solid #dbba34;border-radius:4px;text-align:left;color:#dbba34;background:#faf5e1}.dialog-warning:before{position:absolute;top:.5em;left:.5em;font-size:1.5em;content:"\f10f"}.dialog-warning .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-warning ol,.dialog-warning p,.dialog-warning ul{margin:1px 0 0}.dialog-warning table{width:auto}.dialog-warning tr:hover{background:0 0}.dialog-warning td{padding:0 1em 0 0}.dialog-warning h4{margin-top:.3em;margin-bottom:.3em}.dialog-modal{width:70%;padding:1em 1em 1em 2.7em;border:1px solid #000;border-radius:4px;text-align:left;background:#fff;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:100000;margin:0 50% 0 0;box-shadow:0 0 1em}.dialog-modal:before{position:absolute;top:.5em;left:.5em;font-size:1.5em}.dialog-modal .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-modal ol,.dialog-modal p,.dialog-modal ul{margin:1px 0 0}.dialog-modal table{width:auto}.dialog-modal tr:hover{background:0 0}.dialog-modal td{padding:0 1em 0 0}.dialog-modal h4{margin-top:.3em;margin-bottom:.3em}.scrollx{overflow-x:auto;overflow-y:hidden;display:block;padding:0;margin:0;border:none}.tabs .tabs>label{font-size:90%}.tabs{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-wrap:wrap;width:100%;min-width:100%}.tabs>*{order:2}.tabs>input[type=radio]{display:none}.tabs>label{order:1;padding:.7em;margin:0 .7em;letter-spacing:.5px;text-transform:uppercase;border:solid #fff;border-width:0 0 2px;user-select:none}.tabs>label:hover,.tabs>label:last-of-type{border-bottom:2px solid #084999}.tabs>section{min-width:100%;padding:.7rem 0;border-top:1px solid #000;display:none}.tabs>label:last-of-type{background:#3498DB;color:#FFF;font-weight:700;letter-spacing:-.1px}.tabs>section:last-of-type{display:block}html body .tabs>input:checked~section{display:none}html body .tabs>input:checked~label{position:inherited;background:inherit;border-bottom:2px solid transparent;font-weight:400;color:inherit}html body .tabs>input:checked~label:hover{border-bottom:2px solid #084999}html body .tabs>input:checked+label{border-bottom:2px solid #084999;background:#3498DB;color:#FFF;font-weight:700;letter-spacing:-.1px}html body .tabs>input:checked+label+section{display:block}select{height:28px;margin:0 1em 0 0;padding:2px 8px 2px 0!important;color:#222;font-size:12px;z-index:2}@supports ((background-position-x:100%) and ((appearance:none) or (-webkit-appearance:none) or (-moz-appearance:none))){select{appearance:none;-webkit-appearance:none;-moz-appearance:none;border:none;border-bottom:1px solid #d7d7d7;background:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSI1MTJweCIgaGVpZ2h0PSI1MTJweCIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxMiA1MTIiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxnPjxwb2x5Z29uIHBvaW50cz0iMTI4LDE5MiAyNTYsMzIwIDM4NCwxOTIiLz48L2c+PC9zdmc+Cg==) no-repeat;background-position-x:105%;background-size:2em;background-origin:content-box;outline:0}select:focus,select:hover{border-bottom:1px solid #3498DB}}@supports (border-radius:50px){.checkbox-onoff{display:inline-block;width:40px;height:10px;background:#dcdcdc;margin:8px auto;position:relative;border-radius:50px}.checkbox-onoff label{display:block;width:20px;height:20px;position:absolute;top:-5px;cursor:pointer;border-radius:50px;box-shadow:0 3px 5px 0 rgba(0,0,0,.3);transition:all .4s ease;left:27px;background-color:#3498DB}.checkbox-onoff input[type=checkbox]{visibility:hidden}.checkbox-onoff input[type=checkbox]:checked+label{left:-5px;background:#dcdcdc}}@supports (transform:rotate(-45deg)){.checkbox{width:20px;position:relative;margin:20px auto}.checkbox label{width:20px;height:20px;cursor:pointer;position:absolute;top:0;left:0;background:#fff;border-radius:4px;box-shadow:inset 0 1px 1px #fff,0 1px 4px rgba(0,0,0,.5)}.checkbox label:after{content:'';width:9px;height:5px;position:absolute;top:4px;left:4px;border:3px solid #333;border-top:none;border-right:none;background:0 0;opacity:0;transform:rotate(-45deg)}.checkbox input[type=checkbox]{visibility:hidden}.checkbox input[type=checkbox]:checked+label:after{border-color:#3498DB;opacity:1}.checkbox input[disabled]+label{background-color:transparent!important;box-shadow:none!important;cursor:inherit}.checkbox input:not(:checked):not([readonly]):not([disabled])+label:hover::after{opacity:.5}}@media screen and (max-width:50em){.tabs>label{width:100%}}.loader,.loader:after{border-radius:50%;width:2em;height:2em}.loader{margin:1em auto;font-size:10px;position:relative;text-indent:-9999em;border-top:.5em solid rgba(0,0,0,.2);border-right:.5em solid rgba(0,0,0,.2);border-bottom:.5em solid rgba(0,0,0,.2);border-left:.5em solid rgba(255,255,255,0);-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);-webkit-animation:load8 1.2s infinite linear;animation:load8 1.2s infinite linear}@-webkit-keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}/*! Autocomplete.js v2.6.3 | license MIT | (c) 2017, Baptiste Donaux | http://autocomplete-js.com */.autocomplete{position:absolute;max-height:0;overflow-y:hidden;text-align:left}#categories_container,.category{position:relative}.autocomplete:active,.autocomplete:focus,.autocomplete:hover{background-color:#fff}#send_search:hover,.autocomplete>ul>li.active,.autocomplete>ul>li:active,.autocomplete>ul>li:focus{background-color:#3498DB}.autocomplete:empty{display:none}.autocomplete>ul{margin:0;padding:0}.autocomplete>ul>li{cursor:pointer;padding:5px 0 5px 10px}.autocomplete>ul>li.active a:active,.autocomplete>ul>li.active a:focus,.autocomplete>ul>li.active a:hover,.autocomplete>ul>li:active a:active,.autocomplete>ul>li:active a:focus,.autocomplete>ul>li:active a:hover,.autocomplete>ul>li:focus a:active,.autocomplete>ul>li:focus a:focus,.autocomplete>ul>li:focus a:hover{text-decoration:none}.autocomplete>ul>li.locked{cursor:inherit}.autocomplete.open{display:block;background-color:#fff;border:1px solid #3498DB;max-height:500px;overflow-y:auto;z-index:100}.autocomplete.open:empty{display:none}.ion-icon,.ion-icon-big{display:inline-block;line-height:1;font-weight:400;font-style:normal;speak:none;text-decoration:inherit;text-transform:none;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:middle}@media screen and (max-width:50em){.autocomplete{bottom:0}.autocomplete>ul>li{padding:7px 0 7px 10px;border-bottom:1px solid #E8E7E6;text-align:left}}#main_preferences table td,.index{text-align:center}@font-face{font-family:ion;src:url(../fonts/ion.eot?ce7a0ead692560b4405a96d5b8471f51);src:url(../fonts/ion.eot?#iefix) format("embedded-opentype"),url(../fonts/ion.woff2?ce7a0ead692560b4405a96d5b8471f51) format("woff2"),url(../fonts/ion.woff?ce7a0ead692560b4405a96d5b8471f51) format("woff"),url(../fonts/ion.ttf?ce7a0ead692560b4405a96d5b8471f51) format("truetype"),url(../fonts/ion.svg?ce7a0ead692560b4405a96d5b8471f51#ion) format("svg");font-weight:400;font-style:normal}.ion-navicon-round:before{content:"\f101"}.ion-search:before{content:"\f102"}.ion-play:before{content:"\f103"}.ion-link:before{content:"\f104"}.ion-chevron-up:before{content:"\f105"}.ion-chevron-left:before{content:"\f106"}.ion-chevron-right:before{content:"\f107"}.ion-arrow-down-a:before{content:"\f108"}.ion-arrow-up-a:before{content:"\f109"}.ion-arrow-swap:before{content:"\f10a"}.ion-arrow-dropdown:before{content:"\f10b"}.ion-globe:before{content:"\f10c"}.ion-time:before{content:"\f10d"}.ion-location:before{content:"\f10e"}.ion-warning:before{content:"\f10f"}.ion-error:before{content:"\f110"}.ion-film-outline:before{content:"\f111"}.ion-music-note:before{content:"\f112"}.ion-more-vertical:before{content:"\f113"}.ion-magnet:before{content:"\f114"}.ion-close:before{content:"\f115"}.ion-icon-big{font-size:149%}.index .title{background:url(../img/searx.png) center no-repeat;width:100%;min-height:80px}.index h1{font-size:5em}.index #search{margin:0 auto;background:inherit;border:inherit}.index .search_filters{display:block;margin:1em 0}.index .category label{padding:6px 10px;border-bottom:initial!important}@media screen and (max-width:75em){div.title h1{font-size:1em}.preferences_back{clear:both}}#main_preferences form{width:100%}#main_preferences fieldset{margin:8px;border:none}#main_preferences legend{margin:0;padding:5px 0 0;display:block;float:left;width:300px}#main_preferences .value{margin:0;padding:0;float:left;width:15em}#main_preferences .description{margin:0;padding:5px 0 0;float:left;width:50%;color:#909090;font-size:90%}#main_preferences select{width:200px;font-size:inherit!important}#main_preferences table{border-collapse:collapse}#main_preferences table.cookies{width:auto}#main_preferences div.selectable_url pre,footer,main{width:100%}#main_preferences table.cookies td,#main_preferences table.cookies th{text-align:left;padding:.25em}#main_preferences table.cookies td:first-child,#main_preferences table.cookies th:first-child{padding-right:4em}#main_preferences table.cookies>tbody>tr:nth-child(even)>td,#main_preferences table.cookies>tbody>tr:nth-child(even)>th{background-color:#ececec}#main_preferences .name,#main_preferences .shortcut{text-align:left}#main_preferences .preferences_back{background:#3498DB;color:#fff;border:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;cursor:pointer;display:inline-block;margin:2px 4px;padding:.5em}#main_preferences .preferences_back a{display:block;color:#FFF}#main_preferences .preferences_back a::first-letter{text-transform:uppercase}#search{padding:0 2em;margin:0;background:#f7f7f7;border-bottom:1px solid #d7d7d7}#search_wrapper{padding:10px 0}.search_box{margin:0 12px 0 0;display:inline-flex;flex-direction:row}#clear_search,#q,#send_search{border-collapse:separate;box-sizing:border-box;margin:0;padding:2px;height:2.2em;background:#FFF;color:#222;font-size:16px;outline:0}#clear_search{display:block;width:1.8em;border-top:1px solid #3498DB;border-bottom:1px solid #3498DB;border-right:none;border-left:none;border-radius:0;z-index:10000}#clear_search:hover{color:#3498DB}#clear_search.empty *{display:none}#q::-ms-clear,#q::-webkit-search-cancel-button{display:none}#q,#send_search{display:block!important;border:1px solid #3498DB;border-radius:0;z-index:2}#q{outline:0;padding-left:8px;padding-right:0!important;border-right:none;width:40em}#send_search{border-left:none;width:2.2em}#send_search:hover{cursor:pointer;color:#ECF0F1}.no-js #send_search{width:auto!important}.search_filters{display:inline-block;vertical-align:middle}@media screen and (max-width:75em){#categories{font-size:90%;clear:both}#categories .checkbox_container{margin:auto}html.touch #main_index #categories_container,html.touch #main_results #categories_container{width:1000px;width:-moz-max-content;width:-webkit-max-content;width:max-content}html.touch #main_index #categories_container .category,html.touch #main_results #categories_container .category{display:inline-block;width:auto}html.touch #main_index #categories,html.touch #main_results #categories{width:100%;margin:0;text-align:left;overflow-x:scroll;overflow-y:hidden;-webkit-overflow-scrolling:touch}}@media screen and (max-width:50em){#search{width:100%;margin:0;padding:.1em 0 0}#search_wrapper{width:100%;margin:0 0 .7em;padding:0}.search_box{width:99%;margin:.1em;padding:0 .1em 0 0;display:flex;flex-direction:row}#q{width:auto!important;flex:1}.search_filters{display:block;margin:.5em}.language,.time_range{width:45%}.category{display:block;width:90%}.category label{border-bottom:0}}#categories{margin:0 10px 0 0;user-select:none}#categories::-webkit-scrollbar{width:0;height:0}.category{display:inline-block;margin:0 3px;padding:0}.category input{display:none}.category label{cursor:pointer;padding:4px 10px;margin:0;display:block;text-transform:capitalize;font-size:.9em;border-bottom:2px solid transparent;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body,html,main{padding:0;margin:0}.category input[type=checkbox]:focus+label{box-shadow:0 0 8px #3498DB}.category input[type=checkbox]:checked+label{background:#3498DB;color:#FFF;border-bottom:2px solid #084999}#categories_container .help{position:absolute;width:100%;bottom:-20px;overflow:hidden;opacity:0;transition:opacity 1s ease;font-size:.8em;text-position:center;background:#fff}footer p,html{font-size:.9em}#categories_container:hover .help{opacity:.8;transition:opacity 1s ease}html{font-family:arial,sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;color:#444}#main_about,#main_preferences,#main_stats{margin:3em;width:auto}footer{bottom:0;height:3em;margin:1em 0;padding:1em 0;text-align:center}#main_preferences h1,#main_stats h1{background:url(../img/searx.png) no-repeat;background-size:auto 75%;min-height:40px;margin:0 auto}#results button[type=submit],input[type=submit]{padding:.5rem;margin:2px 4px;display:inline-block;background:#3498DB;color:#FFF;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:0;cursor:pointer}a{text-decoration:none;color:#29314d}a:visited,a:visited .highlight{color:#684898}article[data-vim-selected]{background:#f7f7f7}article[data-vim-selected]::before{position:absolute;left:1em;padding:2px;content:">";font-weight:700;color:#3498DB}article.result-images[data-vim-selected]{background:#3498DB}article.result-images[data-vim-selected]::before{display:none;content:""}.result{margin:19px 0 18px;padding:0}.result h3{font-size:1.1em;word-wrap:break-word;margin:5px 0 0;padding:0}.result h3 a{color:#084999;font-weight:400;font-size:1.1em}.result h3 a:visited{color:#684898}.result h3 a:focus,.result h3 a:hover{text-decoration:underline;border:none;-webkit-box-shadow:none;box-shadow:none;outline:0}.result .cache_link,.result .proxyfied_link{font-size:.9em!important}.result .altlink,.result .content,.result .stat,.result .url{font-size:.9em;padding:0;max-width:54em;word-wrap:break-word}.result .altlink,.result .content,.result .stat{margin:0;line-height:1.24}.result .altlink .highlight,.result .content .highlight,.result .stat .highlight{color:#000;background:inherit;font-weight:700}.result .codelines .highlight{color:inherit;background:inherit;font-weight:400}.result .url{margin:0 0 3px;color:#25a55b}.result .published_date{font-size:.8em;color:#888}.result img.thumbnail{float:left;padding:0 5px 10px 0;width:20em;min-width:20em;min-height:8em}.result img.image{float:left;padding:0 5px 10px 0;width:100px;max-height:100px;object-fit:scale-down;object-position:right top}.category-social .image{width:auto!important;min-width:48px;min-height:48px;padding:0 5px 25px 0!important}.result-videos .content{overflow:hidden}.engines{float:right;color:#888}.engines span{font-size:smaller;margin:0 .5em 0 0}.result-images,.result-images img{margin:0;padding:0;max-height:200px}.small_font{font-size:.8em}.highlight{color:#094089;background:inherit;font-weight:700}.result-images{display:inline-block;position:relative}.result-images img{float:inherit;border:none;background:#084999}.result-images span a{display:none;color:#FFF}.result-images:hover span a{display:block;position:absolute;bottom:0;right:0;padding:4px;margin:0 0 4px 4px;background-color:rgba(0,0,0,.6);font-size:.7em}.torrent_result{border-left:10px solid #d3d3d3;padding-left:3px}#answers,#backToTop,#sidebar .infobox{border:1px solid #ddd;box-shadow:0 0 5px #CCC}.torrent_result p{margin:3px;font-size:.8em}.torrent_result a{color:#084999}.torrent_result a:hover{text-decoration:underline}.torrent_result a:visited{color:#684898}#results{margin:2em 2em 20px;padding:0;width:50em}#suggestions .wrapper{display:flex;flex-flow:row wrap;justify-content:flex-end}#suggestions .wrapper form{display:inline-block;flex:1 1 50%}#answers,#corrections,#suggestions{max-width:50em}#answers input,#corrections input,#infoboxes input,#suggestions input{padding:0;margin:3px;font-size:.9em;display:inline-block;background:0 0;color:#444;cursor:pointer}#answers .infobox .url a,#answers input[type=submit],#corrections .infobox .url a,#corrections input[type=submit],#infoboxes .infobox .url a,#infoboxes input[type=submit],#suggestions .infobox .url a,#suggestions input[type=submit]{color:#084999;text-decoration:none;font-size:.9rem}#answers .infobox .url a:hover,#answers input[type=submit]:hover,#corrections .infobox .url a:hover,#corrections input[type=submit]:hover,#infoboxes .infobox .url a:hover,#infoboxes input[type=submit]:hover,#suggestions .infobox .url a:hover,#suggestions input[type=submit]:hover{text-decoration:underline}#corrections{display:flex;flex-flow:row wrap;margin:1em 0}#corrections h4,#corrections input[type=submit]{display:inline-block;margin:0 .5em 0 0}#corrections input[type=submit]::after{content:", "}#apis .title,#search_url .title,#suggestions .title{margin:2em 0 .5em;color:#444}#answers{margin:10px 8px;padding:.9em}#answers h4{display:none}#answers .answer{display:block;font-size:1.2em;font-weight:700}#answers form,#infoboxes form{min-width:210px}#sidebar{position:absolute;top:100px;left:57em;margin:0 2px 5px 5px;padding:0 2px 2px;max-width:25em;word-wrap:break-word}#sidebar .infobox{margin:10px 0;padding:.9em;font-size:.9em}#sidebar .infobox h2{margin:0 0 .5em}#sidebar .infobox img{max-width:100%;max-height:12em;display:block;margin:0;padding:0}#sidebar .infobox dl{margin:.5em 0}#sidebar .infobox dt{display:inline;margin:.5em .25em .5em 0;padding:0;font-weight:700}#sidebar .infobox dd{display:inline;margin:.5em 0;padding:0}#apis,#search_url{margin-top:8px}#sidebar .infobox input{font-size:1em}#search_url div.selectable_url pre{width:200em}#linkto_preferences{position:absolute;right:10px;top:.9em;padding:0;border:0;display:block;font-size:1.2em;color:#222}#linkto_preferences a:active *,#linkto_preferences a:hover *,#linkto_preferences a:link *,#linkto_preferences a:visited *{color:#222}#backToTop{margin:0 0 0 2em;padding:0;font-size:1em;background:#fff;position:fixed;bottom:85px;left:50em;transition:opacity .5s;opacity:0}#backToTop a{display:block;margin:0;padding:.6em}@media screen and (max-width:75em){#main_about,#main_preferences,#main_stats{margin:.5em;width:auto}#answers,#suggestions{margin-top:1em}#infoboxes{position:inherit;max-width:inherit}#infoboxes .infobox{clear:both}#infoboxes .infobox img{float:left;max-width:10em;margin:.5em .5em .5em 0}#sidebar{position:static;max-width:50em;margin:0 0 2px;padding:0;float:none;border:none;width:auto}.image_result,.image_result img,.result .thumbnail{max-width:98%}#sidebar input{border:0}#apis,#search_url{display:none}.result{border-bottom:1px solid #E8E7E6;margin:0;padding-top:8px;padding-bottom:6px}.result h3{margin:0 0 1px}.result .url span.url{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:100%}.result .url a{float:right;padding:0 .5em}.result .engines{float:right;padding:0 0 3px}.result-images{border-bottom:none!important}}#main_results div#results.only_template_images{flex-direction:column;width:auto;display:flex}#main_results div#results.only_template_images #sidebar{position:relative;top:auto;order:2}#main_results div#results.only_template_images #urls{position:relative;order:1}#main_results div#results.only_template_images #backToTop{right:.5em;left:auto}#main_results div#results.only_template_images #pagination{position:relative;order:3}@media screen and (max-width:50em){article[data-vim-selected]::before{display:none;content:""}#linkto_preferences{display:none;postion:fixed!important;top:100px;right:0}#sidebar{margin:0 5px 2px}#corrections{margin:1em 5px}#results{margin:0;padding:0;width:initial}#backToTop{left:40em;bottom:35px}.result{padding:8px 10px 6px}.result-images{margin:0;padding:0;border:none}}@media screen and (max-width:35em){.result-videos img.thumbnail{float:none!important}.result-videos .content{overflow:inherit}}#search_submit{left:1px;right:auto} \ No newline at end of file
+/*! searx | 06-08-2019 | https://github.com/asciimoo/searx *//*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */button,hr,input{overflow:visible}[type=checkbox],[type=radio],legend{padding:0;box-sizing:border-box}.badge,.center{text-align:center}.badge,progress,sub,sup{vertical-align:baseline}.autocomplete>ul,.list-unstyled{list-style-type:none}.tabs>section,legend{box-sizing:border-box}#main_preferences h1 span,#main_stats h1 span,.index h1{visibility:hidden}#apis,#pagination,#pagination br,#sidebar .infobox .attributes,#sidebar .infobox .urls,#sidebar .infobox br,.result .break,footer{clear:both}html{line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}.highlight pre,textarea{overflow:auto}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{color:inherit;display:table;max-width:100%;white-space:normal}.badge,.search_box{white-space:nowrap}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.highlight .c,.highlight .cm,.highlight .ge,.highlight .sd{font-style:italic}.dialog-error:before,.dialog-modal:before,.dialog-warning:before,.ion-icon-big:before,.ion-icon:before{font-family:ion}details{display:block}summary{display:list-item}[hidden],html.js .show_if_nojs,html.no-js .hide_if_nojs,template{display:none}.highlight .hll{background-color:#ffc}.highlight .c{color:#408080}.highlight .err{border:1px solid red}.highlight .k{color:green;font-weight:700}.highlight .o{color:#666}.highlight .cm{color:#408080}.highlight .cp{color:#BC7A00}.highlight .c1,.highlight .cs{color:#408080;font-style:italic}.highlight .gd{color:#A00000}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00A000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04D}.highlight .kc,.highlight .kd,.highlight .kn{color:green;font-weight:700}.highlight .kp{color:green}.highlight .kr{color:green;font-weight:700}.highlight .kt{color:#B00040}.highlight .m{color:#666}.highlight .s{color:#BA2121}.highlight .na{color:#7D9029}.highlight .nb{color:green}.highlight .nc{color:#00F;font-weight:700}.highlight .no{color:#800}.highlight .nd{color:#A2F}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#00F}.highlight .nl{color:#A0A000}.highlight .nn{color:#00F;font-weight:700}.highlight .nt{color:green;font-weight:700}.highlight .nv{color:#19177C}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#bbb}.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:#666}.highlight .s2,.highlight .sb,.highlight .sc{color:#BA2121}.highlight .sd{color:#BA2121}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#BA2121}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:green}.highlight .sr{color:#B68}.highlight .s1{color:#BA2121}.highlight .ss{color:#19177C}.highlight .bp{color:green}.highlight .vc,.highlight .vg,.highlight .vi{color:#19177C}.highlight .il{color:#666}.badge,kbd{color:#fff}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.btn-collapse,.tabs>label,select:focus,select:hover{cursor:pointer}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0}.right{float:right}.left{float:left}.invisible{display:none!important}.list-unstyled li{margin-top:4px;margin-bottom:4px}.danger{background-color:#fae1e1}.badge{display:inline-block;background-color:#777;min-width:10px;padding:1px 5px;border-radius:5px}.dialog-error tr,.dialog-modal tr,.dialog-warning tr{vertical-align:text-top}kbd{padding:2px 4px;margin:1px;font-size:90%;background:#000}table{width:100%}table.striped tr{border-bottom:1px solid #ececec}th{padding:.4em}td{padding:0 4px}tr:hover{background:#ececec}div.selectable_url{border:1px solid #888;padding:4px;color:#444;width:100%;display:block;margin:.1em;overflow:hidden;height:1.2em;line-height:1.2em}div.selectable_url pre{display:block;font-size:.8em;word-break:break-all;margin:.1em;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:element;user-select:all}#categories,.tabs>label{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-touch-callout:none;-khtml-user-select:none}.dialog-error{position:relative;width:70%;padding:1em 1em 1em 2.7em;margin:0 8% 1em;border:1px solid #db3434;border-radius:4px;text-align:left;color:#db3434;background:#fae1e1}.dialog-error:before{position:absolute;top:.5em;left:.5em;font-size:1.5em;content:"\f110"}.dialog-error .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-error ol,.dialog-error p,.dialog-error ul{margin:1px 0 0}.dialog-error table{width:auto}.dialog-error tr:hover{background:0 0}.dialog-error td{padding:0 1em 0 0}.dialog-error h4{margin-top:.3em;margin-bottom:.3em}.dialog-warning{position:relative;width:70%;padding:1em 1em 1em 2.7em;margin:0 8% 1em;border:1px solid #dbba34;border-radius:4px;text-align:left;color:#dbba34;background:#faf5e1}.dialog-warning:before{position:absolute;top:.5em;left:.5em;font-size:1.5em;content:"\f10f"}.dialog-warning .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-warning ol,.dialog-warning p,.dialog-warning ul{margin:1px 0 0}.dialog-warning table{width:auto}.dialog-warning tr:hover{background:0 0}.dialog-warning td{padding:0 1em 0 0}.dialog-warning h4{margin-top:.3em;margin-bottom:.3em}.dialog-modal{width:70%;padding:1em 1em 1em 2.7em;border:1px solid #000;border-radius:4px;text-align:left;background:#fff;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:100000;margin:0 50% 0 0;box-shadow:0 0 1em}.dialog-modal:before{position:absolute;top:.5em;left:.5em;font-size:1.5em}.dialog-modal .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-modal ol,.dialog-modal p,.dialog-modal ul{margin:1px 0 0}.dialog-modal table{width:auto}.dialog-modal tr:hover{background:0 0}.dialog-modal td{padding:0 1em 0 0}.dialog-modal h4{margin-top:.3em;margin-bottom:.3em}.scrollx{overflow-x:auto;overflow-y:hidden;display:block;padding:0;margin:0;border:none}.tabs .tabs>label{font-size:90%}.tabs{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-wrap:wrap;width:100%;min-width:100%}.tabs>*{order:2}.tabs>input[type=radio]{display:none}.tabs>label{order:1;padding:.7em;margin:0 .7em;letter-spacing:.5px;text-transform:uppercase;border:solid #fff;border-width:0 0 2px;user-select:none}.tabs>label:hover,.tabs>label:last-of-type{border-bottom:2px solid #084999}.tabs>section{min-width:100%;padding:.7rem 0;border-top:1px solid #000;display:none}.tabs>label:last-of-type{background:#3498DB;color:#FFF;font-weight:700;letter-spacing:-.1px}.tabs>section:last-of-type{display:block}html body .tabs>input:checked~section{display:none}html body .tabs>input:checked~label{position:inherited;background:inherit;border-bottom:2px solid transparent;font-weight:400;color:inherit}html body .tabs>input:checked~label:hover{border-bottom:2px solid #084999}html body .tabs>input:checked+label{border-bottom:2px solid #084999;background:#3498DB;color:#FFF;font-weight:700;letter-spacing:-.1px}html body .tabs>input:checked+label+section{display:block}select{height:28px;margin:0 1em 0 0;padding:2px 8px 2px 0!important;color:#222;font-size:12px;z-index:2}@supports ((background-position-x:100%) and ((appearance:none) or (-webkit-appearance:none) or (-moz-appearance:none))){select{appearance:none;-webkit-appearance:none;-moz-appearance:none;border:none;border-bottom:1px solid #d7d7d7;background:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSI1MTJweCIgaGVpZ2h0PSI1MTJweCIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxMiA1MTIiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxnPjxwb2x5Z29uIHBvaW50cz0iMTI4LDE5MiAyNTYsMzIwIDM4NCwxOTIiLz48L2c+PC9zdmc+Cg==) no-repeat;background-position-x:105%;background-size:2em;background-origin:content-box;outline:0}select:focus,select:hover{border-bottom:1px solid #3498DB}}@supports (border-radius:50px){.checkbox-onoff{display:inline-block;width:40px;height:10px;background:#dcdcdc;margin:8px auto;position:relative;border-radius:50px}.checkbox-onoff label{display:block;width:20px;height:20px;position:absolute;top:-5px;cursor:pointer;border-radius:50px;box-shadow:0 3px 5px 0 rgba(0,0,0,.3);transition:all .4s ease;left:27px;background-color:#3498DB}.checkbox-onoff input[type=checkbox]{visibility:hidden}.checkbox-onoff input[type=checkbox]:checked+label{left:-5px;background:#dcdcdc}}@supports (transform:rotate(-45deg)){.checkbox{width:20px;position:relative;margin:20px auto}.checkbox label{width:20px;height:20px;cursor:pointer;position:absolute;top:0;left:0;background:#fff;border-radius:4px;box-shadow:inset 0 1px 1px #fff,0 1px 4px rgba(0,0,0,.5)}.checkbox label:after{content:'';width:9px;height:5px;position:absolute;top:4px;left:4px;border:3px solid #333;border-top:none;border-right:none;background:0 0;opacity:0;transform:rotate(-45deg)}.checkbox input[type=checkbox]{visibility:hidden}.checkbox input[type=checkbox]:checked+label:after{border-color:#3498DB;opacity:1}.checkbox input[disabled]+label{background-color:transparent!important;box-shadow:none!important;cursor:inherit}.checkbox input:not(:checked):not([readonly]):not([disabled])+label:hover::after{opacity:.5}}@media screen and (max-width:50em){.tabs>label{width:100%}}.loader,.loader:after{border-radius:50%;width:2em;height:2em}.loader{margin:1em auto;font-size:10px;position:relative;text-indent:-9999em;border-top:.5em solid rgba(0,0,0,.2);border-right:.5em solid rgba(0,0,0,.2);border-bottom:.5em solid rgba(0,0,0,.2);border-left:.5em solid rgba(255,255,255,0);-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);-webkit-animation:load8 1.2s infinite linear;animation:load8 1.2s infinite linear}@-webkit-keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}/*! Autocomplete.js v2.6.3 | license MIT | (c) 2017, Baptiste Donaux | http://autocomplete-js.com */.autocomplete{position:absolute;max-height:0;overflow-y:hidden;text-align:left}#categories_container,.category{position:relative}.autocomplete:active,.autocomplete:focus,.autocomplete:hover{background-color:#fff}#send_search:hover,.autocomplete>ul>li.active,.autocomplete>ul>li:active,.autocomplete>ul>li:focus{background-color:#3498DB}.autocomplete:empty{display:none}.autocomplete>ul{margin:0;padding:0}.autocomplete>ul>li{cursor:pointer;padding:5px 0 5px 10px}.autocomplete>ul>li.active a:active,.autocomplete>ul>li.active a:focus,.autocomplete>ul>li.active a:hover,.autocomplete>ul>li:active a:active,.autocomplete>ul>li:active a:focus,.autocomplete>ul>li:active a:hover,.autocomplete>ul>li:focus a:active,.autocomplete>ul>li:focus a:focus,.autocomplete>ul>li:focus a:hover{text-decoration:none}.autocomplete>ul>li.locked{cursor:inherit}.autocomplete.open{display:block;background-color:#fff;border:1px solid #3498DB;max-height:500px;overflow-y:auto;z-index:100}.autocomplete.open:empty{display:none}.ion-icon,.ion-icon-big{display:inline-block;line-height:1;font-weight:400;font-style:normal;speak:none;text-decoration:inherit;text-transform:none;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:middle}@media screen and (max-width:50em){.autocomplete{bottom:0}.autocomplete>ul>li{padding:7px 0 7px 10px;border-bottom:1px solid #E8E7E6;text-align:left}}#main_preferences table td,.index{text-align:center}@font-face{font-family:ion;src:url(../fonts/ion.eot?ce7a0ead692560b4405a96d5b8471f51);src:url(../fonts/ion.eot?#iefix) format("embedded-opentype"),url(../fonts/ion.woff2?ce7a0ead692560b4405a96d5b8471f51) format("woff2"),url(../fonts/ion.woff?ce7a0ead692560b4405a96d5b8471f51) format("woff"),url(../fonts/ion.ttf?ce7a0ead692560b4405a96d5b8471f51) format("truetype"),url(../fonts/ion.svg?ce7a0ead692560b4405a96d5b8471f51#ion) format("svg");font-weight:400;font-style:normal}.ion-navicon-round:before{content:"\f101"}.ion-search:before{content:"\f102"}.ion-play:before{content:"\f103"}.ion-link:before{content:"\f104"}.ion-chevron-up:before{content:"\f105"}.ion-chevron-left:before{content:"\f106"}.ion-chevron-right:before{content:"\f107"}.ion-arrow-down-a:before{content:"\f108"}.ion-arrow-up-a:before{content:"\f109"}.ion-arrow-swap:before{content:"\f10a"}.ion-arrow-dropdown:before{content:"\f10b"}.ion-globe:before{content:"\f10c"}.ion-time:before{content:"\f10d"}.ion-location:before{content:"\f10e"}.ion-warning:before{content:"\f10f"}.ion-error:before{content:"\f110"}.ion-film-outline:before{content:"\f111"}.ion-music-note:before{content:"\f112"}.ion-more-vertical:before{content:"\f113"}.ion-magnet:before{content:"\f114"}.ion-close:before{content:"\f115"}.ion-icon-big{font-size:149%}.index .title{background:url(../img/searx.png) center no-repeat;width:100%;min-height:80px}.index h1{font-size:5em}.index #search{margin:0 auto;background:inherit;border:inherit}.index .search_filters{display:block;margin:1em 0}.index .category label{padding:6px 10px;border-bottom:initial!important}@media screen and (max-width:75em){div.title h1{font-size:1em}.preferences_back{clear:both}}#main_preferences form{width:100%}#main_preferences fieldset{margin:8px;border:none}#main_preferences legend{margin:0;padding:5px 0 0;display:block;float:left;width:300px}#main_preferences .value{margin:0;padding:0;float:left;width:15em}#main_preferences .description{margin:0;padding:5px 0 0;float:left;width:50%;color:#909090;font-size:90%}#main_preferences select{width:200px;font-size:inherit!important}#main_preferences table{border-collapse:collapse}#main_preferences table.cookies{width:auto}#main_preferences div.selectable_url pre,footer,main{width:100%}#main_preferences table.cookies td,#main_preferences table.cookies th{text-align:left;padding:.25em}#main_preferences table.cookies td:first-child,#main_preferences table.cookies th:first-child{padding-right:4em}#main_preferences table.cookies>tbody>tr:nth-child(even)>td,#main_preferences table.cookies>tbody>tr:nth-child(even)>th{background-color:#ececec}#main_preferences .name,#main_preferences .shortcut{text-align:left}#main_preferences .preferences_back{background:#3498DB;color:#fff;border:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;cursor:pointer;display:inline-block;margin:2px 4px;padding:.5em}#main_preferences .preferences_back a{display:block;color:#FFF}#main_preferences .preferences_back a::first-letter{text-transform:uppercase}#search{padding:0 2em;margin:0;background:#f7f7f7;border-bottom:1px solid #d7d7d7}#search_wrapper{padding:10px 0}.search_box{margin:0 12px 0 0;display:inline-flex;flex-direction:row}#clear_search,#q,#send_search{border-collapse:separate;box-sizing:border-box;margin:0;padding:2px;height:2.2em;background:#FFF;color:#222;font-size:16px;outline:0}#clear_search{display:block;width:1.8em;border-top:1px solid #3498DB;border-bottom:1px solid #3498DB;border-right:none;border-left:none;border-radius:0;z-index:10000}#clear_search:hover{color:#3498DB}#clear_search.empty *{display:none}#q::-ms-clear,#q::-webkit-search-cancel-button{display:none}#q,#send_search{display:block!important;border:1px solid #3498DB;border-radius:0;z-index:2}#q{outline:0;padding-left:8px;padding-right:0!important;border-right:none;width:40em}#send_search{border-left:none;width:2.2em}#send_search:hover{cursor:pointer;color:#ECF0F1}.no-js #send_search{width:auto!important}.search_filters{display:inline-block;vertical-align:middle}@media screen and (max-width:75em){#categories{font-size:90%;clear:both}#categories .checkbox_container{margin:auto}html.touch #main_index #categories_container,html.touch #main_results #categories_container{width:1000px;width:-moz-max-content;width:-webkit-max-content;width:max-content}html.touch #main_index #categories_container .category,html.touch #main_results #categories_container .category{display:inline-block;width:auto}html.touch #main_index #categories,html.touch #main_results #categories{width:100%;margin:0;text-align:left;overflow-x:scroll;overflow-y:hidden;-webkit-overflow-scrolling:touch}}@media screen and (max-width:50em){#search{width:100%;margin:0;padding:.1em 0 0}#search_wrapper{width:100%;margin:0 0 .7em;padding:0}.search_box{width:99%;margin:.1em;padding:0 .1em 0 0;display:flex;flex-direction:row}#q{width:auto!important;flex:1}.search_filters{display:block;margin:.5em}.language,.time_range{width:45%}.category{display:block;width:90%}.category label{border-bottom:0}}#categories{margin:0 10px 0 0;user-select:none}#categories::-webkit-scrollbar{width:0;height:0}.category{display:inline-block;margin:0 3px;padding:0}.category input{display:none}.category label{cursor:pointer;padding:4px 10px;margin:0;display:block;text-transform:capitalize;font-size:.9em;border-bottom:2px solid transparent;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body,html,main{padding:0;margin:0}.category input[type=checkbox]:focus+label{box-shadow:0 0 8px #3498DB}.category input[type=checkbox]:checked+label{background:#3498DB;color:#FFF;border-bottom:2px solid #084999}#categories_container .help{position:absolute;width:100%;bottom:-20px;overflow:hidden;opacity:0;transition:opacity 1s ease;font-size:.8em;text-position:center;background:#fff}footer p,html{font-size:.9em}#categories_container:hover .help{opacity:.8;transition:opacity 1s ease}html{font-family:arial,sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;color:#444}#main_about,#main_preferences,#main_stats{margin:3em;width:auto}footer{bottom:0;height:3em;margin:1em 0;padding:1em 0;text-align:center}#main_preferences h1,#main_stats h1{background:url(../img/searx.png) no-repeat;background-size:auto 75%;min-height:40px;margin:0 auto}#results button[type=submit],input[type=submit]{padding:.5rem;margin:2px 4px;display:inline-block;background:#3498DB;color:#FFF;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:0;cursor:pointer}a{text-decoration:none;color:#29314d}a:visited,a:visited .highlight{color:#684898}article[data-vim-selected]{background:#f7f7f7}article[data-vim-selected]::before{position:absolute;left:1em;padding:2px;content:">";font-weight:700;color:#3498DB}article.result-images[data-vim-selected]{background:#3498DB}article.result-images[data-vim-selected]::before{display:none;content:""}.result{margin:19px 0 18px;padding:0}.result h3{font-size:1.1em;word-wrap:break-word;margin:5px 0 0;padding:0}.result h3 a{color:#084999;font-weight:400;font-size:1.1em}.result h3 a:visited{color:#684898}.result h3 a:focus,.result h3 a:hover{text-decoration:underline;border:none;-webkit-box-shadow:none;box-shadow:none;outline:0}.result .cache_link,.result .proxyfied_link{font-size:.9em!important}.result .altlink,.result .content,.result .stat,.result .url{font-size:.9em;padding:0;max-width:54em;word-wrap:break-word}.result .altlink,.result .content,.result .stat{margin:0;line-height:1.24}.result .altlink .highlight,.result .content .highlight,.result .stat .highlight{color:#000;background:inherit;font-weight:700}.result .codelines .highlight{color:inherit;background:inherit;font-weight:400}.result .url{margin:0 0 3px;color:#25a55b}.result .published_date{font-size:.8em;color:#888}.result img.thumbnail{float:left;padding:0 5px 10px 0;width:20em;min-width:20em;min-height:8em}.result img.image{float:left;padding:0 5px 10px 0;width:100px;max-height:100px;object-fit:scale-down;object-position:right top}.category-social .image{width:auto!important;min-width:48px;min-height:48px;padding:0 5px 25px 0!important}.result-videos .content{overflow:hidden}.engines{float:right;color:#888}.engines span{font-size:smaller;margin:0 .5em 0 0}.result-images,.result-images img{margin:0;padding:0;max-height:200px}.small_font{font-size:.8em}.highlight{color:#094089;background:inherit;font-weight:700}.result-images{display:inline-block;position:relative}.result-images img{float:inherit;border:none;background:#084999}.result-images span a{display:none;color:#FFF}.result-images:hover span a{display:block;position:absolute;bottom:0;right:0;padding:4px;margin:0 0 4px 4px;background-color:rgba(0,0,0,.6);font-size:.7em}.torrent_result{border-left:10px solid #d3d3d3;padding-left:3px}#answers,#backToTop,#sidebar .infobox{border:1px solid #ddd;box-shadow:0 0 5px #CCC}.torrent_result p{margin:3px;font-size:.8em}.torrent_result a{color:#084999}.torrent_result a:hover{text-decoration:underline}.torrent_result a:visited{color:#684898}#results{margin:2em 2em 20px;padding:0;width:50em}#suggestions .wrapper{display:flex;flex-flow:row wrap;justify-content:flex-end}#suggestions .wrapper form{display:inline-block;flex:1 1 50%}#answers,#corrections,#suggestions{max-width:50em}#answers input,#corrections input,#infoboxes input,#suggestions input{padding:0;margin:3px;font-size:.9em;display:inline-block;background:0 0;color:#444;cursor:pointer}#answers .infobox .url a,#answers input[type=submit],#corrections .infobox .url a,#corrections input[type=submit],#infoboxes .infobox .url a,#infoboxes input[type=submit],#suggestions .infobox .url a,#suggestions input[type=submit]{color:#084999;text-decoration:none;font-size:.9rem}#answers .infobox .url a:hover,#answers input[type=submit]:hover,#corrections .infobox .url a:hover,#corrections input[type=submit]:hover,#infoboxes .infobox .url a:hover,#infoboxes input[type=submit]:hover,#suggestions .infobox .url a:hover,#suggestions input[type=submit]:hover{text-decoration:underline}#corrections{display:flex;flex-flow:row wrap;margin:1em 0}#corrections h4,#corrections input[type=submit]{display:inline-block;margin:0 .5em 0 0}#corrections input[type=submit]::after{content:", "}#apis .title,#search_url .title,#suggestions .title{margin:2em 0 .5em;color:#444}#answers{margin:10px 8px;padding:.9em}#answers h4{display:none}#answers .answer{display:block;font-size:1.2em;font-weight:700}#answers form,#infoboxes form{min-width:210px}#sidebar{position:absolute;top:100px;left:57em;margin:0 2px 5px 5px;padding:0 2px 2px;max-width:25em;word-wrap:break-word}#sidebar .infobox{margin:10px 0;padding:.9em;font-size:.9em}#sidebar .infobox h2{margin:0 0 .5em}#sidebar .infobox img{max-width:100%;max-height:12em;display:block;margin:0;padding:0}#sidebar .infobox dl{margin:.5em 0}#sidebar .infobox dt{display:inline;margin:.5em .25em .5em 0;padding:0;font-weight:700}#sidebar .infobox dd{display:inline;margin:.5em 0;padding:0}#apis,#search_url{margin-top:8px}#sidebar .infobox input{font-size:1em}#search_url div.selectable_url pre{width:200em}#linkto_preferences{position:absolute;right:10px;top:.9em;padding:0;border:0;display:block;font-size:1.2em;color:#222}#linkto_preferences a:active *,#linkto_preferences a:hover *,#linkto_preferences a:link *,#linkto_preferences a:visited *{color:#222}#backToTop{margin:0 0 0 2em;padding:0;font-size:1em;background:#fff;position:fixed;bottom:85px;left:50em;transition:opacity .5s;opacity:0}#backToTop a{display:block;margin:0;padding:.6em}@media screen and (max-width:75em){#main_about,#main_preferences,#main_stats{margin:.5em;width:auto}#answers,#suggestions{margin-top:1em}#infoboxes{position:inherit;max-width:inherit}#infoboxes .infobox{clear:both}#infoboxes .infobox img{float:left;max-width:10em;margin:.5em .5em .5em 0}#sidebar{position:static;max-width:50em;margin:0 0 2px;padding:0;float:none;border:none;width:auto}.image_result,.image_result img,.result .thumbnail{max-width:98%}#sidebar input{border:0}#apis,#search_url{display:none}.result{border-bottom:1px solid #E8E7E6;margin:0;padding-top:8px;padding-bottom:6px}.result h3{margin:0 0 1px}.result .url span.url{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:100%}.result .url a{float:right;padding:0 .5em}.result .engines{float:right;padding:0 0 3px}.result-images{border-bottom:none!important}}#main_results div#results.only_template_images{flex-direction:column;width:auto;display:flex}#main_results div#results.only_template_images #sidebar{position:relative;top:auto;order:2}#main_results div#results.only_template_images #urls{position:relative;order:1}#main_results div#results.only_template_images #backToTop{right:.5em;left:auto}#main_results div#results.only_template_images #pagination{position:relative;order:3}@media screen and (max-width:50em){article[data-vim-selected]::before{display:none;content:""}#linkto_preferences{display:none;postion:fixed!important;top:100px;right:0}#sidebar{margin:0 5px 2px}#corrections{margin:1em 5px}#results{margin:0;padding:0;width:initial}#backToTop{left:40em;bottom:35px}.result{padding:8px 10px 6px}.result-images{margin:0;padding:0;border:none}}@media screen and (max-width:35em){.result-videos img.thumbnail{float:none!important}.result-videos .content{overflow:inherit}}#search_submit{left:1px;right:auto} \ No newline at end of file
diff --git a/searx/static/themes/simple/css/searx.css b/searx/static/themes/simple/css/searx.css
index 55171c0af..697f46b0e 100644
--- a/searx/static/themes/simple/css/searx.css
+++ b/searx/static/themes/simple/css/searx.css
@@ -1,4 +1,4 @@
-/*! searx | 14-08-2018 | https://github.com/asciimoo/searx */
+/*! searx | 06-08-2019 | https://github.com/asciimoo/searx */
/*
* searx, A privacy-respecting, hackable metasearch engine
*
diff --git a/searx/static/themes/simple/css/searx.min.css b/searx/static/themes/simple/css/searx.min.css
index a0e68d032..5dc9fd30b 100644
--- a/searx/static/themes/simple/css/searx.min.css
+++ b/searx/static/themes/simple/css/searx.min.css
@@ -1 +1 @@
-/*! searx | 14-08-2018 | https://github.com/asciimoo/searx *//*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */button,hr,input{overflow:visible}[type=checkbox],[type=radio],legend{padding:0;box-sizing:border-box}.badge,.center{text-align:center}.badge,progress,sub,sup{vertical-align:baseline}.autocomplete>ul,.list-unstyled{list-style-type:none}.tabs>section,legend{box-sizing:border-box}#main_preferences h1 span,#main_stats h1 span,.index h1{visibility:hidden}#apis,#pagination,#pagination br,#sidebar .infobox .attributes,#sidebar .infobox .urls,#sidebar .infobox br,.result .break,footer{clear:both}html{line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}.highlight pre,textarea{overflow:auto}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{color:inherit;display:table;max-width:100%;white-space:normal}.badge,.search_box{white-space:nowrap}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.highlight .c,.highlight .cm,.highlight .ge,.highlight .sd{font-style:italic}.dialog-error:before,.dialog-modal:before,.dialog-warning:before,.ion-icon-big:before,.ion-icon:before{font-family:ion}details{display:block}summary{display:list-item}[hidden],html.js .show_if_nojs,html.no-js .hide_if_nojs,template{display:none}.highlight .hll{background-color:#ffc}.highlight .c{color:#408080}.highlight .err{border:1px solid red}.highlight .k{color:green;font-weight:700}.highlight .o{color:#666}.highlight .cm{color:#408080}.highlight .cp{color:#BC7A00}.highlight .c1,.highlight .cs{color:#408080;font-style:italic}.highlight .gd{color:#A00000}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00A000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04D}.highlight .kc,.highlight .kd,.highlight .kn{color:green;font-weight:700}.highlight .kp{color:green}.highlight .kr{color:green;font-weight:700}.highlight .kt{color:#B00040}.highlight .m{color:#666}.highlight .s{color:#BA2121}.highlight .na{color:#7D9029}.highlight .nb{color:green}.highlight .nc{color:#00F;font-weight:700}.highlight .no{color:#800}.highlight .nd{color:#A2F}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#00F}.highlight .nl{color:#A0A000}.highlight .nn{color:#00F;font-weight:700}.highlight .nt{color:green;font-weight:700}.highlight .nv{color:#19177C}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#bbb}.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:#666}.highlight .s2,.highlight .sb,.highlight .sc{color:#BA2121}.highlight .sd{color:#BA2121}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#BA2121}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:green}.highlight .sr{color:#B68}.highlight .s1{color:#BA2121}.highlight .ss{color:#19177C}.highlight .bp{color:green}.highlight .vc,.highlight .vg,.highlight .vi{color:#19177C}.highlight .il{color:#666}.badge,kbd{color:#fff}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.btn-collapse,.tabs>label,select:focus,select:hover{cursor:pointer}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0}.right{float:right}.left{float:left}.invisible{display:none!important}.list-unstyled li{margin-top:4px;margin-bottom:4px}.danger{background-color:#fae1e1}.badge{display:inline-block;background-color:#777;min-width:10px;padding:1px 5px;border-radius:5px}.dialog-error tr,.dialog-modal tr,.dialog-warning tr{vertical-align:text-top}kbd{padding:2px 4px;margin:1px;font-size:90%;background:#000}table{width:100%}table.striped tr{border-bottom:1px solid #ececec}th{padding:.4em}td{padding:0 4px}tr:hover{background:#ececec}div.selectable_url{border:1px solid #888;padding:4px;color:#444;width:100%;display:block;margin:.1em;overflow:hidden;height:1.2em;line-height:1.2em}div.selectable_url pre{display:block;font-size:.8em;word-break:break-all;margin:.1em;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:element;user-select:all}#categories,.tabs>label{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-touch-callout:none;-khtml-user-select:none}.dialog-error{position:relative;width:70%;padding:1em 1em 1em 2.7em;margin:0 8% 1em;border:1px solid #db3434;border-radius:4px;text-align:left;color:#db3434;background:#fae1e1}.dialog-error:before{position:absolute;top:.5em;left:.5em;font-size:1.5em;content:"\f110"}.dialog-error .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-error ol,.dialog-error p,.dialog-error ul{margin:1px 0 0}.dialog-error table{width:auto}.dialog-error tr:hover{background:0 0}.dialog-error td{padding:0 1em 0 0}.dialog-error h4{margin-top:.3em;margin-bottom:.3em}.dialog-warning{position:relative;width:70%;padding:1em 1em 1em 2.7em;margin:0 8% 1em;border:1px solid #dbba34;border-radius:4px;text-align:left;color:#dbba34;background:#faf5e1}.dialog-warning:before{position:absolute;top:.5em;left:.5em;font-size:1.5em;content:"\f10f"}.dialog-warning .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-warning ol,.dialog-warning p,.dialog-warning ul{margin:1px 0 0}.dialog-warning table{width:auto}.dialog-warning tr:hover{background:0 0}.dialog-warning td{padding:0 1em 0 0}.dialog-warning h4{margin-top:.3em;margin-bottom:.3em}.dialog-modal{width:70%;padding:1em 1em 1em 2.7em;border:1px solid #000;border-radius:4px;text-align:left;background:#fff;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:100000;margin:0 50% 0 0;box-shadow:0 0 1em}.dialog-modal:before{position:absolute;top:.5em;left:.5em;font-size:1.5em}.dialog-modal .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-modal ol,.dialog-modal p,.dialog-modal ul{margin:1px 0 0}.dialog-modal table{width:auto}.dialog-modal tr:hover{background:0 0}.dialog-modal td{padding:0 1em 0 0}.dialog-modal h4{margin-top:.3em;margin-bottom:.3em}.scrollx{overflow-x:auto;overflow-y:hidden;display:block;padding:0;margin:0;border:none}.tabs .tabs>label{font-size:90%}.tabs{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-wrap:wrap;width:100%;min-width:100%}.tabs>*{order:2}.tabs>input[type=radio]{display:none}.tabs>label{order:1;padding:.7em;margin:0 .7em;letter-spacing:.5px;text-transform:uppercase;border:solid #fff;border-width:0 0 2px;user-select:none}.tabs>label:hover,.tabs>label:last-of-type{border-bottom:2px solid #084999}.tabs>section{min-width:100%;padding:.7rem 0;border-top:1px solid #000;display:none}.tabs>label:last-of-type{background:#3498DB;color:#FFF;font-weight:700;letter-spacing:-.1px}.tabs>section:last-of-type{display:block}html body .tabs>input:checked~section{display:none}html body .tabs>input:checked~label{position:inherited;background:inherit;border-bottom:2px solid transparent;font-weight:400;color:inherit}html body .tabs>input:checked~label:hover{border-bottom:2px solid #084999}html body .tabs>input:checked+label{border-bottom:2px solid #084999;background:#3498DB;color:#FFF;font-weight:700;letter-spacing:-.1px}html body .tabs>input:checked+label+section{display:block}select{height:28px;margin:0 1em 0 0;padding:2px 8px 2px 0!important;color:#222;font-size:12px;z-index:2}@supports ((background-position-x:100%) and ((appearance:none) or (-webkit-appearance:none) or (-moz-appearance:none))){select{appearance:none;-webkit-appearance:none;-moz-appearance:none;border:none;border-bottom:1px solid #d7d7d7;background:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSI1MTJweCIgaGVpZ2h0PSI1MTJweCIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxMiA1MTIiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxnPjxwb2x5Z29uIHBvaW50cz0iMTI4LDE5MiAyNTYsMzIwIDM4NCwxOTIiLz48L2c+PC9zdmc+Cg==) no-repeat;background-position-x:105%;background-size:2em;background-origin:content-box;outline:0}select:focus,select:hover{border-bottom:1px solid #3498DB}}@supports (border-radius:50px){.checkbox-onoff{display:inline-block;width:40px;height:10px;background:#dcdcdc;margin:8px auto;position:relative;border-radius:50px}.checkbox-onoff label{display:block;width:20px;height:20px;position:absolute;top:-5px;cursor:pointer;border-radius:50px;box-shadow:0 3px 5px 0 rgba(0,0,0,.3);transition:all .4s ease;left:27px;background-color:#3498DB}.checkbox-onoff input[type=checkbox]{visibility:hidden}.checkbox-onoff input[type=checkbox]:checked+label{left:-5px;background:#dcdcdc}}@supports (transform:rotate(-45deg)){.checkbox{width:20px;position:relative;margin:20px auto}.checkbox label{width:20px;height:20px;cursor:pointer;position:absolute;top:0;left:0;background:#fff;border-radius:4px;box-shadow:inset 0 1px 1px #fff,0 1px 4px rgba(0,0,0,.5)}.checkbox label:after{content:'';width:9px;height:5px;position:absolute;top:4px;left:4px;border:3px solid #333;border-top:none;border-right:none;background:0 0;opacity:0;transform:rotate(-45deg)}.checkbox input[type=checkbox]{visibility:hidden}.checkbox input[type=checkbox]:checked+label:after{border-color:#3498DB;opacity:1}.checkbox input[disabled]+label{background-color:transparent!important;box-shadow:none!important;cursor:inherit}.checkbox input:not(:checked):not([readonly]):not([disabled])+label:hover::after{opacity:.5}}@media screen and (max-width:50em){.tabs>label{width:100%}}.loader,.loader:after{border-radius:50%;width:2em;height:2em}.loader{margin:1em auto;font-size:10px;position:relative;text-indent:-9999em;border-top:.5em solid rgba(0,0,0,.2);border-right:.5em solid rgba(0,0,0,.2);border-bottom:.5em solid rgba(0,0,0,.2);border-left:.5em solid rgba(255,255,255,0);-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);-webkit-animation:load8 1.2s infinite linear;animation:load8 1.2s infinite linear}@-webkit-keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}/*! Autocomplete.js v2.6.3 | license MIT | (c) 2017, Baptiste Donaux | http://autocomplete-js.com */.autocomplete{position:absolute;max-height:0;overflow-y:hidden;text-align:left}#categories_container,.category{position:relative}.autocomplete:active,.autocomplete:focus,.autocomplete:hover{background-color:#fff}#send_search:hover,.autocomplete>ul>li.active,.autocomplete>ul>li:active,.autocomplete>ul>li:focus{background-color:#3498DB}.autocomplete:empty{display:none}.autocomplete>ul{margin:0;padding:0}.autocomplete>ul>li{cursor:pointer;padding:5px 0 5px 10px}.autocomplete>ul>li.active a:active,.autocomplete>ul>li.active a:focus,.autocomplete>ul>li.active a:hover,.autocomplete>ul>li:active a:active,.autocomplete>ul>li:active a:focus,.autocomplete>ul>li:active a:hover,.autocomplete>ul>li:focus a:active,.autocomplete>ul>li:focus a:focus,.autocomplete>ul>li:focus a:hover{text-decoration:none}.autocomplete>ul>li.locked{cursor:inherit}.autocomplete.open{display:block;background-color:#fff;border:1px solid #3498DB;max-height:500px;overflow-y:auto;z-index:100}.autocomplete.open:empty{display:none}.ion-icon,.ion-icon-big{display:inline-block;line-height:1;font-weight:400;font-style:normal;speak:none;text-decoration:inherit;text-transform:none;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:middle}@media screen and (max-width:50em){.autocomplete{bottom:0}.autocomplete>ul>li{padding:7px 0 7px 10px;border-bottom:1px solid #E8E7E6;text-align:left}}#main_preferences table td,.index{text-align:center}@font-face{font-family:ion;src:url(../fonts/ion.eot?ce7a0ead692560b4405a96d5b8471f51);src:url(../fonts/ion.eot?#iefix) format("embedded-opentype"),url(../fonts/ion.woff2?ce7a0ead692560b4405a96d5b8471f51) format("woff2"),url(../fonts/ion.woff?ce7a0ead692560b4405a96d5b8471f51) format("woff"),url(../fonts/ion.ttf?ce7a0ead692560b4405a96d5b8471f51) format("truetype"),url(../fonts/ion.svg?ce7a0ead692560b4405a96d5b8471f51#ion) format("svg");font-weight:400;font-style:normal}.ion-navicon-round:before{content:"\f101"}.ion-search:before{content:"\f102"}.ion-play:before{content:"\f103"}.ion-link:before{content:"\f104"}.ion-chevron-up:before{content:"\f105"}.ion-chevron-left:before{content:"\f106"}.ion-chevron-right:before{content:"\f107"}.ion-arrow-down-a:before{content:"\f108"}.ion-arrow-up-a:before{content:"\f109"}.ion-arrow-swap:before{content:"\f10a"}.ion-arrow-dropdown:before{content:"\f10b"}.ion-globe:before{content:"\f10c"}.ion-time:before{content:"\f10d"}.ion-location:before{content:"\f10e"}.ion-warning:before{content:"\f10f"}.ion-error:before{content:"\f110"}.ion-film-outline:before{content:"\f111"}.ion-music-note:before{content:"\f112"}.ion-more-vertical:before{content:"\f113"}.ion-magnet:before{content:"\f114"}.ion-close:before{content:"\f115"}.ion-icon-big{font-size:149%}.index .title{background:url(../img/searx.png) center no-repeat;width:100%;min-height:80px}.index h1{font-size:5em}.index #search{margin:0 auto;background:inherit;border:inherit}.index .search_filters{display:block;margin:1em 0}.index .category label{padding:6px 10px;border-bottom:initial!important}@media screen and (max-width:75em){div.title h1{font-size:1em}.preferences_back{clear:both}}#main_preferences form{width:100%}#main_preferences fieldset{margin:8px;border:none}#main_preferences legend{margin:0;padding:5px 0 0;display:block;float:left;width:300px}#main_preferences .value{margin:0;padding:0;float:left;width:15em}#main_preferences .description{margin:0;padding:5px 0 0;float:left;width:50%;color:#909090;font-size:90%}#main_preferences select{width:200px;font-size:inherit!important}#main_preferences table{border-collapse:collapse}#main_preferences table.cookies{width:auto}#main_preferences div.selectable_url pre,footer,main{width:100%}#main_preferences table.cookies td,#main_preferences table.cookies th{text-align:left;padding:.25em}#main_preferences table.cookies td:first-child,#main_preferences table.cookies th:first-child{padding-right:4em}#main_preferences table.cookies>tbody>tr:nth-child(even)>td,#main_preferences table.cookies>tbody>tr:nth-child(even)>th{background-color:#ececec}#main_preferences .name,#main_preferences .shortcut{text-align:left}#main_preferences .preferences_back{background:#3498DB;color:#fff;border:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;cursor:pointer;display:inline-block;margin:2px 4px;padding:.5em}#main_preferences .preferences_back a{display:block;color:#FFF}#main_preferences .preferences_back a::first-letter{text-transform:uppercase}#search{padding:0 2em;margin:0;background:#f7f7f7;border-bottom:1px solid #d7d7d7}#search_wrapper{padding:10px 0}.search_box{margin:0 12px 0 0;display:inline-flex;flex-direction:row}#clear_search,#q,#send_search{border-collapse:separate;box-sizing:border-box;margin:0;padding:2px;height:2.2em;background:#FFF;color:#222;font-size:16px;outline:0}#clear_search{display:block;width:1.8em;border-top:1px solid #3498DB;border-bottom:1px solid #3498DB;border-right:none;border-left:none;border-radius:0;z-index:10000}#clear_search:hover{color:#3498DB}#clear_search.empty *{display:none}#q::-ms-clear,#q::-webkit-search-cancel-button{display:none}#q,#send_search{display:block!important;border:1px solid #3498DB;border-radius:0;z-index:2}#q{outline:0;padding-left:8px;padding-right:0!important;border-right:none;width:40em}#send_search{border-left:none;width:2.2em}#send_search:hover{cursor:pointer;color:#ECF0F1}.no-js #send_search{width:auto!important}.search_filters{display:inline-block;vertical-align:middle}@media screen and (max-width:75em){#categories{font-size:90%;clear:both}#categories .checkbox_container{margin:auto}html.touch #main_index #categories_container,html.touch #main_results #categories_container{width:1000px;width:-moz-max-content;width:-webkit-max-content;width:max-content}html.touch #main_index #categories_container .category,html.touch #main_results #categories_container .category{display:inline-block;width:auto}html.touch #main_index #categories,html.touch #main_results #categories{width:100%;margin:0;text-align:left;overflow-x:scroll;overflow-y:hidden;-webkit-overflow-scrolling:touch}}@media screen and (max-width:50em){#search{width:100%;margin:0;padding:.1em 0 0}#search_wrapper{width:100%;margin:0 0 .7em;padding:0}.search_box{width:99%;margin:.1em;padding:0 .1em 0 0;display:flex;flex-direction:row}#q{width:auto!important;flex:1}.search_filters{display:block;margin:.5em}.language,.time_range{width:45%}.category{display:block;width:90%}.category label{border-bottom:0}}#categories{margin:0 10px 0 0;user-select:none}#categories::-webkit-scrollbar{width:0;height:0}.category{display:inline-block;margin:0 3px;padding:0}.category input{display:none}.category label{cursor:pointer;padding:4px 10px;margin:0;display:block;text-transform:capitalize;font-size:.9em;border-bottom:2px solid transparent;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body,html,main{padding:0;margin:0}.category input[type=checkbox]:focus+label{box-shadow:0 0 8px #3498DB}.category input[type=checkbox]:checked+label{background:#3498DB;color:#FFF;border-bottom:2px solid #084999}#categories_container .help{position:absolute;width:100%;bottom:-20px;overflow:hidden;opacity:0;transition:opacity 1s ease;font-size:.8em;text-position:center;background:#fff}footer p,html{font-size:.9em}#categories_container:hover .help{opacity:.8;transition:opacity 1s ease}html{font-family:arial,sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;color:#444}#main_about,#main_preferences,#main_stats{margin:3em;width:auto}footer{bottom:0;height:3em;margin:1em 0;padding:1em 0;text-align:center}#main_preferences h1,#main_stats h1{background:url(../img/searx.png) no-repeat;background-size:auto 75%;min-height:40px;margin:0 auto}#results button[type=submit],input[type=submit]{padding:.5rem;margin:2px 4px;display:inline-block;background:#3498DB;color:#FFF;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:0;cursor:pointer}a{text-decoration:none;color:#29314d}a:visited,a:visited .highlight{color:#684898}article[data-vim-selected]{background:#f7f7f7}article[data-vim-selected]::before{position:absolute;left:1em;padding:2px;content:">";font-weight:700;color:#3498DB}article.result-images[data-vim-selected]{background:#3498DB}article.result-images[data-vim-selected]::before{display:none;content:""}.result{margin:19px 0 18px;padding:0}.result h3{font-size:1.1em;word-wrap:break-word;margin:5px 0 0;padding:0}.result h3 a{color:#084999;font-weight:400;font-size:1.1em}.result h3 a:visited{color:#684898}.result h3 a:focus,.result h3 a:hover{text-decoration:underline;border:none;-webkit-box-shadow:none;box-shadow:none;outline:0}.result .cache_link,.result .proxyfied_link{font-size:.9em!important}.result .altlink,.result .content,.result .stat,.result .url{font-size:.9em;padding:0;max-width:54em;word-wrap:break-word}.result .altlink,.result .content,.result .stat{margin:0;line-height:1.24}.result .altlink .highlight,.result .content .highlight,.result .stat .highlight{color:#000;background:inherit;font-weight:700}.result .codelines .highlight{color:inherit;background:inherit;font-weight:400}.result .url{margin:0 0 3px;color:#25a55b}.result .published_date{font-size:.8em;color:#888}.result img.thumbnail{float:left;padding:0 5px 10px 0;width:20em;min-width:20em;min-height:8em}.result img.image{float:left;padding:0 5px 10px 0;width:100px;max-height:100px;object-fit:scale-down;object-position:right top}.category-social .image{width:auto!important;min-width:48px;min-height:48px;padding:0 5px 25px 0!important}.result-videos .content{overflow:hidden}.engines{float:right;color:#888}.engines span{font-size:smaller;margin:0 .5em 0 0}.result-images,.result-images img{margin:0;padding:0;max-height:200px}.small_font{font-size:.8em}.highlight{color:#094089;background:inherit;font-weight:700}.result-images{display:inline-block;position:relative}.result-images img{float:inherit;border:none;background:#084999}.result-images span a{display:none;color:#FFF}.result-images:hover span a{display:block;position:absolute;bottom:0;right:0;padding:4px;margin:0 0 4px 4px;background-color:rgba(0,0,0,.6);font-size:.7em}.torrent_result{border-left:10px solid #d3d3d3;padding-left:3px}#answers,#backToTop,#sidebar .infobox{border:1px solid #ddd;box-shadow:0 0 5px #CCC}.torrent_result p{margin:3px;font-size:.8em}.torrent_result a{color:#084999}.torrent_result a:hover{text-decoration:underline}.torrent_result a:visited{color:#684898}#results{margin:2em 2em 20px;padding:0;width:50em}#suggestions .wrapper{display:flex;flex-flow:row wrap;justify-content:flex-end}#suggestions .wrapper form{display:inline-block;flex:1 1 50%}#answers,#corrections,#suggestions{max-width:50em}#answers input,#corrections input,#infoboxes input,#suggestions input{padding:0;margin:3px;font-size:.9em;display:inline-block;background:0 0;color:#444;cursor:pointer}#answers .infobox .url a,#answers input[type=submit],#corrections .infobox .url a,#corrections input[type=submit],#infoboxes .infobox .url a,#infoboxes input[type=submit],#suggestions .infobox .url a,#suggestions input[type=submit]{color:#084999;text-decoration:none;font-size:.9rem}#answers .infobox .url a:hover,#answers input[type=submit]:hover,#corrections .infobox .url a:hover,#corrections input[type=submit]:hover,#infoboxes .infobox .url a:hover,#infoboxes input[type=submit]:hover,#suggestions .infobox .url a:hover,#suggestions input[type=submit]:hover{text-decoration:underline}#corrections{display:flex;flex-flow:row wrap;margin:1em 0}#corrections h4,#corrections input[type=submit]{display:inline-block;margin:0 .5em 0 0}#corrections input[type=submit]::after{content:", "}#apis .title,#search_url .title,#suggestions .title{margin:2em 0 .5em;color:#444}#answers{margin:10px 8px;padding:.9em}#answers h4{display:none}#answers .answer{display:block;font-size:1.2em;font-weight:700}#answers form,#infoboxes form{min-width:210px}#sidebar{position:absolute;top:100px;left:57em;margin:0 2px 5px 5px;padding:0 2px 2px;max-width:25em;word-wrap:break-word}#sidebar .infobox{margin:10px 0;padding:.9em;font-size:.9em}#sidebar .infobox h2{margin:0 0 .5em}#sidebar .infobox img{max-width:100%;max-height:12em;display:block;margin:0;padding:0}#sidebar .infobox dl{margin:.5em 0}#sidebar .infobox dt{display:inline;margin:.5em .25em .5em 0;padding:0;font-weight:700}#sidebar .infobox dd{display:inline;margin:.5em 0;padding:0}#apis,#search_url{margin-top:8px}#sidebar .infobox input{font-size:1em}#search_url div.selectable_url pre{width:200em}#linkto_preferences{position:absolute;right:10px;top:.9em;padding:0;border:0;display:block;font-size:1.2em;color:#222}#linkto_preferences a:active *,#linkto_preferences a:hover *,#linkto_preferences a:link *,#linkto_preferences a:visited *{color:#222}#backToTop{margin:0 0 0 2em;padding:0;font-size:1em;background:#fff;position:fixed;bottom:85px;left:50em;transition:opacity .5s;opacity:0}#backToTop a{display:block;margin:0;padding:.6em}@media screen and (max-width:75em){#main_about,#main_preferences,#main_stats{margin:.5em;width:auto}#answers,#suggestions{margin-top:1em}#infoboxes{position:inherit;max-width:inherit}#infoboxes .infobox{clear:both}#infoboxes .infobox img{float:left;max-width:10em;margin:.5em .5em .5em 0}#sidebar{position:static;max-width:50em;margin:0 0 2px;padding:0;float:none;border:none;width:auto}.image_result,.image_result img,.result .thumbnail{max-width:98%}#sidebar input{border:0}#apis,#search_url{display:none}.result{border-bottom:1px solid #E8E7E6;margin:0;padding-top:8px;padding-bottom:6px}.result h3{margin:0 0 1px}.result .url span.url{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:100%}.result .url a{float:right;padding:0 .5em}.result .engines{float:right;padding:0 0 3px}.result-images{border-bottom:none!important}}#main_results div#results.only_template_images{flex-direction:column;width:auto;display:flex}#main_results div#results.only_template_images #sidebar{position:relative;top:auto;order:2}#main_results div#results.only_template_images #urls{position:relative;order:1}#main_results div#results.only_template_images #backToTop{right:.5em;left:auto}#main_results div#results.only_template_images #pagination{position:relative;order:3}@media screen and (max-width:50em){article[data-vim-selected]::before{display:none;content:""}#linkto_preferences{display:none;postion:fixed!important;top:100px;right:0}#sidebar{margin:0 5px 2px}#corrections{margin:1em 5px}#results{margin:0;padding:0;width:initial}#backToTop{left:40em;bottom:35px}.result{padding:8px 10px 6px}.result-images{margin:0;padding:0;border:none}}@media screen and (max-width:35em){.result-videos img.thumbnail{float:none!important}.result-videos .content{overflow:inherit}} \ No newline at end of file
+/*! searx | 06-08-2019 | https://github.com/asciimoo/searx *//*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */button,hr,input{overflow:visible}[type=checkbox],[type=radio],legend{padding:0;box-sizing:border-box}.badge,.center{text-align:center}.badge,progress,sub,sup{vertical-align:baseline}.autocomplete>ul,.list-unstyled{list-style-type:none}.tabs>section,legend{box-sizing:border-box}#main_preferences h1 span,#main_stats h1 span,.index h1{visibility:hidden}#apis,#pagination,#pagination br,#sidebar .infobox .attributes,#sidebar .infobox .urls,#sidebar .infobox br,.result .break,footer{clear:both}html{line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}.highlight pre,textarea{overflow:auto}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{color:inherit;display:table;max-width:100%;white-space:normal}.badge,.search_box{white-space:nowrap}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.highlight .c,.highlight .cm,.highlight .ge,.highlight .sd{font-style:italic}.dialog-error:before,.dialog-modal:before,.dialog-warning:before,.ion-icon-big:before,.ion-icon:before{font-family:ion}details{display:block}summary{display:list-item}[hidden],html.js .show_if_nojs,html.no-js .hide_if_nojs,template{display:none}.highlight .hll{background-color:#ffc}.highlight .c{color:#408080}.highlight .err{border:1px solid red}.highlight .k{color:green;font-weight:700}.highlight .o{color:#666}.highlight .cm{color:#408080}.highlight .cp{color:#BC7A00}.highlight .c1,.highlight .cs{color:#408080;font-style:italic}.highlight .gd{color:#A00000}.highlight .gr{color:red}.highlight .gh{color:navy;font-weight:700}.highlight .gi{color:#00A000}.highlight .go{color:#888}.highlight .gp{color:navy;font-weight:700}.highlight .gs{font-weight:700}.highlight .gu{color:purple;font-weight:700}.highlight .gt{color:#04D}.highlight .kc,.highlight .kd,.highlight .kn{color:green;font-weight:700}.highlight .kp{color:green}.highlight .kr{color:green;font-weight:700}.highlight .kt{color:#B00040}.highlight .m{color:#666}.highlight .s{color:#BA2121}.highlight .na{color:#7D9029}.highlight .nb{color:green}.highlight .nc{color:#00F;font-weight:700}.highlight .no{color:#800}.highlight .nd{color:#A2F}.highlight .ni{color:#999;font-weight:700}.highlight .ne{color:#D2413A;font-weight:700}.highlight .nf{color:#00F}.highlight .nl{color:#A0A000}.highlight .nn{color:#00F;font-weight:700}.highlight .nt{color:green;font-weight:700}.highlight .nv{color:#19177C}.highlight .ow{color:#A2F;font-weight:700}.highlight .w{color:#bbb}.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:#666}.highlight .s2,.highlight .sb,.highlight .sc{color:#BA2121}.highlight .sd{color:#BA2121}.highlight .se{color:#B62;font-weight:700}.highlight .sh{color:#BA2121}.highlight .si{color:#B68;font-weight:700}.highlight .sx{color:green}.highlight .sr{color:#B68}.highlight .s1{color:#BA2121}.highlight .ss{color:#19177C}.highlight .bp{color:green}.highlight .vc,.highlight .vg,.highlight .vi{color:#19177C}.highlight .il{color:#666}.badge,kbd{color:#fff}.highlight .lineno{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.btn-collapse,.tabs>label,select:focus,select:hover{cursor:pointer}.highlight .lineno::selection{background:0 0}.highlight .lineno::-moz-selection{background:0 0}.right{float:right}.left{float:left}.invisible{display:none!important}.list-unstyled li{margin-top:4px;margin-bottom:4px}.danger{background-color:#fae1e1}.badge{display:inline-block;background-color:#777;min-width:10px;padding:1px 5px;border-radius:5px}.dialog-error tr,.dialog-modal tr,.dialog-warning tr{vertical-align:text-top}kbd{padding:2px 4px;margin:1px;font-size:90%;background:#000}table{width:100%}table.striped tr{border-bottom:1px solid #ececec}th{padding:.4em}td{padding:0 4px}tr:hover{background:#ececec}div.selectable_url{border:1px solid #888;padding:4px;color:#444;width:100%;display:block;margin:.1em;overflow:hidden;height:1.2em;line-height:1.2em}div.selectable_url pre{display:block;font-size:.8em;word-break:break-all;margin:.1em;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:element;user-select:all}#categories,.tabs>label{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-touch-callout:none;-khtml-user-select:none}.dialog-error{position:relative;width:70%;padding:1em 1em 1em 2.7em;margin:0 8% 1em;border:1px solid #db3434;border-radius:4px;text-align:left;color:#db3434;background:#fae1e1}.dialog-error:before{position:absolute;top:.5em;left:.5em;font-size:1.5em;content:"\f110"}.dialog-error .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-error ol,.dialog-error p,.dialog-error ul{margin:1px 0 0}.dialog-error table{width:auto}.dialog-error tr:hover{background:0 0}.dialog-error td{padding:0 1em 0 0}.dialog-error h4{margin-top:.3em;margin-bottom:.3em}.dialog-warning{position:relative;width:70%;padding:1em 1em 1em 2.7em;margin:0 8% 1em;border:1px solid #dbba34;border-radius:4px;text-align:left;color:#dbba34;background:#faf5e1}.dialog-warning:before{position:absolute;top:.5em;left:.5em;font-size:1.5em;content:"\f10f"}.dialog-warning .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-warning ol,.dialog-warning p,.dialog-warning ul{margin:1px 0 0}.dialog-warning table{width:auto}.dialog-warning tr:hover{background:0 0}.dialog-warning td{padding:0 1em 0 0}.dialog-warning h4{margin-top:.3em;margin-bottom:.3em}.dialog-modal{width:70%;padding:1em 1em 1em 2.7em;border:1px solid #000;border-radius:4px;text-align:left;background:#fff;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:100000;margin:0 50% 0 0;box-shadow:0 0 1em}.dialog-modal:before{position:absolute;top:.5em;left:.5em;font-size:1.5em}.dialog-modal .close{float:right;position:relative;top:-3px;color:inherit;font-size:1.5em}.dialog-modal ol,.dialog-modal p,.dialog-modal ul{margin:1px 0 0}.dialog-modal table{width:auto}.dialog-modal tr:hover{background:0 0}.dialog-modal td{padding:0 1em 0 0}.dialog-modal h4{margin-top:.3em;margin-bottom:.3em}.scrollx{overflow-x:auto;overflow-y:hidden;display:block;padding:0;margin:0;border:none}.tabs .tabs>label{font-size:90%}.tabs{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-wrap:wrap;width:100%;min-width:100%}.tabs>*{order:2}.tabs>input[type=radio]{display:none}.tabs>label{order:1;padding:.7em;margin:0 .7em;letter-spacing:.5px;text-transform:uppercase;border:solid #fff;border-width:0 0 2px;user-select:none}.tabs>label:hover,.tabs>label:last-of-type{border-bottom:2px solid #084999}.tabs>section{min-width:100%;padding:.7rem 0;border-top:1px solid #000;display:none}.tabs>label:last-of-type{background:#3498DB;color:#FFF;font-weight:700;letter-spacing:-.1px}.tabs>section:last-of-type{display:block}html body .tabs>input:checked~section{display:none}html body .tabs>input:checked~label{position:inherited;background:inherit;border-bottom:2px solid transparent;font-weight:400;color:inherit}html body .tabs>input:checked~label:hover{border-bottom:2px solid #084999}html body .tabs>input:checked+label{border-bottom:2px solid #084999;background:#3498DB;color:#FFF;font-weight:700;letter-spacing:-.1px}html body .tabs>input:checked+label+section{display:block}select{height:28px;margin:0 1em 0 0;padding:2px 8px 2px 0!important;color:#222;font-size:12px;z-index:2}@supports ((background-position-x:100%) and ((appearance:none) or (-webkit-appearance:none) or (-moz-appearance:none))){select{appearance:none;-webkit-appearance:none;-moz-appearance:none;border:none;border-bottom:1px solid #d7d7d7;background:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSI1MTJweCIgaGVpZ2h0PSI1MTJweCIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUxMiA1MTIiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxnPjxwb2x5Z29uIHBvaW50cz0iMTI4LDE5MiAyNTYsMzIwIDM4NCwxOTIiLz48L2c+PC9zdmc+Cg==) no-repeat;background-position-x:105%;background-size:2em;background-origin:content-box;outline:0}select:focus,select:hover{border-bottom:1px solid #3498DB}}@supports (border-radius:50px){.checkbox-onoff{display:inline-block;width:40px;height:10px;background:#dcdcdc;margin:8px auto;position:relative;border-radius:50px}.checkbox-onoff label{display:block;width:20px;height:20px;position:absolute;top:-5px;cursor:pointer;border-radius:50px;box-shadow:0 3px 5px 0 rgba(0,0,0,.3);transition:all .4s ease;left:27px;background-color:#3498DB}.checkbox-onoff input[type=checkbox]{visibility:hidden}.checkbox-onoff input[type=checkbox]:checked+label{left:-5px;background:#dcdcdc}}@supports (transform:rotate(-45deg)){.checkbox{width:20px;position:relative;margin:20px auto}.checkbox label{width:20px;height:20px;cursor:pointer;position:absolute;top:0;left:0;background:#fff;border-radius:4px;box-shadow:inset 0 1px 1px #fff,0 1px 4px rgba(0,0,0,.5)}.checkbox label:after{content:'';width:9px;height:5px;position:absolute;top:4px;left:4px;border:3px solid #333;border-top:none;border-right:none;background:0 0;opacity:0;transform:rotate(-45deg)}.checkbox input[type=checkbox]{visibility:hidden}.checkbox input[type=checkbox]:checked+label:after{border-color:#3498DB;opacity:1}.checkbox input[disabled]+label{background-color:transparent!important;box-shadow:none!important;cursor:inherit}.checkbox input:not(:checked):not([readonly]):not([disabled])+label:hover::after{opacity:.5}}@media screen and (max-width:50em){.tabs>label{width:100%}}.loader,.loader:after{border-radius:50%;width:2em;height:2em}.loader{margin:1em auto;font-size:10px;position:relative;text-indent:-9999em;border-top:.5em solid rgba(0,0,0,.2);border-right:.5em solid rgba(0,0,0,.2);border-bottom:.5em solid rgba(0,0,0,.2);border-left:.5em solid rgba(255,255,255,0);-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);-webkit-animation:load8 1.2s infinite linear;animation:load8 1.2s infinite linear}@-webkit-keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}/*! Autocomplete.js v2.6.3 | license MIT | (c) 2017, Baptiste Donaux | http://autocomplete-js.com */.autocomplete{position:absolute;max-height:0;overflow-y:hidden;text-align:left}#categories_container,.category{position:relative}.autocomplete:active,.autocomplete:focus,.autocomplete:hover{background-color:#fff}#send_search:hover,.autocomplete>ul>li.active,.autocomplete>ul>li:active,.autocomplete>ul>li:focus{background-color:#3498DB}.autocomplete:empty{display:none}.autocomplete>ul{margin:0;padding:0}.autocomplete>ul>li{cursor:pointer;padding:5px 0 5px 10px}.autocomplete>ul>li.active a:active,.autocomplete>ul>li.active a:focus,.autocomplete>ul>li.active a:hover,.autocomplete>ul>li:active a:active,.autocomplete>ul>li:active a:focus,.autocomplete>ul>li:active a:hover,.autocomplete>ul>li:focus a:active,.autocomplete>ul>li:focus a:focus,.autocomplete>ul>li:focus a:hover{text-decoration:none}.autocomplete>ul>li.locked{cursor:inherit}.autocomplete.open{display:block;background-color:#fff;border:1px solid #3498DB;max-height:500px;overflow-y:auto;z-index:100}.autocomplete.open:empty{display:none}.ion-icon,.ion-icon-big{display:inline-block;line-height:1;font-weight:400;font-style:normal;speak:none;text-decoration:inherit;text-transform:none;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:middle}@media screen and (max-width:50em){.autocomplete{bottom:0}.autocomplete>ul>li{padding:7px 0 7px 10px;border-bottom:1px solid #E8E7E6;text-align:left}}#main_preferences table td,.index{text-align:center}@font-face{font-family:ion;src:url(../fonts/ion.eot?ce7a0ead692560b4405a96d5b8471f51);src:url(../fonts/ion.eot?#iefix) format("embedded-opentype"),url(../fonts/ion.woff2?ce7a0ead692560b4405a96d5b8471f51) format("woff2"),url(../fonts/ion.woff?ce7a0ead692560b4405a96d5b8471f51) format("woff"),url(../fonts/ion.ttf?ce7a0ead692560b4405a96d5b8471f51) format("truetype"),url(../fonts/ion.svg?ce7a0ead692560b4405a96d5b8471f51#ion) format("svg");font-weight:400;font-style:normal}.ion-navicon-round:before{content:"\f101"}.ion-search:before{content:"\f102"}.ion-play:before{content:"\f103"}.ion-link:before{content:"\f104"}.ion-chevron-up:before{content:"\f105"}.ion-chevron-left:before{content:"\f106"}.ion-chevron-right:before{content:"\f107"}.ion-arrow-down-a:before{content:"\f108"}.ion-arrow-up-a:before{content:"\f109"}.ion-arrow-swap:before{content:"\f10a"}.ion-arrow-dropdown:before{content:"\f10b"}.ion-globe:before{content:"\f10c"}.ion-time:before{content:"\f10d"}.ion-location:before{content:"\f10e"}.ion-warning:before{content:"\f10f"}.ion-error:before{content:"\f110"}.ion-film-outline:before{content:"\f111"}.ion-music-note:before{content:"\f112"}.ion-more-vertical:before{content:"\f113"}.ion-magnet:before{content:"\f114"}.ion-close:before{content:"\f115"}.ion-icon-big{font-size:149%}.index .title{background:url(../img/searx.png) center no-repeat;width:100%;min-height:80px}.index h1{font-size:5em}.index #search{margin:0 auto;background:inherit;border:inherit}.index .search_filters{display:block;margin:1em 0}.index .category label{padding:6px 10px;border-bottom:initial!important}@media screen and (max-width:75em){div.title h1{font-size:1em}.preferences_back{clear:both}}#main_preferences form{width:100%}#main_preferences fieldset{margin:8px;border:none}#main_preferences legend{margin:0;padding:5px 0 0;display:block;float:left;width:300px}#main_preferences .value{margin:0;padding:0;float:left;width:15em}#main_preferences .description{margin:0;padding:5px 0 0;float:left;width:50%;color:#909090;font-size:90%}#main_preferences select{width:200px;font-size:inherit!important}#main_preferences table{border-collapse:collapse}#main_preferences table.cookies{width:auto}#main_preferences div.selectable_url pre,footer,main{width:100%}#main_preferences table.cookies td,#main_preferences table.cookies th{text-align:left;padding:.25em}#main_preferences table.cookies td:first-child,#main_preferences table.cookies th:first-child{padding-right:4em}#main_preferences table.cookies>tbody>tr:nth-child(even)>td,#main_preferences table.cookies>tbody>tr:nth-child(even)>th{background-color:#ececec}#main_preferences .name,#main_preferences .shortcut{text-align:left}#main_preferences .preferences_back{background:#3498DB;color:#fff;border:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;cursor:pointer;display:inline-block;margin:2px 4px;padding:.5em}#main_preferences .preferences_back a{display:block;color:#FFF}#main_preferences .preferences_back a::first-letter{text-transform:uppercase}#search{padding:0 2em;margin:0;background:#f7f7f7;border-bottom:1px solid #d7d7d7}#search_wrapper{padding:10px 0}.search_box{margin:0 12px 0 0;display:inline-flex;flex-direction:row}#clear_search,#q,#send_search{border-collapse:separate;box-sizing:border-box;margin:0;padding:2px;height:2.2em;background:#FFF;color:#222;font-size:16px;outline:0}#clear_search{display:block;width:1.8em;border-top:1px solid #3498DB;border-bottom:1px solid #3498DB;border-right:none;border-left:none;border-radius:0;z-index:10000}#clear_search:hover{color:#3498DB}#clear_search.empty *{display:none}#q::-ms-clear,#q::-webkit-search-cancel-button{display:none}#q,#send_search{display:block!important;border:1px solid #3498DB;border-radius:0;z-index:2}#q{outline:0;padding-left:8px;padding-right:0!important;border-right:none;width:40em}#send_search{border-left:none;width:2.2em}#send_search:hover{cursor:pointer;color:#ECF0F1}.no-js #send_search{width:auto!important}.search_filters{display:inline-block;vertical-align:middle}@media screen and (max-width:75em){#categories{font-size:90%;clear:both}#categories .checkbox_container{margin:auto}html.touch #main_index #categories_container,html.touch #main_results #categories_container{width:1000px;width:-moz-max-content;width:-webkit-max-content;width:max-content}html.touch #main_index #categories_container .category,html.touch #main_results #categories_container .category{display:inline-block;width:auto}html.touch #main_index #categories,html.touch #main_results #categories{width:100%;margin:0;text-align:left;overflow-x:scroll;overflow-y:hidden;-webkit-overflow-scrolling:touch}}@media screen and (max-width:50em){#search{width:100%;margin:0;padding:.1em 0 0}#search_wrapper{width:100%;margin:0 0 .7em;padding:0}.search_box{width:99%;margin:.1em;padding:0 .1em 0 0;display:flex;flex-direction:row}#q{width:auto!important;flex:1}.search_filters{display:block;margin:.5em}.language,.time_range{width:45%}.category{display:block;width:90%}.category label{border-bottom:0}}#categories{margin:0 10px 0 0;user-select:none}#categories::-webkit-scrollbar{width:0;height:0}.category{display:inline-block;margin:0 3px;padding:0}.category input{display:none}.category label{cursor:pointer;padding:4px 10px;margin:0;display:block;text-transform:capitalize;font-size:.9em;border-bottom:2px solid transparent;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body,html,main{padding:0;margin:0}.category input[type=checkbox]:focus+label{box-shadow:0 0 8px #3498DB}.category input[type=checkbox]:checked+label{background:#3498DB;color:#FFF;border-bottom:2px solid #084999}#categories_container .help{position:absolute;width:100%;bottom:-20px;overflow:hidden;opacity:0;transition:opacity 1s ease;font-size:.8em;text-position:center;background:#fff}footer p,html{font-size:.9em}#categories_container:hover .help{opacity:.8;transition:opacity 1s ease}html{font-family:arial,sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;color:#444}#main_about,#main_preferences,#main_stats{margin:3em;width:auto}footer{bottom:0;height:3em;margin:1em 0;padding:1em 0;text-align:center}#main_preferences h1,#main_stats h1{background:url(../img/searx.png) no-repeat;background-size:auto 75%;min-height:40px;margin:0 auto}#results button[type=submit],input[type=submit]{padding:.5rem;margin:2px 4px;display:inline-block;background:#3498DB;color:#FFF;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:0;cursor:pointer}a{text-decoration:none;color:#29314d}a:visited,a:visited .highlight{color:#684898}article[data-vim-selected]{background:#f7f7f7}article[data-vim-selected]::before{position:absolute;left:1em;padding:2px;content:">";font-weight:700;color:#3498DB}article.result-images[data-vim-selected]{background:#3498DB}article.result-images[data-vim-selected]::before{display:none;content:""}.result{margin:19px 0 18px;padding:0}.result h3{font-size:1.1em;word-wrap:break-word;margin:5px 0 0;padding:0}.result h3 a{color:#084999;font-weight:400;font-size:1.1em}.result h3 a:visited{color:#684898}.result h3 a:focus,.result h3 a:hover{text-decoration:underline;border:none;-webkit-box-shadow:none;box-shadow:none;outline:0}.result .cache_link,.result .proxyfied_link{font-size:.9em!important}.result .altlink,.result .content,.result .stat,.result .url{font-size:.9em;padding:0;max-width:54em;word-wrap:break-word}.result .altlink,.result .content,.result .stat{margin:0;line-height:1.24}.result .altlink .highlight,.result .content .highlight,.result .stat .highlight{color:#000;background:inherit;font-weight:700}.result .codelines .highlight{color:inherit;background:inherit;font-weight:400}.result .url{margin:0 0 3px;color:#25a55b}.result .published_date{font-size:.8em;color:#888}.result img.thumbnail{float:left;padding:0 5px 10px 0;width:20em;min-width:20em;min-height:8em}.result img.image{float:left;padding:0 5px 10px 0;width:100px;max-height:100px;object-fit:scale-down;object-position:right top}.category-social .image{width:auto!important;min-width:48px;min-height:48px;padding:0 5px 25px 0!important}.result-videos .content{overflow:hidden}.engines{float:right;color:#888}.engines span{font-size:smaller;margin:0 .5em 0 0}.result-images,.result-images img{margin:0;padding:0;max-height:200px}.small_font{font-size:.8em}.highlight{color:#094089;background:inherit;font-weight:700}.result-images{display:inline-block;position:relative}.result-images img{float:inherit;border:none;background:#084999}.result-images span a{display:none;color:#FFF}.result-images:hover span a{display:block;position:absolute;bottom:0;right:0;padding:4px;margin:0 0 4px 4px;background-color:rgba(0,0,0,.6);font-size:.7em}.torrent_result{border-left:10px solid #d3d3d3;padding-left:3px}#answers,#backToTop,#sidebar .infobox{border:1px solid #ddd;box-shadow:0 0 5px #CCC}.torrent_result p{margin:3px;font-size:.8em}.torrent_result a{color:#084999}.torrent_result a:hover{text-decoration:underline}.torrent_result a:visited{color:#684898}#results{margin:2em 2em 20px;padding:0;width:50em}#suggestions .wrapper{display:flex;flex-flow:row wrap;justify-content:flex-end}#suggestions .wrapper form{display:inline-block;flex:1 1 50%}#answers,#corrections,#suggestions{max-width:50em}#answers input,#corrections input,#infoboxes input,#suggestions input{padding:0;margin:3px;font-size:.9em;display:inline-block;background:0 0;color:#444;cursor:pointer}#answers .infobox .url a,#answers input[type=submit],#corrections .infobox .url a,#corrections input[type=submit],#infoboxes .infobox .url a,#infoboxes input[type=submit],#suggestions .infobox .url a,#suggestions input[type=submit]{color:#084999;text-decoration:none;font-size:.9rem}#answers .infobox .url a:hover,#answers input[type=submit]:hover,#corrections .infobox .url a:hover,#corrections input[type=submit]:hover,#infoboxes .infobox .url a:hover,#infoboxes input[type=submit]:hover,#suggestions .infobox .url a:hover,#suggestions input[type=submit]:hover{text-decoration:underline}#corrections{display:flex;flex-flow:row wrap;margin:1em 0}#corrections h4,#corrections input[type=submit]{display:inline-block;margin:0 .5em 0 0}#corrections input[type=submit]::after{content:", "}#apis .title,#search_url .title,#suggestions .title{margin:2em 0 .5em;color:#444}#answers{margin:10px 8px;padding:.9em}#answers h4{display:none}#answers .answer{display:block;font-size:1.2em;font-weight:700}#answers form,#infoboxes form{min-width:210px}#sidebar{position:absolute;top:100px;left:57em;margin:0 2px 5px 5px;padding:0 2px 2px;max-width:25em;word-wrap:break-word}#sidebar .infobox{margin:10px 0;padding:.9em;font-size:.9em}#sidebar .infobox h2{margin:0 0 .5em}#sidebar .infobox img{max-width:100%;max-height:12em;display:block;margin:0;padding:0}#sidebar .infobox dl{margin:.5em 0}#sidebar .infobox dt{display:inline;margin:.5em .25em .5em 0;padding:0;font-weight:700}#sidebar .infobox dd{display:inline;margin:.5em 0;padding:0}#apis,#search_url{margin-top:8px}#sidebar .infobox input{font-size:1em}#search_url div.selectable_url pre{width:200em}#linkto_preferences{position:absolute;right:10px;top:.9em;padding:0;border:0;display:block;font-size:1.2em;color:#222}#linkto_preferences a:active *,#linkto_preferences a:hover *,#linkto_preferences a:link *,#linkto_preferences a:visited *{color:#222}#backToTop{margin:0 0 0 2em;padding:0;font-size:1em;background:#fff;position:fixed;bottom:85px;left:50em;transition:opacity .5s;opacity:0}#backToTop a{display:block;margin:0;padding:.6em}@media screen and (max-width:75em){#main_about,#main_preferences,#main_stats{margin:.5em;width:auto}#answers,#suggestions{margin-top:1em}#infoboxes{position:inherit;max-width:inherit}#infoboxes .infobox{clear:both}#infoboxes .infobox img{float:left;max-width:10em;margin:.5em .5em .5em 0}#sidebar{position:static;max-width:50em;margin:0 0 2px;padding:0;float:none;border:none;width:auto}.image_result,.image_result img,.result .thumbnail{max-width:98%}#sidebar input{border:0}#apis,#search_url{display:none}.result{border-bottom:1px solid #E8E7E6;margin:0;padding-top:8px;padding-bottom:6px}.result h3{margin:0 0 1px}.result .url span.url{display:block;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:100%}.result .url a{float:right;padding:0 .5em}.result .engines{float:right;padding:0 0 3px}.result-images{border-bottom:none!important}}#main_results div#results.only_template_images{flex-direction:column;width:auto;display:flex}#main_results div#results.only_template_images #sidebar{position:relative;top:auto;order:2}#main_results div#results.only_template_images #urls{position:relative;order:1}#main_results div#results.only_template_images #backToTop{right:.5em;left:auto}#main_results div#results.only_template_images #pagination{position:relative;order:3}@media screen and (max-width:50em){article[data-vim-selected]::before{display:none;content:""}#linkto_preferences{display:none;postion:fixed!important;top:100px;right:0}#sidebar{margin:0 5px 2px}#corrections{margin:1em 5px}#results{margin:0;padding:0;width:initial}#backToTop{left:40em;bottom:35px}.result{padding:8px 10px 6px}.result-images{margin:0;padding:0;border:none}}@media screen and (max-width:35em){.result-videos img.thumbnail{float:none!important}.result-videos .content{overflow:inherit}} \ No newline at end of file
diff --git a/searx/static/themes/simple/gruntfile.js b/searx/static/themes/simple/gruntfile.js
index a0f9fd75a..c372ec730 100644
--- a/searx/static/themes/simple/gruntfile.js
+++ b/searx/static/themes/simple/gruntfile.js
@@ -10,21 +10,36 @@ module.exports = function(grunt) {
tasks: ['jshint', 'concat', 'uglify', 'webfont', 'less:development', 'less:production']
}
},
- concat: {
+ jshint: {
+ files: ['js/searx_src/*.js', 'js/searx_header/*.js'],
options: {
- separator: ';'
- },
- dist: {
- src: ['js/searx_src/*.js'],
- dest: 'js/searx.js'
+ reporterOutput: "",
+ proto: true,
+ // options here to override JSHint defaults
+ globals: {
+ browser: true,
+ jQuery: false,
+ devel: true
+ }
+ }
+ },
+ concat: {
+ head_and_body: {
+ options: {
+ separator: ';'
+ },
+ files: {
+ 'js/searx.head.js': ['js/searx_head/*.js'],
+ 'js/searx.js': ['js/searx_src/*.js']
+ }
}
},
uglify: {
options: {
banner: '/*! simple/searx.min.js | <%= grunt.template.today("dd-mm-yyyy") %> | https://github.com/asciimoo/searx */\n',
- output: {
- comments: 'some'
- },
+ output: {
+ comments: 'some'
+ },
ie8: false,
warnings: true,
compress: false,
@@ -33,20 +48,8 @@ module.exports = function(grunt) {
},
dist: {
files: {
- 'js/searx.min.js': ['<%= concat.dist.dest %>']
- }
- }
- },
- jshint: {
- files: ['js/searx_src/*.js'],
- options: {
- reporterOutput: "",
- proto: true,
- // options here to override JSHint defaults
- globals: {
- browser: true,
- jQuery: false,
- devel: true
+ 'js/searx.head.min.js': ['js/searx.head.js'],
+ 'js/searx.min.js': ['js/searx.js']
}
}
},
diff --git a/searx/static/themes/simple/js/searx.head.js b/searx/static/themes/simple/js/searx.head.js
new file mode 100644
index 000000000..3ac61c8ae
--- /dev/null
+++ b/searx/static/themes/simple/js/searx.head.js
@@ -0,0 +1,40 @@
+/**
+* searx is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Affero General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* searx is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Affero General Public License for more details.
+*
+* You should have received a copy of the GNU Affero General Public License
+* along with searx. If not, see < http://www.gnu.org/licenses/ >.
+*
+* (C) 2019 by Alexandre Flament
+*
+*/
+(function(w, d) {
+ 'use strict';
+
+ // add data- properties
+ var script = d.currentScript || (function() {
+ var scripts = d.getElementsByTagName('script');
+ return scripts[scripts.length - 1];
+ })();
+
+ // try to detect touch screen
+ w.searx = {
+ touch: (("ontouchstart" in w) || w.DocumentTouch && document instanceof DocumentTouch) || false,
+ method: script.getAttribute('data-method'),
+ autocompleter: script.getAttribute('data-autocompleter') === 'true',
+ search_on_category_select: script.getAttribute('data-search-on-category-select') === 'true',
+ infinite_scroll: script.getAttribute('data-infinite-scroll') === 'true',
+ static_path: script.getAttribute('data-static-path'),
+ no_item_found: script.getAttribute('data-no-item-found')
+ }
+
+ // update the css
+ d.getElementsByTagName("html")[0].className = (w.searx.touch)?"js touch":"js";
+})(window, document); \ No newline at end of file
diff --git a/searx/static/themes/simple/js/searx.head.min.js b/searx/static/themes/simple/js/searx.head.min.js
new file mode 100644
index 000000000..00c711c79
--- /dev/null
+++ b/searx/static/themes/simple/js/searx.head.min.js
@@ -0,0 +1,4 @@
+/*! simple/searx.min.js | 06-08-2019 | https://github.com/asciimoo/searx */
+
+(function(t,e){"use strict";var a=e.currentScript||function(){var t=e.getElementsByTagName("script");return t[t.length-1]}();t.searx={touch:"ontouchstart"in t||t.DocumentTouch&&document instanceof DocumentTouch||false,method:a.getAttribute("data-method"),autocompleter:a.getAttribute("data-autocompleter")==="true",search_on_category_select:a.getAttribute("data-search-on-category-select")==="true",infinite_scroll:a.getAttribute("data-infinite-scroll")==="true",static_path:a.getAttribute("data-static-path"),no_item_found:a.getAttribute("data-no-item-found")};e.getElementsByTagName("html")[0].className=t.searx.touch?"js touch":"js"})(window,document);
+//# sourceMappingURL=searx.head.min.js.map \ No newline at end of file
diff --git a/searx/static/themes/simple/js/searx.head.min.js.map b/searx/static/themes/simple/js/searx.head.min.js.map
new file mode 100644
index 000000000..d19ad5a44
--- /dev/null
+++ b/searx/static/themes/simple/js/searx.head.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["searx.head.js"],"names":["w","d","script","currentScript","scripts","getElementsByTagName","length","searx","touch","DocumentTouch","document","method","getAttribute","autocompleter","search_on_category_select","infinite_scroll","static_path","no_item_found","className","window"],"mappings":";;CAiBA,SAAUA,EAAGC,GACT,aAGA,IAAIC,EAASD,EAAEE,eAAkB,WAC7B,IAAIC,EAAUH,EAAEI,qBAAqB,UACrC,OAAOD,EAAQA,EAAQE,OAAS,GAFH,GAMjCN,EAAEO,MAAQ,CACNC,MAAS,iBAAkBR,GAAMA,EAAES,eAAiBC,oBAAoBD,eAAkB,MAC1FE,OAAQT,EAAOU,aAAa,eAC5BC,cAAeX,EAAOU,aAAa,wBAA0B,OAC7DE,0BAA2BZ,EAAOU,aAAa,oCAAsC,OACrFG,gBAAiBb,EAAOU,aAAa,0BAA4B,OACjEI,YAAad,EAAOU,aAAa,oBACjCK,cAAef,EAAOU,aAAa,uBAIvCX,EAAEI,qBAAqB,QAAQ,GAAGa,UAAalB,EAAEO,MAAW,MAAE,WAAW,MArB7E,CAsBGY,OAAQT","file":"searx.head.min.js"} \ No newline at end of file
diff --git a/searx/static/themes/simple/js/searx.js b/searx/static/themes/simple/js/searx.js
index 1830977c0..e191f2487 100644
--- a/searx/static/themes/simple/js/searx.js
+++ b/searx/static/themes/simple/js/searx.js
@@ -15,7 +15,7 @@
* (C) 2017 by Alexandre Flament, <alex@al-f.net>
*
*/
-(function(w, d, searx) {
+window.searx = (function(w, d) {
'use strict';
@@ -45,7 +45,7 @@
}
}
- searx = searx || {};
+ var searx = window.searx || {};
searx.on = function(obj, eventType, callback, useCapture) {
useCapture = useCapture || false;
@@ -110,7 +110,7 @@
};
searx.loadStyle = function(src) {
- var path = searx.staticPath + src,
+ var path = searx.static_path + src,
id = "style_" + src.replace('.', '_'),
s = d.getElementById(id);
if (s === null) {
@@ -124,7 +124,7 @@
};
searx.loadScript = function(src, callback) {
- var path = searx.staticPath + src,
+ var path = searx.static_path + src,
id = "script_" + src.replace('.', '_'),
s = d.getElementById(id);
if (s === null) {
@@ -161,7 +161,7 @@
});
return searx;
-})(window, document, window.searx);
+})(window, document);
;(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.AutoComplete = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
/*
* @license MIT
@@ -1529,7 +1529,7 @@ module.exports = AutoComplete;
if (searx.autocompleter) {
searx.autocomplete = AutoComplete.call(w, {
Url: "./autocompleter",
- EmptyMessage: searx.noItemFound,
+ EmptyMessage: searx.no_item_found,
HttpMethod: searx.method,
MinChars: 4,
Delay: 300,
diff --git a/searx/static/themes/simple/js/searx.min.js b/searx/static/themes/simple/js/searx.min.js
index f1601cd37..42e8a845c 100644
--- a/searx/static/themes/simple/js/searx.min.js
+++ b/searx/static/themes/simple/js/searx.min.js
@@ -1,6 +1,7 @@
-/*! simple/searx.min.js | 14-08-2018 | https://github.com/asciimoo/searx */
+/*! simple/searx.min.js | 06-08-2019 | https://github.com/asciimoo/searx */
-(function(e,t,n){"use strict";if(e.Element){(function(e){e.matches=e.matches||e.matchesSelector||e.webkitMatchesSelector||e.msMatchesSelector||function(e){var t=this,n=(t.parentNode||t.document).querySelectorAll(e),i=-1;while(n[++i]&&n[i]!=t);return!!n[i]}})(Element.prototype)}function i(e,t,n){try{e.call(t,n)}catch(e){console.log(e)}}n=n||{};n.on=function(e,n,r,a){a=a||false;if(typeof e!=="string"){e.addEventListener(n,r,a)}else{t.addEventListener(n,function(n){var a=n.target||n.srcElement,o=false;while(a&&a.matches&&a!==t&&!(o=a.matches(e)))a=a.parentElement;if(o)i(r,a,n)},a)}};n.ready=function(t){if(document.readyState!="loading"){t.call(e)}else{e.addEventListener("DOMContentLoaded",t.bind(e))}};n.http=function(e,t,n){var i=new XMLHttpRequest,r=function(){},a=function(){},o={then:function(e){r=e;return o},catch:function(e){a=e;return o}};try{i.open(e,t,true);i.onload=function(){if(i.status==200){r(i.response,i.responseType)}else{a(Error(i.statusText))}};i.onerror=function(){a(Error("Network Error"))};i.onabort=function(){a(Error("Transaction is aborted"))};i.send()}catch(e){a(e)}return o};n.loadStyle=function(e){var i=n.staticPath+e,r="style_"+e.replace(".","_"),a=t.getElementById(r);if(a===null){a=t.createElement("link");a.setAttribute("id",r);a.setAttribute("rel","stylesheet");a.setAttribute("type","text/css");a.setAttribute("href",i);t.body.appendChild(a)}};n.loadScript=function(e,i){var r=n.staticPath+e,a="script_"+e.replace(".","_"),o=t.getElementById(a);if(o===null){o=t.createElement("script");o.setAttribute("id",a);o.setAttribute("src",r);o.onload=i;o.onerror=function(){o.setAttribute("error","1")};t.body.appendChild(o)}else if(!o.hasAttribute("error")){try{i.apply(o,[])}catch(e){console.log(e)}}else{console.log("callback not executed : script '"+r+"' not loaded.")}};n.insertBefore=function(e,t){element.parentNode.insertBefore(e,t)};n.insertAfter=function(e,t){t.parentNode.insertBefore(e,t.nextSibling)};n.on(".close","click",function(e){var t=e.target||e.srcElement;this.parentNode.classList.add("invisible")});return n})(window,document,window.searx);(function(e){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=e()}else if(typeof define==="function"&&define.amd){define([],e)}else{var t;if(typeof window!=="undefined"){t=window}else if(typeof global!=="undefined"){t=global}else if(typeof self!=="undefined"){t=self}else{t=this}t.AutoComplete=e()}})(function(){var e,t,n;return function e(t,n,i){function r(o,s){if(!n[o]){if(!t[o]){var l=typeof require=="function"&&require;if(!s&&l)return l(o,!0);if(a)return a(o,!0);var u=new Error("Cannot find module '"+o+"'");throw u.code="MODULE_NOT_FOUND",u}var c=n[o]={exports:{}};t[o][0].call(c.exports,function(e){var n=t[o][1][e];return r(n?n:e)},c,c.exports,e,t,n,i)}return n[o].exports}var a=typeof require=="function"&&require;for(var o=0;o<i.length;o++)r(i[o]);return r}({1:[function(e,t,n){/*
+window.searx=function(t,a){"use strict";if(t.Element){(function(e){e.matches=e.matches||e.matchesSelector||e.webkitMatchesSelector||e.msMatchesSelector||function(e){var t=this,n=(t.parentNode||t.document).querySelectorAll(e),i=-1;while(n[++i]&&n[i]!=t);return!!n[i]}})(Element.prototype)}function o(e,t,n){try{e.call(t,n)}catch(e){console.log(e)}}var s=window.searx||{};s.on=function(i,e,r,t){t=t||false;if(typeof i!=="string"){i.addEventListener(e,r,t)}else{a.addEventListener(e,function(e){var t=e.target||e.srcElement,n=false;while(t&&t.matches&&t!==a&&!(n=t.matches(i)))t=t.parentElement;if(n)o(r,t,e)},t)}};s.ready=function(e){if(document.readyState!="loading"){e.call(t)}else{t.addEventListener("DOMContentLoaded",e.bind(t))}};s.http=function(e,t,n){var i=new XMLHttpRequest,r=function(){},a=function(){},o={then:function(e){r=e;return o},catch:function(e){a=e;return o}};try{i.open(e,t,true);i.onload=function(){if(i.status==200){r(i.response,i.responseType)}else{a(Error(i.statusText))}};i.onerror=function(){a(Error("Network Error"))};i.onabort=function(){a(Error("Transaction is aborted"))};i.send()}catch(e){a(e)}return o};s.loadStyle=function(e){var t=s.static_path+e,n="style_"+e.replace(".","_"),i=a.getElementById(n);if(i===null){i=a.createElement("link");i.setAttribute("id",n);i.setAttribute("rel","stylesheet");i.setAttribute("type","text/css");i.setAttribute("href",t);a.body.appendChild(i)}};s.loadScript=function(e,t){var n=s.static_path+e,i="script_"+e.replace(".","_"),r=a.getElementById(i);if(r===null){r=a.createElement("script");r.setAttribute("id",i);r.setAttribute("src",n);r.onload=t;r.onerror=function(){r.setAttribute("error","1")};a.body.appendChild(r)}else if(!r.hasAttribute("error")){try{t.apply(r,[])}catch(e){console.log(e)}}else{console.log("callback not executed : script '"+n+"' not loaded.")}};s.insertBefore=function(e,t){element.parentNode.insertBefore(e,t)};s.insertAfter=function(e,t){t.parentNode.insertBefore(e,t.nextSibling)};s.on(".close","click",function(e){var t=e.target||e.srcElement;this.parentNode.classList.add("invisible")});return s}(window,document);(function(e){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=e()}else if(typeof define==="function"&&define.amd){define([],e)}else{var t;if(typeof window!=="undefined"){t=window}else if(typeof global!=="undefined"){t=global}else if(typeof self!=="undefined"){t=self}else{t=this}t.AutoComplete=e()}})(function(){var e,t,n;return function a(o,s,l){function u(n,e){if(!s[n]){if(!o[n]){var t=typeof require=="function"&&require;if(!e&&t)return t(n,!0);if(c)return c(n,!0);var i=new Error("Cannot find module '"+n+"'");throw i.code="MODULE_NOT_FOUND",i}var r=s[n]={exports:{}};o[n][0].call(r.exports,function(e){var t=o[n][1][e];return u(t?t:e)},r,r.exports,a,o,s,l)}return s[n].exports}var c=typeof require=="function"&&require;for(var e=0;e<l.length;e++)u(l[e]);return u}({1:[function(e,t,n){
+/*
* @license MIT
*
* Autocomplete.js v2.6.3
@@ -9,7 +10,8 @@
*
* (c) 2017, Baptiste Donaux
*/
-"use strict";var i;(function(e){e[e["AND"]=0]="AND";e[e["OR"]=1]="OR"})(i||(i={}));var r;(function(e){e[e["KEYDOWN"]=0]="KEYDOWN";e[e["KEYUP"]=1]="KEYUP"})(r||(r={}));var a=function(){function e(t,n){if(t===void 0){t={}}if(n===void 0){n="[data-autocomplete]"}if(Array.isArray(n)){n.forEach(function(n){new e(t,n)})}else if(typeof n=="string"){var i=document.querySelectorAll(n);Array.prototype.forEach.call(i,function(n){new e(t,n)})}else{var r=e.merge(e.defaults,t,{DOMResults:document.createElement("div")});e.prototype.create(r,n);return r}}e.prototype.create=function(t,n){t.Input=n;if(t.Input.nodeName.match(/^INPUT$/i)&&(t.Input.hasAttribute("type")===false||t.Input.getAttribute("type").match(/^TEXT|SEARCH$/i))){t.Input.setAttribute("autocomplete","off");t._Position(t);t.Input.parentNode.appendChild(t.DOMResults);t.$Listeners={blur:t._Blur.bind(t),destroy:e.prototype.destroy.bind(null,t),focus:t._Focus.bind(t),keyup:e.prototype.event.bind(null,t,r.KEYUP),keydown:e.prototype.event.bind(null,t,r.KEYDOWN),position:t._Position.bind(t)};for(var i in t.$Listeners){t.Input.addEventListener(i,t.$Listeners[i])}}};e.prototype.getEventsByType=function(e,t){var n={};for(var i in e.KeyboardMappings){var a=r.KEYUP;if(e.KeyboardMappings[i].Event!==undefined){a=e.KeyboardMappings[i].Event}if(a==t){n[i]=e.KeyboardMappings[i]}}return n};e.prototype.event=function(t,n,r){var a=function(t){if(l===true&&s.Operator==i.AND||l===false&&s.Operator==i.OR){t=e.merge({Not:false},t);if(t.hasOwnProperty("Is")){if(t.Is==r.keyCode){l=!t.Not}else{l=t.Not}}else if(t.hasOwnProperty("From")&&t.hasOwnProperty("To")){if(r.keyCode>=t.From&&r.keyCode<=t.To){l=!t.Not}else{l=t.Not}}}};for(var o in e.prototype.getEventsByType(t,n)){var s=e.merge({Operator:i.AND},t.KeyboardMappings[o]),l=i.AND==s.Operator;s.Conditions.forEach(a);if(l===true){s.Callback.call(t,r)}}};e.prototype.makeRequest=function(e,t){var n=Object.getOwnPropertyNames(e.HttpHeaders),i=new XMLHttpRequest,r=e._HttpMethod(),a=e._Url(),o=e._Pre(),s=encodeURIComponent(e._QueryArg())+"="+encodeURIComponent(o);if(r.match(/^GET$/i)){if(a.indexOf("?")!==-1){a+="&"+s}else{a+="?"+s}}i.open(r,a,true);for(var l=n.length-1;l>=0;l--){i.setRequestHeader(n[l],e.HttpHeaders[n[l]])}i.onreadystatechange=function(){if(i.readyState==4&&i.status==200){e.$Cache[o]=i.response;t(i.response)}};return i};e.prototype.ajax=function(t,n,i){if(i===void 0){i=true}if(t.$AjaxTimer){window.clearTimeout(t.$AjaxTimer)}if(i===true){t.$AjaxTimer=window.setTimeout(e.prototype.ajax.bind(null,t,n,false),t.Delay)}else{if(t.Request){t.Request.abort()}t.Request=n;t.Request.send(t._QueryArg()+"="+t._Pre())}};e.prototype.cache=function(t,n){var i=t._Cache(t._Pre());if(i===undefined){var r=e.prototype.makeRequest(t,n);e.prototype.ajax(t,r)}else{n(i)}};e.prototype.destroy=function(e){for(var t in e.$Listeners){e.Input.removeEventListener(t,e.$Listeners[t])}e.DOMResults.parentNode.removeChild(e.DOMResults)};return e}();a.merge=function(){var e={},t;for(var n=0;n<arguments.length;n++){for(t in arguments[n]){e[t]=arguments[n][t]}}return e};a.defaults={Delay:150,EmptyMessage:"No result here",Highlight:{getRegex:function(e){return new RegExp(e,"ig")},transform:function(e){return"<strong>"+e+"</strong>"}},HttpHeaders:{"Content-type":"application/x-www-form-urlencoded"},Limit:0,MinChars:0,HttpMethod:"GET",QueryArg:"q",Url:null,KeyboardMappings:{Enter:{Conditions:[{Is:13,Not:false}],Callback:function(e){if(this.DOMResults.getAttribute("class").indexOf("open")!=-1){var t=this.DOMResults.querySelector("li.active");if(t!==null){e.preventDefault();this._Select(t);this.DOMResults.setAttribute("class","autocomplete")}}},Operator:i.AND,Event:r.KEYDOWN},KeyUpAndDown_down:{Conditions:[{Is:38,Not:false},{Is:40,Not:false}],Callback:function(e){e.preventDefault()},Operator:i.OR,Event:r.KEYDOWN},KeyUpAndDown_up:{Conditions:[{Is:38,Not:false},{Is:40,Not:false}],Callback:function(e){e.preventDefault();var t=this.DOMResults.querySelector("li:first-child:not(.locked)"),n=this.DOMResults.querySelector("li:last-child:not(.locked)"),i=this.DOMResults.querySelector("li.active");if(i){var r=Array.prototype.indexOf.call(i.parentNode.children,i),a=r+(e.keyCode-39),o=this.DOMResults.getElementsByTagName("li").length;if(a<0){a=o-1}else if(a>=o){a=0}i.classList.remove("active");i.parentElement.children.item(a).classList.add("active")}else if(n&&e.keyCode==38){n.classList.add("active")}else if(t){t.classList.add("active")}},Operator:i.OR,Event:r.KEYUP},AlphaNum:{Conditions:[{Is:13,Not:true},{From:35,To:40,Not:true}],Callback:function(){var e=this.Input.getAttribute("data-autocomplete-old-value"),t=this._Pre();if(t!==""&&t.length>=this._MinChars()){if(!e||t!=e){this.DOMResults.setAttribute("class","autocomplete open")}a.prototype.cache(this,function(e){this._Render(this._Post(e));this._Open()}.bind(this))}},Operator:i.AND,Event:r.KEYUP}},DOMResults:null,Request:null,Input:null,_EmptyMessage:function(){var e="";if(this.Input.hasAttribute("data-autocomplete-empty-message")){e=this.Input.getAttribute("data-autocomplete-empty-message")}else if(this.EmptyMessage!==false){e=this.EmptyMessage}else{e=""}return e},_Limit:function(){var e=this.Input.getAttribute("data-autocomplete-limit");if(isNaN(e)||e===null){return this.Limit}return parseInt(e,10)},_MinChars:function(){var e=this.Input.getAttribute("data-autocomplete-minchars");if(isNaN(e)||e===null){return this.MinChars}return parseInt(e,10)},_Highlight:function(e){return e.replace(this.Highlight.getRegex(this._Pre()),this.Highlight.transform)},_HttpMethod:function(){if(this.Input.hasAttribute("data-autocomplete-method")){return this.Input.getAttribute("data-autocomplete-method")}return this.HttpMethod},_QueryArg:function(){if(this.Input.hasAttribute("data-autocomplete-param-name")){return this.Input.getAttribute("data-autocomplete-param-name")}return this.QueryArg},_Url:function(){if(this.Input.hasAttribute("data-autocomplete")){return this.Input.getAttribute("data-autocomplete")}return this.Url},_Blur:function(e){if(e===true){this.DOMResults.setAttribute("class","autocomplete");this.Input.setAttribute("data-autocomplete-old-value",this.Input.value)}else{var t=this;setTimeout(function(){t._Blur(true)},150)}},_Cache:function(e){return this.$Cache[e]},_Focus:function(){var e=this.Input.getAttribute("data-autocomplete-old-value");if((!e||this.Input.value!=e)&&this._MinChars()<=this.Input.value.length){this.DOMResults.setAttribute("class","autocomplete open")}},_Open:function(){var e=this;Array.prototype.forEach.call(this.DOMResults.getElementsByTagName("li"),function(t){if(t.getAttribute("class")!="locked"){t.onclick=function(n){e._Select(t)};t.onmouseenter=function(){var n=e.DOMResults.querySelector("li.active");if(n!==t){if(n!==null){n.classList.remove("active")}t.classList.add("active")}}}})},_Position:function(){this.DOMResults.setAttribute("class","autocomplete");this.DOMResults.setAttribute("style","top:"+(this.Input.offsetTop+this.Input.offsetHeight)+"px;left:"+this.Input.offsetLeft+"px;width:"+this.Input.clientWidth+"px;")},_Render:function(e){var t;if(typeof e=="string"){t=this._RenderRaw(e)}else{t=this._RenderResponseItems(e)}if(this.DOMResults.hasChildNodes()){this.DOMResults.removeChild(this.DOMResults.childNodes[0])}this.DOMResults.appendChild(t)},_RenderResponseItems:function(e){var t=document.createElement("ul"),n=document.createElement("li"),i=this._Limit();if(i<0){e=e.reverse()}else if(i===0){i=e.length}for(var r=0;r<Math.min(Math.abs(i),e.length);r++){n.innerHTML=e[r].Label;n.setAttribute("data-autocomplete-value",e[r].Value);t.appendChild(n);n=document.createElement("li")}return t},_RenderRaw:function(e){var t=document.createElement("ul"),n=document.createElement("li");if(e.length>0){this.DOMResults.innerHTML=e}else{var i=this._EmptyMessage();if(i!==""){n.innerHTML=i;n.setAttribute("class","locked");t.appendChild(n)}}return t},_Post:function(e){try{var t=[];var n=JSON.parse(e);if(Object.keys(n).length===0){return""}if(Array.isArray(n)){for(var i=0;i<Object.keys(n).length;i++){t[t.length]={Value:n[i],Label:this._Highlight(n[i])}}}else{for(var r in n){t.push({Value:r,Label:this._Highlight(n[r])})}}return t}catch(t){return e}},_Pre:function(){return this.Input.value},_Select:function(e){console.log("test test test");if(e.hasAttribute("data-autocomplete-value")){this.Input.value=e.getAttribute("data-autocomplete-value")}else{this.Input.value=e.innerHTML}this.Input.setAttribute("data-autocomplete-old-value",this.Input.value)},$AjaxTimer:null,$Cache:{},$Listeners:{}};t.exports=a},{}]},{},[1])(1)});/**
+"use strict";var l;(function(e){e[e["AND"]=0]="AND";e[e["OR"]=1]="OR"})(l||(l={}));var a;(function(e){e[e["KEYDOWN"]=0]="KEYDOWN";e[e["KEYUP"]=1]="KEYUP"})(a||(a={}));var i=function(){function s(t,e){if(t===void 0){t={}}if(e===void 0){e="[data-autocomplete]"}if(Array.isArray(e)){e.forEach(function(e){new s(t,e)})}else if(typeof e=="string"){var n=document.querySelectorAll(e);Array.prototype.forEach.call(n,function(e){new s(t,e)})}else{var i=s.merge(s.defaults,t,{DOMResults:document.createElement("div")});s.prototype.create(i,e);return i}}s.prototype.create=function(e,t){e.Input=t;if(e.Input.nodeName.match(/^INPUT$/i)&&(e.Input.hasAttribute("type")===false||e.Input.getAttribute("type").match(/^TEXT|SEARCH$/i))){e.Input.setAttribute("autocomplete","off");e._Position(e);e.Input.parentNode.appendChild(e.DOMResults);e.$Listeners={blur:e._Blur.bind(e),destroy:s.prototype.destroy.bind(null,e),focus:e._Focus.bind(e),keyup:s.prototype.event.bind(null,e,a.KEYUP),keydown:s.prototype.event.bind(null,e,a.KEYDOWN),position:e._Position.bind(e)};for(var n in e.$Listeners){e.Input.addEventListener(n,e.$Listeners[n])}}};s.prototype.getEventsByType=function(e,t){var n={};for(var i in e.KeyboardMappings){var r=a.KEYUP;if(e.KeyboardMappings[i].Event!==undefined){r=e.KeyboardMappings[i].Event}if(r==t){n[i]=e.KeyboardMappings[i]}}return n};s.prototype.event=function(e,t,n){var i=function(e){if(o===true&&a.Operator==l.AND||o===false&&a.Operator==l.OR){e=s.merge({Not:false},e);if(e.hasOwnProperty("Is")){if(e.Is==n.keyCode){o=!e.Not}else{o=e.Not}}else if(e.hasOwnProperty("From")&&e.hasOwnProperty("To")){if(n.keyCode>=e.From&&n.keyCode<=e.To){o=!e.Not}else{o=e.Not}}}};for(var r in s.prototype.getEventsByType(e,t)){var a=s.merge({Operator:l.AND},e.KeyboardMappings[r]),o=l.AND==a.Operator;a.Conditions.forEach(i);if(o===true){a.Callback.call(e,n)}}};s.prototype.makeRequest=function(e,t){var n=Object.getOwnPropertyNames(e.HttpHeaders),i=new XMLHttpRequest,r=e._HttpMethod(),a=e._Url(),o=e._Pre(),s=encodeURIComponent(e._QueryArg())+"="+encodeURIComponent(o);if(r.match(/^GET$/i)){if(a.indexOf("?")!==-1){a+="&"+s}else{a+="?"+s}}i.open(r,a,true);for(var l=n.length-1;l>=0;l--){i.setRequestHeader(n[l],e.HttpHeaders[n[l]])}i.onreadystatechange=function(){if(i.readyState==4&&i.status==200){e.$Cache[o]=i.response;t(i.response)}};return i};s.prototype.ajax=function(e,t,n){if(n===void 0){n=true}if(e.$AjaxTimer){window.clearTimeout(e.$AjaxTimer)}if(n===true){e.$AjaxTimer=window.setTimeout(s.prototype.ajax.bind(null,e,t,false),e.Delay)}else{if(e.Request){e.Request.abort()}e.Request=t;e.Request.send(e._QueryArg()+"="+e._Pre())}};s.prototype.cache=function(e,t){var n=e._Cache(e._Pre());if(n===undefined){var i=s.prototype.makeRequest(e,t);s.prototype.ajax(e,i)}else{t(n)}};s.prototype.destroy=function(e){for(var t in e.$Listeners){e.Input.removeEventListener(t,e.$Listeners[t])}e.DOMResults.parentNode.removeChild(e.DOMResults)};return s}();i.merge=function(){var e={},t;for(var n=0;n<arguments.length;n++){for(t in arguments[n]){e[t]=arguments[n][t]}}return e};i.defaults={Delay:150,EmptyMessage:"No result here",Highlight:{getRegex:function(e){return new RegExp(e,"ig")},transform:function(e){return"<strong>"+e+"</strong>"}},HttpHeaders:{"Content-type":"application/x-www-form-urlencoded"},Limit:0,MinChars:0,HttpMethod:"GET",QueryArg:"q",Url:null,KeyboardMappings:{Enter:{Conditions:[{Is:13,Not:false}],Callback:function(e){if(this.DOMResults.getAttribute("class").indexOf("open")!=-1){var t=this.DOMResults.querySelector("li.active");if(t!==null){e.preventDefault();this._Select(t);this.DOMResults.setAttribute("class","autocomplete")}}},Operator:l.AND,Event:a.KEYDOWN},KeyUpAndDown_down:{Conditions:[{Is:38,Not:false},{Is:40,Not:false}],Callback:function(e){e.preventDefault()},Operator:l.OR,Event:a.KEYDOWN},KeyUpAndDown_up:{Conditions:[{Is:38,Not:false},{Is:40,Not:false}],Callback:function(e){e.preventDefault();var t=this.DOMResults.querySelector("li:first-child:not(.locked)"),n=this.DOMResults.querySelector("li:last-child:not(.locked)"),i=this.DOMResults.querySelector("li.active");if(i){var r=Array.prototype.indexOf.call(i.parentNode.children,i),a=r+(e.keyCode-39),o=this.DOMResults.getElementsByTagName("li").length;if(a<0){a=o-1}else if(a>=o){a=0}i.classList.remove("active");i.parentElement.children.item(a).classList.add("active")}else if(n&&e.keyCode==38){n.classList.add("active")}else if(t){t.classList.add("active")}},Operator:l.OR,Event:a.KEYUP},AlphaNum:{Conditions:[{Is:13,Not:true},{From:35,To:40,Not:true}],Callback:function(){var e=this.Input.getAttribute("data-autocomplete-old-value"),t=this._Pre();if(t!==""&&t.length>=this._MinChars()){if(!e||t!=e){this.DOMResults.setAttribute("class","autocomplete open")}i.prototype.cache(this,function(e){this._Render(this._Post(e));this._Open()}.bind(this))}},Operator:l.AND,Event:a.KEYUP}},DOMResults:null,Request:null,Input:null,_EmptyMessage:function(){var e="";if(this.Input.hasAttribute("data-autocomplete-empty-message")){e=this.Input.getAttribute("data-autocomplete-empty-message")}else if(this.EmptyMessage!==false){e=this.EmptyMessage}else{e=""}return e},_Limit:function(){var e=this.Input.getAttribute("data-autocomplete-limit");if(isNaN(e)||e===null){return this.Limit}return parseInt(e,10)},_MinChars:function(){var e=this.Input.getAttribute("data-autocomplete-minchars");if(isNaN(e)||e===null){return this.MinChars}return parseInt(e,10)},_Highlight:function(e){return e.replace(this.Highlight.getRegex(this._Pre()),this.Highlight.transform)},_HttpMethod:function(){if(this.Input.hasAttribute("data-autocomplete-method")){return this.Input.getAttribute("data-autocomplete-method")}return this.HttpMethod},_QueryArg:function(){if(this.Input.hasAttribute("data-autocomplete-param-name")){return this.Input.getAttribute("data-autocomplete-param-name")}return this.QueryArg},_Url:function(){if(this.Input.hasAttribute("data-autocomplete")){return this.Input.getAttribute("data-autocomplete")}return this.Url},_Blur:function(e){if(e===true){this.DOMResults.setAttribute("class","autocomplete");this.Input.setAttribute("data-autocomplete-old-value",this.Input.value)}else{var t=this;setTimeout(function(){t._Blur(true)},150)}},_Cache:function(e){return this.$Cache[e]},_Focus:function(){var e=this.Input.getAttribute("data-autocomplete-old-value");if((!e||this.Input.value!=e)&&this._MinChars()<=this.Input.value.length){this.DOMResults.setAttribute("class","autocomplete open")}},_Open:function(){var n=this;Array.prototype.forEach.call(this.DOMResults.getElementsByTagName("li"),function(t){if(t.getAttribute("class")!="locked"){t.onclick=function(e){n._Select(t)};t.onmouseenter=function(){var e=n.DOMResults.querySelector("li.active");if(e!==t){if(e!==null){e.classList.remove("active")}t.classList.add("active")}}}})},_Position:function(){this.DOMResults.setAttribute("class","autocomplete");this.DOMResults.setAttribute("style","top:"+(this.Input.offsetTop+this.Input.offsetHeight)+"px;left:"+this.Input.offsetLeft+"px;width:"+this.Input.clientWidth+"px;")},_Render:function(e){var t;if(typeof e=="string"){t=this._RenderRaw(e)}else{t=this._RenderResponseItems(e)}if(this.DOMResults.hasChildNodes()){this.DOMResults.removeChild(this.DOMResults.childNodes[0])}this.DOMResults.appendChild(t)},_RenderResponseItems:function(e){var t=document.createElement("ul"),n=document.createElement("li"),i=this._Limit();if(i<0){e=e.reverse()}else if(i===0){i=e.length}for(var r=0;r<Math.min(Math.abs(i),e.length);r++){n.innerHTML=e[r].Label;n.setAttribute("data-autocomplete-value",e[r].Value);t.appendChild(n);n=document.createElement("li")}return t},_RenderRaw:function(e){var t=document.createElement("ul"),n=document.createElement("li");if(e.length>0){this.DOMResults.innerHTML=e}else{var i=this._EmptyMessage();if(i!==""){n.innerHTML=i;n.setAttribute("class","locked");t.appendChild(n)}}return t},_Post:function(t){try{var e=[];var n=JSON.parse(t);if(Object.keys(n).length===0){return""}if(Array.isArray(n)){for(var i=0;i<Object.keys(n).length;i++){e[e.length]={Value:n[i],Label:this._Highlight(n[i])}}}else{for(var r in n){e.push({Value:r,Label:this._Highlight(n[r])})}}return e}catch(e){return t}},_Pre:function(){return this.Input.value},_Select:function(e){console.log("test test test");if(e.hasAttribute("data-autocomplete-value")){this.Input.value=e.getAttribute("data-autocomplete-value")}else{this.Input.value=e.innerHTML}this.Input.setAttribute("data-autocomplete-old-value",this.Input.value)},$AjaxTimer:null,$Cache:{},$Listeners:{}};t.exports=i},{}]},{},[1])(1)});
+/**
*
* Google Image Layout v0.0.1
* Description, by Anh Trinh.
@@ -19,5 +21,5 @@
* @license Free to use under the MIT License.
*
*/
-(function(e,t){"use strict";function n(e,t,n,i){this.container_selector=e;this.results_selector=t;this.img_selector=n;this.margin=10;this.maxHeight=i;this._alignAllDone=true}n.prototype._getHeigth=function(e,t){var n=0,i;t-=e.length*this.margin;for(var r=0;r<e.length;r++){i=e[r];if(i.naturalWidth>0&&i.naturalHeight>0){n+=i.naturalWidth/i.naturalHeight}else{n+=1}}return t/n};n.prototype._setSize=function(e,t){var n,i,r=e.length;for(var a=0;a<r;a++){n=e[a];if(n.naturalWidth>0&&n.naturalHeight>0){i=t*n.naturalWidth/n.naturalHeight}else{i=t}n.style.width=i+"px";n.style.height=t+"px";n.style.marginLeft="3px";n.style.marginTop="3px";n.style.marginRight=this.margin-7+"px";n.style.marginBottom=this.margin-7+"px"}};n.prototype._alignImgs=function(e){var n,i,r=t.querySelector(this.container_selector).clientWidth;e:while(e.length>0){for(var a=1;a<=e.length;a++){n=e.slice(0,a);i=this._getHeigth(n,r);if(i<this.maxHeight){this._setSize(n,i);e=e.slice(a);continue e}}this._setSize(n,Math.min(this.maxHeight,i));break}};n.prototype.align=function(e){var n=t.querySelectorAll(this.results_selector),i=n.length,r=null,a=null,o=[];for(var s=0;s<i;s++){a=n[s];if(a.previousElementSibling!==r&&o.length>0){this._alignImgs(o);o=[]}o.push(a.querySelector(this.img_selector));r=a}if(o.length>0){this._alignImgs(o)}};n.prototype.watch=function(){var n,i,r,a,o=this,s=t.querySelectorAll(this.results_selector),l=s.length;function u(e){o.align()}function c(e){if(o._alignAllDone){o._alignAllDone=false;setTimeout(function(){o.align();o._alignAllDone=true},100)}}e.addEventListener("resize",c);e.addEventListener("pageshow",u);for(n=0;n<l;n++){i=s[n].querySelector(this.img_selector);if(typeof i!=="undefined"){i.addEventListener("load",c);i.addEventListener("error",c)}}};e.searx.ImageLayout=n})(window,document);searx.ready(function(){searx.on(".result","click",function(){t(this)(true)});searx.on(".result a","focus",function(e){var n=e.target;while(n!==undefined){if(n.classList.contains("result")){if(n.getAttribute("data-vim-selected")===null){t(n)(true)}break}n=n.parentNode}},true);var e={27:{key:"Escape",fun:i,des:"remove focus from the focused input",cat:"Control"},73:{key:"i",fun:l,des:"focus on the search input",cat:"Control"},66:{key:"b",fun:o(-window.innerHeight),des:"scroll one page up",cat:"Navigation"},70:{key:"f",fun:o(window.innerHeight),des:"scroll one page down",cat:"Navigation"},85:{key:"u",fun:o(-window.innerHeight/2),des:"scroll half a page up",cat:"Navigation"},68:{key:"d",fun:o(window.innerHeight/2),des:"scroll half a page down",cat:"Navigation"},71:{key:"g",fun:s(-document.body.scrollHeight,"top"),des:"scroll to the top of the page",cat:"Navigation"},86:{key:"v",fun:s(document.body.scrollHeight,"bottom"),des:"scroll to the bottom of the page",cat:"Navigation"},75:{key:"k",fun:t("up"),des:"select previous search result",cat:"Results"},74:{key:"j",fun:t("down"),des:"select next search result",cat:"Results"},80:{key:"p",fun:r(0),des:"go to previous page",cat:"Results"},78:{key:"n",fun:r(1),des:"go to next page",cat:"Results"},79:{key:"o",fun:u(false),des:"open search result",cat:"Results"},84:{key:"t",fun:u(true),des:"open the result in a new tab",cat:"Results"},82:{key:"r",fun:n,des:"reload page from the server",cat:"Control"},72:{key:"h",fun:d,des:"toggle help window",cat:"Other"}};searx.on(document,"keydown",function(t){if(e.hasOwnProperty(t.keyCode)&&!t.ctrlKey&&!t.altKey&&!t.shiftKey&&!t.metaKey){var n=t.target.tagName.toLowerCase();if(t.keyCode===27){if(n==="input"||n==="select"||n==="textarea"){e[t.keyCode].fun()}}else{if(t.target===document.body||n==="a"||n==="button"){t.preventDefault();e[t.keyCode].fun()}}}});function t(e){return function(t){var n=document.querySelector(".result[data-vim-selected]"),i=e;if(n===null){n=document.querySelector(".result");if(n===null){return}if(e==="down"||e==="up"){i=n}}var r,o=document.querySelectorAll(".result");if(typeof i!=="string"){r=i}else{switch(i){case"visible":var s=document.documentElement.scrollTop||document.body.scrollTop;var l=s+document.documentElement.clientHeight;for(var u=0;u<o.length;u++){r=o[u];var c=r.offsetTop;var d=c+r.clientHeight;if(d<=l&&c>s){break}}break;case"down":r=n.nextElementSibling;if(r===null){r=o[0]}break;case"up":r=n.previousElementSibling;if(r===null){r=o[o.length-1]}break;case"bottom":r=o[o.length-1];break;case"top":default:r=o[0]}}if(r){n.removeAttribute("data-vim-selected");r.setAttribute("data-vim-selected","true");var f=r.querySelector("h3 a")||r.querySelector("a");if(f!==null){f.focus()}if(!t){a()}}}}function n(){document.location.reload(true)}function i(){if(document.activeElement){document.activeElement.blur()}}function r(e){return function(){var t=$('div#pagination button[type="submit"]');if(t.length!==2){console.log("page navigation with this theme is not supported");return}if(e>=0&&e<t.length){t[e].click()}else{console.log("pageButtonClick(): invalid argument")}}}function a(){var e=document.querySelector(".result[data-vim-selected]");if(e===null){return}var t=document.documentElement.scrollTop||document.body.scrollTop,n=document.documentElement.clientHeight,i=e.offsetTop,r=i+e.clientHeight,a=120;if(e.previousElementSibling===null&&r<n){window.scroll(window.scrollX,0);return}if(t>i-a){window.scroll(window.scrollX,i-a)}else{var o=t+n;if(o<r+a){window.scroll(window.scrollX,r-n+a)}}}function o(e){return function(){window.scrollBy(0,e);t("visible")()}}function s(e,n){return function(){window.scrollTo(0,e);t(n)()}}function l(){window.scrollTo(0,0);document.querySelector("#q").focus()}function u(e){return function(){var t=document.querySelector(".result[data-vim-selected] h3 a");if(t!==null){var n=t.getAttribute("href");if(e){window.open(n)}else{window.location.href=n}}}}function c(t){var n={};for(var i in e){var r=e[i];n[r.cat]=n[r.cat]||[];n[r.cat].push(r)}var a=Object.keys(n).sort(function(e,t){return n[t].length-n[e].length});if(a.length===0){return}var o='<a href="#" class="close" aria-label="close" title="close">×</a>';o+="<h3>How to navigate searx with Vim-like hotkeys</h3>";o+="<table>";for(var s=0;s<a.length;s++){var l=n[a[s]];var u=s===a.length-1;var c=s%2===0;if(c){o+="<tr>"}o+="<td>";o+="<h4>"+l[0].cat+"</h4>";o+='<ul class="list-unstyled">';for(var d in l){o+="<li><kbd>"+l[d].key+"</kbd> "+l[d].des+"</li>"}o+="</ul>";o+="</td>";if(!c||u){o+="</tr>"}}o+="</table>";t.innerHTML=o}function d(){var e=document.querySelector("#vim-hotkeys-help");console.log(e);if(e===undefined||e===null){e=document.createElement("div");e.id="vim-hotkeys-help";e.className="dialog-modal";e.style="width: 40%";c(e);var t=document.getElementsByTagName("body")[0];t.appendChild(e)}else{e.classList.toggle("invisible");return}}});(function(e,t,n){"use strict";n.ready(function(){n.on(".searx_overpass_request","click",function(e){this.classList.remove("searx_overpass_request");var i="https://overpass-api.de/api/interpreter?data=";var r=i+"[out:json][timeout:25];(";var a=");out meta;";var o=this.dataset.osmId;var s=this.dataset.osmType;var l=t.querySelector("#"+this.dataset.resultTable);var u=t.querySelector("#"+this.dataset.resultTableLoadicon);var c=["addr:city","addr:country","addr:housenumber","addr:postcode","addr:street"];if(o&&s&&l){var d=null;switch(s){case"node":d=r+"node("+o+");"+a;break;case"way":d=r+"way("+o+");"+a;break;case"relation":d=r+"relation("+o+");"+a;break;default:break}if(d){n.http("GET",d).then(function(e,t){e=JSON.parse(e);if(e&&e.elements&&e.elements[0]){var n=e.elements[0];var i="";for(var r in n.tags){if(n.tags.name===null||c.indexOf(r)==-1){i+="<tr><td>"+r+"</td><td>";switch(r){case"phone":case"fax":i+='<a href="tel:'+n.tags[r].replace(/ /g,"")+'">'+n.tags[r]+"</a>";break;case"email":i+='<a href="mailto:'+n.tags[r]+'">'+n.tags[r]+"</a>";break;case"website":case"url":i+='<a href="'+n.tags[r]+'">'+n.tags[r]+"</a>";break;case"wikidata":i+='<a href="https://www.wikidata.org/wiki/'+n.tags[r]+'">'+n.tags[r]+"</a>";break;case"wikipedia":if(n.tags[r].indexOf(":")!=-1){i+='<a href="https://'+n.tags[r].substring(0,n.tags[r].indexOf(":"))+".wikipedia.org/wiki/"+n.tags[r].substring(n.tags[r].indexOf(":")+1)+'">'+n.tags[r]+"</a>";break}default:i+=n.tags[r];break}i+="</td></tr>"}}u.parentNode.removeChild(u);l.classList.remove("invisible");l.querySelector("tbody").innerHTML=i}}).catch(function(){u.classList.remove("invisible");u.innerHTML="could not load data!"})}}e.preventDefault()});n.on(".searx_init_map","click",function(e){this.classList.remove("searx_init_map");var t=this.dataset.leafletTarget;var i=parseFloat(this.dataset.mapLon);var r=parseFloat(this.dataset.mapLat);var a=parseFloat(this.dataset.mapZoom);var o=JSON.parse(this.dataset.mapBoundingbox);var s=JSON.parse(this.dataset.mapGeojson);n.loadStyle("leaflet/leaflet.css");n.loadScript("leaflet/leaflet.js",function(){var e=null;if(o){var n=L.latLng(o[0],o[2]);var l=L.latLng(o[1],o[3]);e=L.latLngBounds(n,l)}var u=L.map(t);var c="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png";var d='Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';var f=new L.TileLayer(c,{minZoom:1,maxZoom:19,attribution:d});var p="https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png";var h='Wikimedia maps beta | Maps data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';var m=new L.TileLayer(p,{minZoom:1,maxZoom:19,attribution:h});if(e){setTimeout(function(){u.fitBounds(e,{maxZoom:17})},0)}else if(i&&r){if(a){u.setView(new L.latLng(r,i),a)}else{u.setView(new L.latLng(r,i),8)}}u.addLayer(f);var g={"OSM Mapnik":f};L.control.layers(g).addTo(u);if(s){L.geoJson(s).addTo(u)}});e.preventDefault()})})})(window,document,window.searx);(function(e,t,n){"use strict";n.ready(function(){n.image_thumbnail_layout=new n.ImageLayout("#urls","#urls .result-images","img.image_thumbnail",200);n.image_thumbnail_layout.watch();n.on(".btn-collapse","click",function(e){var n=this.getAttribute("data-btn-text-collapsed");var i=this.getAttribute("data-btn-text-not-collapsed");var r=this.getAttribute("data-target");var a=t.querySelector(r);var o=this.innerHTML;if(this.classList.contains("collapsed")){o=o.replace(n,i)}else{o=o.replace(i,n)}this.innerHTML=o;this.classList.toggle("collapsed");a.classList.toggle("invisible")});n.on(".media-loader","click",function(e){var n=this.getAttribute("data-target");var i=t.querySelector(n+" > iframe");var r=i.getAttribute("src");if(r===null||r===undefined||r===false){i.setAttribute("src",i.getAttribute("data-src"))}});e.addEventListener("scroll",function(){var e=t.getElementById("backToTop"),n=document.documentElement.scrollTop||document.body.scrollTop;if(e!==null){if(n>=200){e.style.opacity=1}else{e.style.opacity=0}}})})})(window,document,window.searx);(function(e,t,n){"use strict";var i=true,r="q",a;function o(e){if(e.setSelectionRange){var t=e.value.length;e.setSelectionRange(t,t)}}function s(){if(a.value.length>0){var e=document.getElementById("search");setTimeout(e.submit.bind(e),0)}}function l(e){var t=document.getElementById("clear_search");var n=function(){if(e.value.length===0){t.classList.add("empty")}else{t.classList.remove("empty")}};n();t.addEventListener("click",function(){e.value="";e.focus();n()});e.addEventListener("keyup",n,false)}n.ready(function(){a=t.getElementById(r);function u(e){if(i){o(a);i=false}else{}}if(a!==null){l(a);if(n.autocompleter){n.autocomplete=AutoComplete.call(e,{Url:"./autocompleter",EmptyMessage:n.noItemFound,HttpMethod:n.method,MinChars:4,Delay:300},"#"+r);e.addEventListener("resize",function(){var e=new CustomEvent("position");a.dispatchEvent(e)})}a.addEventListener("focus",u,false);a.focus()}if(a!==null&&n.search_on_category_select){t.querySelector(".help").className="invisible";n.on("#categories input","change",function(e){var n,i=t.querySelectorAll('#categories input[type="checkbox"]');for(n=0;n<i.length;n++){if(i[n]!==this&&i[n].checked){i[n].click()}}if(!this.checked){this.click()}s();return false});n.on(t.getElementById("time_range"),"change",s);n.on(t.getElementById("language"),"change",s)}})})(window,document,window.searx);
+(function(u,c){"use strict";function e(e,t,n,i){this.container_selector=e;this.results_selector=t;this.img_selector=n;this.margin=10;this.maxHeight=i;this._alignAllDone=true}e.prototype._getHeigth=function(e,t){var n=0,i;t-=e.length*this.margin;for(var r=0;r<e.length;r++){i=e[r];if(i.naturalWidth>0&&i.naturalHeight>0){n+=i.naturalWidth/i.naturalHeight}else{n+=1}}return t/n};e.prototype._setSize=function(e,t){var n,i,r=e.length;for(var a=0;a<r;a++){n=e[a];if(n.naturalWidth>0&&n.naturalHeight>0){i=t*n.naturalWidth/n.naturalHeight}else{i=t}n.style.width=i+"px";n.style.height=t+"px";n.style.marginLeft="3px";n.style.marginTop="3px";n.style.marginRight=this.margin-7+"px";n.style.marginBottom=this.margin-7+"px"}};e.prototype._alignImgs=function(e){var t,n,i=c.querySelector(this.container_selector).clientWidth;e:while(e.length>0){for(var r=1;r<=e.length;r++){t=e.slice(0,r);n=this._getHeigth(t,i);if(n<this.maxHeight){this._setSize(t,n);e=e.slice(r);continue e}}this._setSize(t,Math.min(this.maxHeight,n));break}};e.prototype.align=function(e){var t=c.querySelectorAll(this.results_selector),n=t.length,i=null,r=null,a=[];for(var o=0;o<n;o++){r=t[o];if(r.previousElementSibling!==i&&a.length>0){this._alignImgs(a);a=[]}a.push(r.querySelector(this.img_selector));i=r}if(a.length>0){this._alignImgs(a)}};e.prototype.watch=function(){var e,t,n,i,r=this,a=c.querySelectorAll(this.results_selector),o=a.length;function s(e){r.align()}function l(e){if(r._alignAllDone){r._alignAllDone=false;setTimeout(function(){r.align();r._alignAllDone=true},100)}}u.addEventListener("resize",l);u.addEventListener("pageshow",s);for(e=0;e<o;e++){t=a[e].querySelector(this.img_selector);if(typeof t!=="undefined"){t.addEventListener("load",l);t.addEventListener("error",l)}}};u.searx.ImageLayout=e})(window,document);searx.ready(function(){searx.on(".result","click",function(){n(this)(true)});searx.on(".result a","focus",function(e){var t=e.target;while(t!==undefined){if(t.classList.contains("result")){if(t.getAttribute("data-vim-selected")===null){n(t)(true)}break}t=t.parentNode}},true);var d={27:{key:"Escape",fun:t,des:"remove focus from the focused input",cat:"Control"},73:{key:"i",fun:o,des:"focus on the search input",cat:"Control"},66:{key:"b",fun:r(-window.innerHeight),des:"scroll one page up",cat:"Navigation"},70:{key:"f",fun:r(window.innerHeight),des:"scroll one page down",cat:"Navigation"},85:{key:"u",fun:r(-window.innerHeight/2),des:"scroll half a page up",cat:"Navigation"},68:{key:"d",fun:r(window.innerHeight/2),des:"scroll half a page down",cat:"Navigation"},71:{key:"g",fun:a(-document.body.scrollHeight,"top"),des:"scroll to the top of the page",cat:"Navigation"},86:{key:"v",fun:a(document.body.scrollHeight,"bottom"),des:"scroll to the bottom of the page",cat:"Navigation"},75:{key:"k",fun:n("up"),des:"select previous search result",cat:"Results"},74:{key:"j",fun:n("down"),des:"select next search result",cat:"Results"},80:{key:"p",fun:i(0),des:"go to previous page",cat:"Results"},78:{key:"n",fun:i(1),des:"go to next page",cat:"Results"},79:{key:"o",fun:s(false),des:"open search result",cat:"Results"},84:{key:"t",fun:s(true),des:"open the result in a new tab",cat:"Results"},82:{key:"r",fun:e,des:"reload page from the server",cat:"Control"},72:{key:"h",fun:u,des:"toggle help window",cat:"Other"}};searx.on(document,"keydown",function(e){if(d.hasOwnProperty(e.keyCode)&&!e.ctrlKey&&!e.altKey&&!e.shiftKey&&!e.metaKey){var t=e.target.tagName.toLowerCase();if(e.keyCode===27){if(t==="input"||t==="select"||t==="textarea"){d[e.keyCode].fun()}}else{if(e.target===document.body||t==="a"||t==="button"){e.preventDefault();d[e.keyCode].fun()}}}});function n(d){return function(e){var t=document.querySelector(".result[data-vim-selected]"),n=d;if(t===null){t=document.querySelector(".result");if(t===null){return}if(d==="down"||d==="up"){n=t}}var i,r=document.querySelectorAll(".result");if(typeof n!=="string"){i=n}else{switch(n){case"visible":var a=document.documentElement.scrollTop||document.body.scrollTop;var o=a+document.documentElement.clientHeight;for(var s=0;s<r.length;s++){i=r[s];var l=i.offsetTop;var u=l+i.clientHeight;if(u<=o&&l>a){break}}break;case"down":i=t.nextElementSibling;if(i===null){i=r[0]}break;case"up":i=t.previousElementSibling;if(i===null){i=r[r.length-1]}break;case"bottom":i=r[r.length-1];break;case"top":default:i=r[0]}}if(i){t.removeAttribute("data-vim-selected");i.setAttribute("data-vim-selected","true");var c=i.querySelector("h3 a")||i.querySelector("a");if(c!==null){c.focus()}if(!e){f()}}}}function e(){document.location.reload(true)}function t(){if(document.activeElement){document.activeElement.blur()}}function i(t){return function(){var e=$('div#pagination button[type="submit"]');if(e.length!==2){console.log("page navigation with this theme is not supported");return}if(t>=0&&t<e.length){e[t].click()}else{console.log("pageButtonClick(): invalid argument")}}}function f(){var e=document.querySelector(".result[data-vim-selected]");if(e===null){return}var t=document.documentElement.scrollTop||document.body.scrollTop,n=document.documentElement.clientHeight,i=e.offsetTop,r=i+e.clientHeight,a=120;if(e.previousElementSibling===null&&r<n){window.scroll(window.scrollX,0);return}if(t>i-a){window.scroll(window.scrollX,i-a)}else{var o=t+n;if(o<r+a){window.scroll(window.scrollX,r-n+a)}}}function r(e){return function(){window.scrollBy(0,e);n("visible")()}}function a(e,t){return function(){window.scrollTo(0,e);n(t)()}}function o(){window.scrollTo(0,0);document.querySelector("#q").focus()}function s(n){return function(){var e=document.querySelector(".result[data-vim-selected] h3 a");if(e!==null){var t=e.getAttribute("href");if(n){window.open(t)}else{window.location.href=t}}}}function l(e){var n={};for(var t in d){var i=d[t];n[i.cat]=n[i.cat]||[];n[i.cat].push(i)}var r=Object.keys(n).sort(function(e,t){return n[t].length-n[e].length});if(r.length===0){return}var a='<a href="#" class="close" aria-label="close" title="close">×</a>';a+="<h3>How to navigate searx with Vim-like hotkeys</h3>";a+="<table>";for(var o=0;o<r.length;o++){var s=n[r[o]];var l=o===r.length-1;var u=o%2===0;if(u){a+="<tr>"}a+="<td>";a+="<h4>"+s[0].cat+"</h4>";a+='<ul class="list-unstyled">';for(var c in s){a+="<li><kbd>"+s[c].key+"</kbd> "+s[c].des+"</li>"}a+="</ul>";a+="</td>";if(!u||l){a+="</tr>"}}a+="</table>";e.innerHTML=a}function u(){var e=document.querySelector("#vim-hotkeys-help");console.log(e);if(e===undefined||e===null){e=document.createElement("div");e.id="vim-hotkeys-help";e.className="dialog-modal";e.style="width: 40%";l(e);var t=document.getElementsByTagName("body")[0];t.appendChild(e)}else{e.classList.toggle("invisible");return}}});(function(e,c,v){"use strict";v.ready(function(){v.on(".searx_overpass_request","click",function(e){this.classList.remove("searx_overpass_request");var t="https://overpass-api.de/api/interpreter?data=";var n=t+"[out:json][timeout:25];(";var i=");out meta;";var r=this.dataset.osmId;var a=this.dataset.osmType;var o=c.querySelector("#"+this.dataset.resultTable);var s=c.querySelector("#"+this.dataset.resultTableLoadicon);var l=["addr:city","addr:country","addr:housenumber","addr:postcode","addr:street"];if(r&&a&&o){var u=null;switch(a){case"node":u=n+"node("+r+");"+i;break;case"way":u=n+"way("+r+");"+i;break;case"relation":u=n+"relation("+r+");"+i;break;default:break}if(u){v.http("GET",u).then(function(e,t){e=JSON.parse(e);if(e&&e.elements&&e.elements[0]){var n=e.elements[0];var i="";for(var r in n.tags){if(n.tags.name===null||l.indexOf(r)==-1){i+="<tr><td>"+r+"</td><td>";switch(r){case"phone":case"fax":i+='<a href="tel:'+n.tags[r].replace(/ /g,"")+'">'+n.tags[r]+"</a>";break;case"email":i+='<a href="mailto:'+n.tags[r]+'">'+n.tags[r]+"</a>";break;case"website":case"url":i+='<a href="'+n.tags[r]+'">'+n.tags[r]+"</a>";break;case"wikidata":i+='<a href="https://www.wikidata.org/wiki/'+n.tags[r]+'">'+n.tags[r]+"</a>";break;case"wikipedia":if(n.tags[r].indexOf(":")!=-1){i+='<a href="https://'+n.tags[r].substring(0,n.tags[r].indexOf(":"))+".wikipedia.org/wiki/"+n.tags[r].substring(n.tags[r].indexOf(":")+1)+'">'+n.tags[r]+"</a>";break}default:i+=n.tags[r];break}i+="</td></tr>"}}s.parentNode.removeChild(s);o.classList.remove("invisible");o.querySelector("tbody").innerHTML=i}}).catch(function(){s.classList.remove("invisible");s.innerHTML="could not load data!"})}}e.preventDefault()});v.on(".searx_init_map","click",function(e){this.classList.remove("searx_init_map");var d=this.dataset.leafletTarget;var f=parseFloat(this.dataset.mapLon);var p=parseFloat(this.dataset.mapLat);var h=parseFloat(this.dataset.mapZoom);var m=JSON.parse(this.dataset.mapBoundingbox);var g=JSON.parse(this.dataset.mapGeojson);v.loadStyle("leaflet/leaflet.css");v.loadScript("leaflet/leaflet.js",function(){var e=null;if(m){var t=L.latLng(m[0],m[2]);var n=L.latLng(m[1],m[3]);e=L.latLngBounds(t,n)}var i=L.map(d);var r="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png";var a='Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';var o=new L.TileLayer(r,{minZoom:1,maxZoom:19,attribution:a});var s="https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png";var l='Wikimedia maps beta | Maps data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors';var u=new L.TileLayer(s,{minZoom:1,maxZoom:19,attribution:l});if(e){setTimeout(function(){i.fitBounds(e,{maxZoom:17})},0)}else if(f&&p){if(h){i.setView(new L.latLng(p,f),h)}else{i.setView(new L.latLng(p,f),8)}}i.addLayer(o);var c={"OSM Mapnik":o};L.control.layers(c).addTo(i);if(g){L.geoJson(g).addTo(i)}});e.preventDefault()})})})(window,document,window.searx);(function(e,o,t){"use strict";t.ready(function(){t.image_thumbnail_layout=new t.ImageLayout("#urls","#urls .result-images","img.image_thumbnail",200);t.image_thumbnail_layout.watch();t.on(".btn-collapse","click",function(e){var t=this.getAttribute("data-btn-text-collapsed");var n=this.getAttribute("data-btn-text-not-collapsed");var i=this.getAttribute("data-target");var r=o.querySelector(i);var a=this.innerHTML;if(this.classList.contains("collapsed")){a=a.replace(t,n)}else{a=a.replace(n,t)}this.innerHTML=a;this.classList.toggle("collapsed");r.classList.toggle("invisible")});t.on(".media-loader","click",function(e){var t=this.getAttribute("data-target");var n=o.querySelector(t+" > iframe");var i=n.getAttribute("src");if(i===null||i===undefined||i===false){n.setAttribute("src",n.getAttribute("data-src"))}});e.addEventListener("scroll",function(){var e=o.getElementById("backToTop"),t=document.documentElement.scrollTop||document.body.scrollTop;if(e!==null){if(t>=200){e.style.opacity=1}else{e.style.opacity=0}}})})})(window,document,window.searx);(function(t,i,n){"use strict";var r=true,a="q",o;function s(e){if(e.setSelectionRange){var t=e.value.length;e.setSelectionRange(t,t)}}function l(){if(o.value.length>0){var e=document.getElementById("search");setTimeout(e.submit.bind(e),0)}}function u(e){var t=document.getElementById("clear_search");var n=function(){if(e.value.length===0){t.classList.add("empty")}else{t.classList.remove("empty")}};n();t.addEventListener("click",function(){e.value="";e.focus();n()});e.addEventListener("keyup",n,false)}n.ready(function(){o=i.getElementById(a);function e(e){if(r){s(o);r=false}else{}}if(o!==null){u(o);if(n.autocompleter){n.autocomplete=AutoComplete.call(t,{Url:"./autocompleter",EmptyMessage:n.no_item_found,HttpMethod:n.method,MinChars:4,Delay:300},"#"+a);t.addEventListener("resize",function(){var e=new CustomEvent("position");o.dispatchEvent(e)})}o.addEventListener("focus",e,false);o.focus()}if(o!==null&&n.search_on_category_select){i.querySelector(".help").className="invisible";n.on("#categories input","change",function(e){var t,n=i.querySelectorAll('#categories input[type="checkbox"]');for(t=0;t<n.length;t++){if(n[t]!==this&&n[t].checked){n[t].click()}}if(!this.checked){this.click()}l();return false});n.on(i.getElementById("time_range"),"change",l);n.on(i.getElementById("language"),"change",l)}})})(window,document,window.searx);
//# sourceMappingURL=searx.min.js.map \ No newline at end of file
diff --git a/searx/static/themes/simple/js/searx.min.js.map b/searx/static/themes/simple/js/searx.min.js.map
index 5528c1e50..d7a1eeac8 100644
--- a/searx/static/themes/simple/js/searx.min.js.map
+++ b/searx/static/themes/simple/js/searx.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["searx.js"],"names":["w","d","searx","Element","ElementPrototype","matches","matchesSelector","webkitMatchesSelector","msMatchesSelector","selector","node","this","nodes","parentNode","document","querySelectorAll","i","prototype","callbackSafe","callback","el","e","call","exception","console","log","on","obj","eventType","useCapture","addEventListener","target","srcElement","found","parentElement","ready","readyState","bind","http","method","url","req","XMLHttpRequest","resolve","reject","promise","then","catch","open","onload","status","response","responseType","Error","statusText","onerror","onabort","send","ex","loadStyle","src","path","staticPath","id","replace","s","getElementById","createElement","setAttribute","body","appendChild","loadScript","hasAttribute","apply","insertBefore","newNode","referenceNode","element","insertAfter","nextSibling","classList","add","window","f","exports","module","define","amd","g","global","self","AutoComplete","t","n","r","o","u","a","require","code","l","length","1","ConditionOperator","EventType","params","Array","isArray","forEach","elements","input","specificParams","merge","defaults","DOMResults","create","Input","nodeName","match","getAttribute","_Position","$Listeners","blur","_Blur","destroy","focus","_Focus","keyup","event","KEYUP","keydown","KEYDOWN","position","getEventsByType","type","mappings","key","KeyboardMappings","Event","undefined","eventIdentifier","condition","mapping","Operator","AND","OR","Not","hasOwnProperty","Is","keyCode","From","To","name","Conditions","Callback","makeRequest","propertyHttpHeaders","Object","getOwnPropertyNames","HttpHeaders","request","_HttpMethod","_Url","queryParams","_Pre","queryParamsStringify","encodeURIComponent","_QueryArg","indexOf","setRequestHeader","onreadystatechange","$Cache","ajax","timeout","$AjaxTimer","clearTimeout","setTimeout","Delay","Request","abort","cache","_Cache","removeEventListener","removeChild","tmp","arguments","EmptyMessage","Highlight","getRegex","value","RegExp","transform","Content-type","Limit","MinChars","HttpMethod","QueryArg","Url","Enter","liActive","querySelector","preventDefault","_Select","KeyUpAndDown_down","KeyUpAndDown_up","first","last","active","currentIndex","children","lisCount","getElementsByTagName","remove","item","AlphaNum","oldValue","currentValue","_MinChars","_Render","_Post","_Open","_EmptyMessage","emptyMessage","_Limit","limit","isNaN","parseInt","minchars","_Highlight","label","now","li","onclick","onmouseenter","offsetTop","offsetHeight","offsetLeft","clientWidth","ul","_RenderRaw","_RenderResponseItems","hasChildNodes","childNodes","reverse","Math","min","abs","innerHTML","Label","Value","returnResponse","json","JSON","parse","keys","push","ImageLayout","container_selector","results_selector","img_selector","maxHeight","margin","_alignAllDone","_getHeigth","images","width","img","naturalWidth","naturalHeight","_setSize","height","imgWidth","imagesLength","style","marginLeft","marginTop","marginRight","marginBottom","_alignImgs","imgGroup","slice","h","containerWidth","align","results_selectorNode","results_length","previous","current","previousElementSibling","watch","imgNodeLength","results_nodes","throttleAlign","highlightResult","contains","vimKeys","27","fun","removeFocus","des","cat","73","searchInputFocus","66","scrollPage","innerHeight","70","85","68","71","scrollPageTo","scrollHeight","86","75","74","80","pageButtonClick","78","79","openResult","84","82","reloadPage","72","toggleHelp","ctrlKey","altKey","shiftKey","metaKey","tagName","toLowerCase","which","noScroll","effectiveWhich","next","results","top","documentElement","scrollTop","bot","clientHeight","etop","ebot","nextElementSibling","removeAttribute","link","scrollPageToSelected","location","reload","activeElement","num","buttons","$","click","sel","wtop","wheight","offset","scroll","scrollX","wbot","amount","scrollBy","nav","scrollTo","newTab","href","initHelpContent","divElement","categories","k","sorted","sort","b","html","lastCategory","cj","helpPanel","className","toggle","overpass_url","query_start","query_end","osm_id","dataset","osmId","osm_type","osmType","result_table","resultTable","result_table_loadicon","resultTableLoadicon","osm_ignore_tags","query","contentType","newHtml","row","tags","substring","leaflet_target","leafletTarget","map_lon","parseFloat","mapLon","map_lat","mapLat","map_zoom","mapZoom","map_boundingbox","mapBoundingbox","map_geojson","mapGeojson","map_bounds","southWest","L","latLng","northEast","latLngBounds","map","osmMapnikUrl","osmMapnikAttrib","osmMapnik","TileLayer","minZoom","maxZoom","attribution","osmWikimediaUrl","osmWikimediaAttrib","osmWikimedia","fitBounds","setView","addLayer","baseLayers","OSM Mapnik","control","layers","addTo","geoJson","image_thumbnail_layout","btnLabelCollapsed","btnLabelNotCollapsed","targetElement","iframe_load","srctest","opacity","firstFocus","qinput_id","qinput","placeCursorAtEnd","setSelectionRange","len","submitIfQuery","search","submit","createClearButton","cs","updateClearButton","placeCursorAtEndOnce","autocompleter","autocomplete","noItemFound","CustomEvent","dispatchEvent","search_on_category_select","checked"],"mappings":";;CAiBA,SAAUA,EAAGC,EAAGC,GAEd,aAMA,GAAIF,EAAEG,QAAS,EACb,SAAUC,GACRA,EAAiBC,QAAUD,EAAiBC,SAC5CD,EAAiBE,iBACjBF,EAAiBG,uBACjBH,EAAiBI,mBACjB,SAASC,GACP,IAAIC,EAAOC,KAAMC,GAASF,EAAKG,YAAcH,EAAKI,UAAUC,iBAAiBN,GAAWO,GAAK,EAC7F,MAAOJ,IAAQI,IAAMJ,EAAMI,IAAMN,GACjC,QAASE,EAAMI,KARnB,CAUGb,QAAQc,WAGb,SAASC,EAAaC,EAAUC,EAAIC,GAClC,IACEF,EAASG,KAAKF,EAAIC,GAClB,MAAOE,GACPC,QAAQC,IAAIF,IAIhBrB,EAAQA,MAERA,EAAMwB,GAAK,SAASC,EAAKC,EAAWT,EAAUU,GAC5CA,EAAaA,GAAc,MAC3B,UAAWF,IAAQ,SAAU,CAE3BA,EAAIG,iBAAiBF,EAAWT,EAAUU,OACrC,CAEL5B,EAAE6B,iBAAiBF,EAAW,SAASP,GACrC,IAAID,EAAKC,EAAEU,QAAUV,EAAEW,WAAYC,EAAQ,MAC3C,MAAOb,GAAMA,EAAGf,SAAWe,IAAOnB,KAAOgC,EAAQb,EAAGf,QAAQsB,IAAOP,EAAKA,EAAGc,cAC3E,GAAID,EAAOf,EAAaC,EAAUC,EAAIC,IACrCQ,KAIP3B,EAAMiC,MAAQ,SAAShB,GACrB,GAAIL,SAASsB,YAAc,UAAW,CACpCjB,EAASG,KAAKtB,OACT,CACLA,EAAE8B,iBAAiB,mBAAoBX,EAASkB,KAAKrC,MAIzDE,EAAMoC,KAAO,SAASC,EAAQC,EAAKrB,GACjC,IAAIsB,EAAM,IAAIC,eACdC,EAAU,aACVC,EAAS,aACTC,GACEC,KAAM,SAAS3B,GAAYwB,EAAUxB,EAAU,OAAO0B,GACtDE,MAAO,SAAS5B,GAAYyB,EAASzB,EAAU,OAAO0B,IAGxD,IACEJ,EAAIO,KAAKT,EAAQC,EAAK,MAGtBC,EAAIQ,OAAS,WACX,GAAIR,EAAIS,QAAU,IAAK,CACrBP,EAAQF,EAAIU,SAAUV,EAAIW,kBACrB,CACLR,EAAOS,MAAMZ,EAAIa,eAKrBb,EAAIc,QAAU,WACZX,EAAOS,MAAM,mBAGfZ,EAAIe,QAAU,WACZZ,EAAOS,MAAM,4BAIfZ,EAAIgB,OACJ,MAAOC,GACPd,EAAOc,GAGT,OAAOb,GAGT3C,EAAMyD,UAAY,SAASC,GACzB,IAAIC,EAAO3D,EAAM4D,WAAaF,EAC9BG,EAAK,SAAWH,EAAII,QAAQ,IAAK,KACjCC,EAAIhE,EAAEiE,eAAeH,GACrB,GAAIE,IAAM,KAAM,CACdA,EAAIhE,EAAEkE,cAAc,QACpBF,EAAEG,aAAa,KAAML,GACrBE,EAAEG,aAAa,MAAO,cACtBH,EAAEG,aAAa,OAAQ,YACvBH,EAAEG,aAAa,OAAQP,GACvB5D,EAAEoE,KAAKC,YAAYL,KAIvB/D,EAAMqE,WAAa,SAASX,EAAKzC,GAC/B,IAAI0C,EAAO3D,EAAM4D,WAAaF,EAC9BG,EAAK,UAAYH,EAAII,QAAQ,IAAK,KAClCC,EAAIhE,EAAEiE,eAAeH,GACrB,GAAIE,IAAM,KAAM,CACdA,EAAIhE,EAAEkE,cAAc,UACpBF,EAAEG,aAAa,KAAML,GACrBE,EAAEG,aAAa,MAAOP,GACtBI,EAAEhB,OAAS9B,EACX8C,EAAEV,QAAU,WACVU,EAAEG,aAAa,QAAS,MAE1BnE,EAAEoE,KAAKC,YAAYL,QACd,IAAKA,EAAEO,aAAa,SAAU,CACnC,IACErD,EAASsD,MAAMR,MACf,MAAO1C,GACPC,QAAQC,IAAIF,QAET,CACLC,QAAQC,IAAI,mCAAqCoC,EAAO,mBAI5D3D,EAAMwE,aAAe,SAAUC,EAASC,GACtCC,QAAQhE,WAAW6D,aAAaC,EAASC,IAG3C1E,EAAM4E,YAAc,SAASH,EAASC,GACpCA,EAAc/D,WAAW6D,aAAaC,EAASC,EAAcG,cAG/D7E,EAAMwB,GAAG,SAAU,QAAS,SAASL,GACnC,IAAID,EAAKC,EAAEU,QAAUV,EAAEW,WACvBrB,KAAKE,WAAWmE,UAAUC,IAAI,eAGhC,OAAO/E,GAjJT,CAkJGgF,OAAQpE,SAAUoE,OAAOhF,QAC3B,SAAUiF,GAAG,UAAUC,UAAU,iBAAiBC,SAAS,YAAY,CAACA,OAAOD,QAAQD,SAAS,UAAUG,SAAS,YAAYA,OAAOC,IAAI,CAACD,UAAUH,OAAO,CAAC,IAAIK,EAAE,UAAUN,SAAS,YAAY,CAACM,EAAEN,YAAY,UAAUO,SAAS,YAAY,CAACD,EAAEC,YAAY,UAAUC,OAAO,YAAY,CAACF,EAAEE,SAAS,CAACF,EAAE7E,KAAK6E,EAAEG,aAAeR,MAAjU,CAAwU,WAAW,IAAIG,EAAOD,EAAOD,EAAQ,OAAO,SAAU/D,EAAEuE,EAAEC,EAAEC,GAAG,SAAS7B,EAAE8B,EAAEC,GAAG,IAAIH,EAAEE,GAAG,CAAC,IAAIH,EAAEG,GAAG,CAAC,IAAIE,SAASC,SAAS,YAAYA,QAAQ,IAAIF,GAAGC,EAAE,OAAOA,EAAEF,GAAG,GAAG,GAAG/E,EAAE,OAAOA,EAAE+E,GAAG,GAAG,IAAIZ,EAAE,IAAI9B,MAAM,uBAAuB0C,EAAE,KAAK,MAAMZ,EAAEgB,KAAK,mBAAmBhB,EAAE,IAAIiB,EAAEP,EAAEE,IAAIX,YAAYQ,EAAEG,GAAG,GAAGzE,KAAK8E,EAAEhB,QAAQ,SAAS/D,GAAG,IAAIwE,EAAED,EAAEG,GAAG,GAAG1E,GAAG,OAAO4C,EAAE4B,EAAEA,EAAExE,IAAI+E,EAAEA,EAAEhB,QAAQ/D,EAAEuE,EAAEC,EAAEC,GAAG,OAAOD,EAAEE,GAAGX,QAAQ,IAAIpE,SAASkF,SAAS,YAAYA,QAAQ,IAAI,IAAIH,EAAE,EAAEA,EAAED,EAAEO,OAAON,IAAI9B,EAAE6B,EAAEC,IAAI,OAAO9B,EAAvb,EAA4bqC,GAAG,SAASJ,EAAQb,EAAOD;;;;;;;;;AAU50B,aACA,IAAImB,GACJ,SAAWA,GACPA,EAAkBA,EAAkB,OAAS,GAAK,MAClDA,EAAkBA,EAAkB,MAAQ,GAAK,MAFrD,CAGGA,IAAsBA,OACzB,IAAIC,GACJ,SAAWA,GACPA,EAAUA,EAAU,WAAa,GAAK,UACtCA,EAAUA,EAAU,SAAW,GAAK,SAFxC,CAGGA,IAAcA,OAOjB,IAAIb,EAAgB,WAEhB,SAASA,EAAac,EAAQhG,GAC1B,GAAIgG,SAAgB,EAAG,CAAEA,KACzB,GAAIhG,SAAkB,EAAG,CAAEA,EAAW,sBACtC,GAAIiG,MAAMC,QAAQlG,GAAW,CACzBA,EAASmG,QAAQ,SAAU3C,GACvB,IAAI0B,EAAac,EAAQxC,UAG5B,UAAWxD,GAAY,SAAU,CAClC,IAAIoG,EAAW/F,SAASC,iBAAiBN,GACzCiG,MAAMzF,UAAU2F,QAAQtF,KAAKuF,EAAU,SAAUC,GAC7C,IAAInB,EAAac,EAAQK,SAG5B,CACD,IAAIC,EAAiBpB,EAAaqB,MAAMrB,EAAasB,SAAUR,GAC3DS,WAAYpG,SAASqD,cAAc,SAEvCwB,EAAa1E,UAAUkG,OAAOJ,EAAgBtG,GAC9C,OAAOsG,GAGfpB,EAAa1E,UAAUkG,OAAS,SAAUV,EAAQ5B,GAC9C4B,EAAOW,MAAQvC,EACf,GAAI4B,EAAOW,MAAMC,SAASC,MAAM,cAAgBb,EAAOW,MAAM5C,aAAa,UAAY,OAASiC,EAAOW,MAAMG,aAAa,QAAQD,MAAM,mBAAoB,CACvJb,EAAOW,MAAMhD,aAAa,eAAgB,OAC1CqC,EAAOe,UAAUf,GACjBA,EAAOW,MAAMvG,WAAWyD,YAAYmC,EAAOS,YAC3CT,EAAOgB,YACHC,KAAMjB,EAAOkB,MAAMtF,KAAKoE,GACxBmB,QAASjC,EAAa1E,UAAU2G,QAAQvF,KAAK,KAAMoE,GACnDoB,MAAOpB,EAAOqB,OAAOzF,KAAKoE,GAC1BsB,MAAOpC,EAAa1E,UAAU+G,MAAM3F,KAAK,KAAMoE,EAAQD,EAAUyB,OACjEC,QAASvC,EAAa1E,UAAU+G,MAAM3F,KAAK,KAAMoE,EAAQD,EAAU2B,SACnEC,SAAU3B,EAAOe,UAAUnF,KAAKoE,IAEpC,IAAK,IAAIuB,KAASvB,EAAOgB,WAAY,CACjChB,EAAOW,MAAMtF,iBAAiBkG,EAAOvB,EAAOgB,WAAWO,OAInErC,EAAa1E,UAAUoH,gBAAkB,SAAU5B,EAAQ6B,GACvD,IAAIC,KACJ,IAAK,IAAIC,KAAO/B,EAAOgC,iBAAkB,CACrC,IAAIT,EAAQxB,EAAUyB,MACtB,GAAIxB,EAAOgC,iBAAiBD,GAAKE,QAAUC,UAAW,CAClDX,EAAQvB,EAAOgC,iBAAiBD,GAAKE,MAEzC,GAAIV,GAASM,EAAM,CACfC,EAASC,GAAO/B,EAAOgC,iBAAiBD,IAGhD,OAAOD,GAEX5C,EAAa1E,UAAU+G,MAAQ,SAAUvB,EAAQ6B,EAAMN,GACnD,IAAIY,EAAkB,SAAUC,GAC5B,GAAKvB,IAAU,MAAQwB,EAAQC,UAAYxC,EAAkByC,KAAS1B,IAAU,OAASwB,EAAQC,UAAYxC,EAAkB0C,GAAK,CAChIJ,EAAYlD,EAAaqB,OACrBkC,IAAK,OACNL,GACH,GAAIA,EAAUM,eAAe,MAAO,CAChC,GAAIN,EAAUO,IAAMpB,EAAMqB,QAAS,CAC/B/B,GAASuB,EAAUK,QAElB,CACD5B,EAAQuB,EAAUK,UAGrB,GAAIL,EAAUM,eAAe,SAAWN,EAAUM,eAAe,MAAO,CACzE,GAAInB,EAAMqB,SAAWR,EAAUS,MAAQtB,EAAMqB,SAAWR,EAAUU,GAAI,CAClEjC,GAASuB,EAAUK,QAElB,CACD5B,EAAQuB,EAAUK,QAKlC,IAAK,IAAIM,KAAQ7D,EAAa1E,UAAUoH,gBAAgB5B,EAAQ6B,GAAO,CACnE,IAAIQ,EAAUnD,EAAaqB,OACvB+B,SAAUxC,EAAkByC,KAC7BvC,EAAOgC,iBAAiBe,IAAQlC,EAAQf,EAAkByC,KAAOF,EAAQC,SAC5ED,EAAQW,WAAW7C,QAAQgC,GAC3B,GAAItB,IAAU,KAAM,CAChBwB,EAAQY,SAASpI,KAAKmF,EAAQuB,MAI1CrC,EAAa1E,UAAU0I,YAAc,SAAUlD,EAAQtF,GACnD,IAAIyI,EAAsBC,OAAOC,oBAAoBrD,EAAOsD,aAAcC,EAAU,IAAItH,eAAkBH,EAASkE,EAAOwD,cAAezH,EAAMiE,EAAOyD,OAAQC,EAAc1D,EAAO2D,OAAQC,EAAuBC,mBAAmB7D,EAAO8D,aAAe,IAAMD,mBAAmBH,GACpR,GAAI5H,EAAO+E,MAAM,UAAW,CACxB,GAAI9E,EAAIgI,QAAQ,QAAU,EAAG,CACzBhI,GAAO,IAAM6H,MAEZ,CACD7H,GAAO,IAAM6H,GAGrBL,EAAQhH,KAAKT,EAAQC,EAAK,MAC1B,IAAK,IAAIxB,EAAI4I,EAAoBvD,OAAS,EAAGrF,GAAK,EAAGA,IAAK,CACtDgJ,EAAQS,iBAAiBb,EAAoB5I,GAAIyF,EAAOsD,YAAYH,EAAoB5I,KAE5FgJ,EAAQU,mBAAqB,WACzB,GAAIV,EAAQ5H,YAAc,GAAK4H,EAAQ9G,QAAU,IAAK,CAClDuD,EAAOkE,OAAOR,GAAeH,EAAQ7G,SACrChC,EAAS6I,EAAQ7G,YAGzB,OAAO6G,GAEXrE,EAAa1E,UAAU2J,KAAO,SAAUnE,EAAQuD,EAASa,GACrD,GAAIA,SAAiB,EAAG,CAAEA,EAAU,KACpC,GAAIpE,EAAOqE,WAAY,CACnB5F,OAAO6F,aAAatE,EAAOqE,YAE/B,GAAID,IAAY,KAAM,CAClBpE,EAAOqE,WAAa5F,OAAO8F,WAAWrF,EAAa1E,UAAU2J,KAAKvI,KAAK,KAAMoE,EAAQuD,EAAS,OAAQvD,EAAOwE,WAE5G,CACD,GAAIxE,EAAOyE,QAAS,CAChBzE,EAAOyE,QAAQC,QAEnB1E,EAAOyE,QAAUlB,EACjBvD,EAAOyE,QAAQzH,KAAKgD,EAAO8D,YAAc,IAAM9D,EAAO2D,UAG9DzE,EAAa1E,UAAUmK,MAAQ,SAAU3E,EAAQtF,GAC7C,IAAIgC,EAAWsD,EAAO4E,OAAO5E,EAAO2D,QACpC,GAAIjH,IAAawF,UAAW,CACxB,IAAIqB,EAAUrE,EAAa1E,UAAU0I,YAAYlD,EAAQtF,GACzDwE,EAAa1E,UAAU2J,KAAKnE,EAAQuD,OAEnC,CACD7I,EAASgC,KAGjBwC,EAAa1E,UAAU2G,QAAU,SAAUnB,GACvC,IAAK,IAAIuB,KAASvB,EAAOgB,WAAY,CACjChB,EAAOW,MAAMkE,oBAAoBtD,EAAOvB,EAAOgB,WAAWO,IAE9DvB,EAAOS,WAAWrG,WAAW0K,YAAY9E,EAAOS,aAEpD,OAAOvB,EAhJQ,GAkJnBA,EAAaqB,MAAQ,WACjB,IAAIA,KAAYwE,EAChB,IAAK,IAAIxK,EAAI,EAAGA,EAAIyK,UAAUpF,OAAQrF,IAAK,CACvC,IAAKwK,KAAOC,UAAUzK,GAAI,CACtBgG,EAAMwE,GAAOC,UAAUzK,GAAGwK,IAGlC,OAAOxE,GAEXrB,EAAasB,UACTgE,MAAO,IACPS,aAAc,iBACdC,WACIC,SAAU,SAAUC,GAChB,OAAO,IAAIC,OAAOD,EAAO,OAE7BE,UAAW,SAAUF,GACjB,MAAO,WAAaA,EAAQ,cAGpC9B,aACIiC,eAAgB,qCAEpBC,MAAO,EACPC,SAAU,EACVC,WAAY,MACZC,SAAU,IACVC,IAAK,KACL5D,kBACI6D,OACI7C,aACQL,GAAI,GACJF,IAAK,QAEbQ,SAAU,SAAU1B,GAChB,GAAIrH,KAAKuG,WAAWK,aAAa,SAASiD,QAAQ,UAAY,EAAG,CAC7D,IAAI+B,EAAW5L,KAAKuG,WAAWsF,cAAc,aAC7C,GAAID,IAAa,KAAM,CACnBvE,EAAMyE,iBACN9L,KAAK+L,QAAQH,GACb5L,KAAKuG,WAAW9C,aAAa,QAAS,mBAIlD2E,SAAUxC,EAAkByC,IAC5BN,MAAOlC,EAAU2B,SAErBwE,mBACIlD,aACQL,GAAI,GACJF,IAAK,QAGLE,GAAI,GACJF,IAAK,QAEbQ,SAAU,SAAU1B,GAChBA,EAAMyE,kBAEV1D,SAAUxC,EAAkB0C,GAC5BP,MAAOlC,EAAU2B,SAErByE,iBACInD,aACQL,GAAI,GACJF,IAAK,QAGLE,GAAI,GACJF,IAAK,QAEbQ,SAAU,SAAU1B,GAChBA,EAAMyE,iBACN,IAAII,EAAQlM,KAAKuG,WAAWsF,cAAc,+BAAgCM,EAAOnM,KAAKuG,WAAWsF,cAAc,8BAA+BO,EAASpM,KAAKuG,WAAWsF,cAAc,aACrL,GAAIO,EAAQ,CACR,IAAIC,EAAetG,MAAMzF,UAAUuJ,QAAQlJ,KAAKyL,EAAOlM,WAAWoM,SAAUF,GAAS3E,EAAW4E,GAAgBhF,EAAMqB,QAAU,IAAK6D,EAAWvM,KAAKuG,WAAWiG,qBAAqB,MAAM9G,OAC3L,GAAI+B,EAAW,EAAG,CACdA,EAAW8E,EAAW,OAErB,GAAI9E,GAAY8E,EAAU,CAC3B9E,EAAW,EAEf2E,EAAO/H,UAAUoI,OAAO,UACxBL,EAAO7K,cAAc+K,SAASI,KAAKjF,GAAUpD,UAAUC,IAAI,eAE1D,GAAI6H,GAAQ9E,EAAMqB,SAAW,GAAI,CAClCyD,EAAK9H,UAAUC,IAAI,eAElB,GAAI4H,EAAO,CACZA,EAAM7H,UAAUC,IAAI,YAG5B8D,SAAUxC,EAAkB0C,GAC5BP,MAAOlC,EAAUyB,OAErBqF,UACI7D,aACQL,GAAI,GACJF,IAAK,OAELI,KAAM,GACNC,GAAI,GACJL,IAAK,OAEbQ,SAAU,WACN,IAAI6D,EAAW5M,KAAKyG,MAAMG,aAAa,+BAAgCiG,EAAe7M,KAAKyJ,OAC3F,GAAIoD,IAAiB,IAAMA,EAAanH,QAAU1F,KAAK8M,YAAa,CAChE,IAAKF,GAAYC,GAAgBD,EAAU,CACvC5M,KAAKuG,WAAW9C,aAAa,QAAS,qBAE1CuB,EAAa1E,UAAUmK,MAAMzK,KAAM,SAAUwC,GACzCxC,KAAK+M,QAAQ/M,KAAKgN,MAAMxK,IACxBxC,KAAKiN,SACPvL,KAAK1B,SAGfoI,SAAUxC,EAAkByC,IAC5BN,MAAOlC,EAAUyB,QAGzBf,WAAY,KACZgE,QAAS,KACT9D,MAAO,KAIPyG,cAAe,WACX,IAAIC,EAAe,GACnB,GAAInN,KAAKyG,MAAM5C,aAAa,mCAAoC,CAC5DsJ,EAAenN,KAAKyG,MAAMG,aAAa,wCAEtC,GAAI5G,KAAK+K,eAAiB,MAAO,CAClCoC,EAAenN,KAAK+K,iBAEnB,CACDoC,EAAe,GAEnB,OAAOA,GAKXC,OAAQ,WACJ,IAAIC,EAAQrN,KAAKyG,MAAMG,aAAa,2BACpC,GAAI0G,MAAMD,IAAUA,IAAU,KAAM,CAChC,OAAOrN,KAAKsL,MAEhB,OAAOiC,SAASF,EAAO,KAK3BP,UAAW,WACP,IAAIU,EAAWxN,KAAKyG,MAAMG,aAAa,8BACvC,GAAI0G,MAAME,IAAaA,IAAa,KAAM,CACtC,OAAOxN,KAAKuL,SAEhB,OAAOgC,SAASC,EAAU,KAK9BC,WAAY,SAAUC,GAClB,OAAOA,EAAMrK,QAAQrD,KAAKgL,UAAUC,SAASjL,KAAKyJ,QAASzJ,KAAKgL,UAAUI,YAK9E9B,YAAa,WACT,GAAItJ,KAAKyG,MAAM5C,aAAa,4BAA6B,CACrD,OAAO7D,KAAKyG,MAAMG,aAAa,4BAEnC,OAAO5G,KAAKwL,YAKhB5B,UAAW,WACP,GAAI5J,KAAKyG,MAAM5C,aAAa,gCAAiC,CACzD,OAAO7D,KAAKyG,MAAMG,aAAa,gCAEnC,OAAO5G,KAAKyL,UAKhBlC,KAAM,WACF,GAAIvJ,KAAKyG,MAAM5C,aAAa,qBAAsB,CAC9C,OAAO7D,KAAKyG,MAAMG,aAAa,qBAEnC,OAAO5G,KAAK0L,KAKhB1E,MAAO,SAAU2G,GACb,GAAIA,IAAQ,KAAM,CACd3N,KAAKuG,WAAW9C,aAAa,QAAS,gBACtCzD,KAAKyG,MAAMhD,aAAa,8BAA+BzD,KAAKyG,MAAMyE,WAEjE,CACD,IAAIpF,EAAS9F,KACbqK,WAAW,WACPvE,EAAOkB,MAAM,OACd,OAMX0D,OAAQ,SAAUQ,GACd,OAAOlL,KAAKgK,OAAOkB,IAKvB/D,OAAQ,WACJ,IAAIyF,EAAW5M,KAAKyG,MAAMG,aAAa,+BACvC,KAAMgG,GAAY5M,KAAKyG,MAAMyE,OAAS0B,IAAa5M,KAAK8M,aAAe9M,KAAKyG,MAAMyE,MAAMxF,OAAQ,CAC5F1F,KAAKuG,WAAW9C,aAAa,QAAS,uBAM9CwJ,MAAO,WACH,IAAInH,EAAS9F,KACb+F,MAAMzF,UAAU2F,QAAQtF,KAAKX,KAAKuG,WAAWiG,qBAAqB,MAAO,SAAUoB,GAC/E,GAAIA,EAAGhH,aAAa,UAAY,SAAU,CACxCgH,EAAGC,QAAU,SAAUxG,GACjBvB,EAAOiG,QAAQ6B,IAEnBA,EAAGE,aAAe,WACd,IAAI1B,EAAStG,EAAOS,WAAWsF,cAAc,aAC7C,GAAIO,IAAWwB,EAAI,CACf,GAAIxB,IAAW,KAAM,CACjBA,EAAO/H,UAAUoI,OAAO,UAE5BmB,EAAGvJ,UAAUC,IAAI,gBASrCuC,UAAW,WACP7G,KAAKuG,WAAW9C,aAAa,QAAS,gBACtCzD,KAAKuG,WAAW9C,aAAa,QAAS,QAAUzD,KAAKyG,MAAMsH,UAAY/N,KAAKyG,MAAMuH,cAAgB,WAAahO,KAAKyG,MAAMwH,WAAa,YAAcjO,KAAKyG,MAAMyH,YAAc,QAKlLnB,QAAS,SAAUvK,GACf,IAAI2L,EACJ,UAAW3L,GAAY,SAAU,CAC7B2L,EAAKnO,KAAKoO,WAAW5L,OAEpB,CACD2L,EAAKnO,KAAKqO,qBAAqB7L,GAEnC,GAAIxC,KAAKuG,WAAW+H,gBAAiB,CACjCtO,KAAKuG,WAAWqE,YAAY5K,KAAKuG,WAAWgI,WAAW,IAE3DvO,KAAKuG,WAAW5C,YAAYwK,IAKhCE,qBAAsB,SAAU7L,GAC5B,IAAI2L,EAAKhO,SAASqD,cAAc,MAAOoK,EAAKzN,SAASqD,cAAc,MAAO6J,EAAQrN,KAAKoN,SAEvF,GAAIC,EAAQ,EAAG,CACX7K,EAAWA,EAASgM,eAEnB,GAAInB,IAAU,EAAG,CAClBA,EAAQ7K,EAASkD,OAErB,IAAK,IAAIgH,EAAO,EAAGA,EAAO+B,KAAKC,IAAID,KAAKE,IAAItB,GAAQ7K,EAASkD,QAASgH,IAAQ,CAC1EkB,EAAGgB,UAAYpM,EAASkK,GAAMmC,MAC9BjB,EAAGnK,aAAa,0BAA2BjB,EAASkK,GAAMoC,OAC1DX,EAAGxK,YAAYiK,GACfA,EAAKzN,SAASqD,cAAc,MAEhC,OAAO2K,GAKXC,WAAY,SAAU5L,GAClB,IAAI2L,EAAKhO,SAASqD,cAAc,MAAOoK,EAAKzN,SAASqD,cAAc,MACnE,GAAIhB,EAASkD,OAAS,EAAG,CACrB1F,KAAKuG,WAAWqI,UAAYpM,MAE3B,CACD,IAAI2K,EAAenN,KAAKkN,gBACxB,GAAIC,IAAiB,GAAI,CACrBS,EAAGgB,UAAYzB,EACfS,EAAGnK,aAAa,QAAS,UACzB0K,EAAGxK,YAAYiK,IAGvB,OAAOO,GAKXnB,MAAO,SAAUxK,GACb,IACI,IAAIuM,KAEJ,IAAIC,EAAOC,KAAKC,MAAM1M,GACtB,GAAI0G,OAAOiG,KAAKH,GAAMtJ,SAAW,EAAG,CAChC,MAAO,GAEX,GAAIK,MAAMC,QAAQgJ,GAAO,CACrB,IAAK,IAAI3O,EAAI,EAAGA,EAAI6I,OAAOiG,KAAKH,GAAMtJ,OAAQrF,IAAK,CAC/C0O,EAAeA,EAAerJ,SAAYoJ,MAASE,EAAK3O,GAAIwO,MAAS7O,KAAKyN,WAAWuB,EAAK3O,UAG7F,CACD,IAAK,IAAI6K,KAAS8D,EAAM,CACpBD,EAAeK,MACXN,MAAS5D,EACT2D,MAAS7O,KAAKyN,WAAWuB,EAAK9D,OAI1C,OAAO6D,EAEX,MAAO1H,GAEH,OAAO7E,IAMfiH,KAAM,WACF,OAAOzJ,KAAKyG,MAAMyE,OAKtBa,QAAS,SAAUW,GACtB7L,QAAQC,IAAI,kBACL,GAAI4L,EAAK7I,aAAa,2BAA4B,CAC9C7D,KAAKyG,MAAMyE,MAAQwB,EAAK9F,aAAa,+BAEpC,CACD5G,KAAKyG,MAAMyE,MAAQwB,EAAKkC,UAE5B5O,KAAKyG,MAAMhD,aAAa,8BAA+BzD,KAAKyG,MAAMyE,QAEtEf,WAAY,KACZH,UACAlD,eAEJpC,EAAOD,QAAUO,YAEN,IAAI;;;;;;;;;;CAYf,SAAU3F,EAAGC,GACX,aAEA,SAAS+P,EAAYC,EAAoBC,EAAkBC,EAAcC,GACvEzP,KAAKsP,mBAAqBA,EAC1BtP,KAAKuP,iBAAmBA,EACxBvP,KAAKwP,aAAeA,EACpBxP,KAAK0P,OAAS,GACd1P,KAAKyP,UAAYA,EACjBzP,KAAK2P,cAAgB,KAcvBN,EAAY/O,UAAUsP,WAAa,SAASC,EAAQC,GAClD,IAAI3K,EAAI,EACR4K,EAEAD,GAASD,EAAOnK,OAAS1F,KAAK0P,OAC9B,IAAK,IAAIrP,EAAI,EAAGA,EAAIwP,EAAOnK,OAAQrF,IAAK,CACtC0P,EAAMF,EAAOxP,GACb,GAAK0P,EAAIC,aAAe,GAAOD,EAAIE,cAAgB,EAAI,CACrD9K,GAAK4K,EAAIC,aAAeD,EAAIE,kBACvB,CAEL9K,GAAK,GAIT,OAAO2K,EAAQ3K,GAGjBkK,EAAY/O,UAAU4P,SAAW,SAASL,EAAQM,GAChD,IAAIJ,EAAKK,EAAUC,EAAeR,EAAOnK,OACzC,IAAK,IAAIrF,EAAI,EAAGA,EAAIgQ,EAAchQ,IAAK,CACrC0P,EAAMF,EAAOxP,GACb,GAAK0P,EAAIC,aAAe,GAAOD,EAAIE,cAAgB,EAAI,CACrDG,EAAWD,EAASJ,EAAIC,aAAeD,EAAIE,kBACtC,CAELG,EAAWD,EAEbJ,EAAIO,MAAMR,MAAQM,EAAW,KAC7BL,EAAIO,MAAMH,OAASA,EAAS,KAC5BJ,EAAIO,MAAMC,WAAa,MACvBR,EAAIO,MAAME,UAAY,MACtBT,EAAIO,MAAMG,YAAczQ,KAAK0P,OAAS,EAAI,KAC1CK,EAAIO,MAAMI,aAAe1Q,KAAK0P,OAAS,EAAI,OAI/CL,EAAY/O,UAAUqQ,WAAa,SAASC,GAC1C,IAAIC,EAAOC,EACXC,EAAiBzR,EAAEuM,cAAc7L,KAAKsP,oBAAoBpB,YAE1D7O,EAAG,MAAOuR,EAASlL,OAAS,EAAG,CAC7B,IAAK,IAAIrF,EAAI,EAAGA,GAAKuQ,EAASlL,OAAQrF,IAAK,CACzCwQ,EAAQD,EAASC,MAAM,EAAGxQ,GAC1ByQ,EAAI9Q,KAAK4P,WAAWiB,EAAOE,GAC3B,GAAID,EAAI9Q,KAAKyP,UAAW,CACtBzP,KAAKkQ,SAASW,EAAOC,GACrBF,EAAWA,EAASC,MAAMxQ,GAC1B,SAAShB,GAGbW,KAAKkQ,SAASW,EAAOpC,KAAKC,IAAI1O,KAAKyP,UAAWqB,IAC9C,QAIJzB,EAAY/O,UAAU0Q,MAAQ,SAASzB,GACrC,IAAI0B,EAAuB3R,EAAEc,iBAAiBJ,KAAKuP,kBACnD2B,EAAiBD,EAAqBvL,OACtCyL,EAAW,KACXC,EAAU,KACVR,KACA,IAAK,IAAIvQ,EAAI,EAAGA,EAAI6Q,EAAgB7Q,IAAK,CACvC+Q,EAAUH,EAAqB5Q,GAC/B,GAAI+Q,EAAQC,yBAA2BF,GAAYP,EAASlL,OAAS,EAAG,CAItE1F,KAAK2Q,WAAWC,GAEhBA,KAGFA,EAASxB,KAAKgC,EAAQvF,cAAc7L,KAAKwP,eAEzC2B,EAAWC,EAGb,GAAIR,EAASlL,OAAS,EAAG,CACvB1F,KAAK2Q,WAAWC,KAIpBvB,EAAY/O,UAAUgR,MAAQ,WAC5B,IAAIjR,EAAG0P,EAAKa,EAAUW,EACtBvQ,EAAMhB,KACNwR,EAAgBlS,EAAEc,iBAAiBJ,KAAKuP,kBACxC2B,EAAiBM,EAAc9L,OAE/B,SAASsL,EAAMtQ,GACbM,EAAIgQ,QAGN,SAASS,EAAc/Q,GACrB,GAAIM,EAAI2O,cAAe,CACrB3O,EAAI2O,cAAgB,MACpBtF,WAAW,WACTrJ,EAAIgQ,QACJhQ,EAAI2O,cAAgB,MACnB,MAIPtQ,EAAE8B,iBAAiB,SAAUsQ,GAC7BpS,EAAE8B,iBAAiB,WAAY6P,GAE/B,IAAK3Q,EAAI,EAAGA,EAAI6Q,EAAgB7Q,IAAK,CACnC0P,EAAMyB,EAAcnR,GAAGwL,cAAc7L,KAAKwP,cAC1C,UAAWO,IAAQ,YAAa,CAC9BA,EAAI5O,iBAAiB,OAAQsQ,GAC7B1B,EAAI5O,iBAAiB,QAASsQ,MAKpCpS,EAAEE,MAAM8P,YAAcA,GA1IxB,CA4IG9K,OAAQpE,UACVZ,MAAMiC,MAAM,WAEXjC,MAAMwB,GAAG,UAAW,QAAS,WAC3B2Q,EAAgB1R,MAAM,QAGxBT,MAAMwB,GAAG,YAAa,QAAS,SAASL,GACtC,IAAID,EAAKC,EAAEU,OACX,MAAOX,IAAOuH,UAAW,CACvB,GAAIvH,EAAG4D,UAAUsN,SAAS,UAAW,CACnC,GAAIlR,EAAGmG,aAAa,uBAAyB,KAAM,CACjD8K,EAAgBjR,GAAI,MAEtB,MAEFA,EAAKA,EAAGP,aAET,MAEH,IAAI0R,GACFC,IACEhK,IAAK,SACLiK,IAAKC,EACLC,IAAK,sCACLC,IAAK,WAEPC,IACErK,IAAK,IACLiK,IAAKK,EACLH,IAAK,4BACLC,IAAK,WAEPG,IACEvK,IAAK,IACLiK,IAAKO,GAAY9N,OAAO+N,aACxBN,IAAK,qBACLC,IAAK,cAEPM,IACE1K,IAAK,IACLiK,IAAKO,EAAW9N,OAAO+N,aACvBN,IAAK,uBACLC,IAAK,cAEPO,IACE3K,IAAK,IACLiK,IAAKO,GAAY9N,OAAO+N,YAAc,GACtCN,IAAK,wBACLC,IAAK,cAEPQ,IACE5K,IAAK,IACLiK,IAAKO,EAAW9N,OAAO+N,YAAc,GACrCN,IAAK,0BACLC,IAAK,cAEPS,IACE7K,IAAK,IACLiK,IAAKa,GAAcxS,SAASuD,KAAKkP,aAAc,OAC/CZ,IAAK,gCACLC,IAAK,cAEPY,IACEhL,IAAK,IACLiK,IAAKa,EAAaxS,SAASuD,KAAKkP,aAAc,UAC9CZ,IAAK,mCACLC,IAAK,cAEPa,IACEjL,IAAK,IACLiK,IAAKJ,EAAgB,MACrBM,IAAK,gCACLC,IAAK,WAEPc,IACElL,IAAK,IACLiK,IAAKJ,EAAgB,QACrBM,IAAK,4BACLC,IAAK,WAEPe,IACEnL,IAAK,IACLiK,IAAKmB,EAAgB,GACrBjB,IAAK,sBACLC,IAAK,WAEPiB,IACErL,IAAK,IACLiK,IAAKmB,EAAgB,GACrBjB,IAAK,kBACLC,IAAK,WAEPkB,IACEtL,IAAK,IACLiK,IAAKsB,EAAW,OAChBpB,IAAK,qBACLC,IAAK,WAEPoB,IACExL,IAAK,IACLiK,IAAKsB,EAAW,MAChBpB,IAAK,+BACLC,IAAK,WAEPqB,IACEzL,IAAK,IACLiK,IAAKyB,EACLvB,IAAK,8BACLC,IAAK,WAEPuB,IACE3L,IAAK,IACLiK,IAAK2B,EACLzB,IAAK,qBACLC,IAAK,UAIT1S,MAAMwB,GAAGZ,SAAU,UAAW,SAASO,GAErC,GAAIkR,EAAQpJ,eAAe9H,EAAEgI,WAAahI,EAAEgT,UAAYhT,EAAEiT,SAAWjT,EAAEkT,WAAalT,EAAEmT,QAAS,CAC7F,IAAIC,EAAUpT,EAAEU,OAAO0S,QAAQC,cAC/B,GAAIrT,EAAEgI,UAAY,GAAI,CACpB,GAAIoL,IAAY,SAAWA,IAAY,UAAYA,IAAY,WAAY,CACzElC,EAAQlR,EAAEgI,SAASoJ,WAEhB,CACL,GAAIpR,EAAEU,SAAWjB,SAASuD,MAAQoQ,IAAY,KAAOA,IAAY,SAAU,CACzEpT,EAAEoL,iBACF8F,EAAQlR,EAAEgI,SAASoJ,WAM3B,SAASJ,EAAgBsC,GACvB,OAAO,SAASC,GACd,IAAI7C,EAAUjR,SAAS0L,cAAc,8BACrCqI,EAAiBF,EACjB,GAAI5C,IAAY,KAAM,CAEpBA,EAAUjR,SAAS0L,cAAc,WACjC,GAAIuF,IAAY,KAAM,CAEpB,OAGF,GAAI4C,IAAU,QAAUA,IAAU,KAAM,CACtCE,EAAiB9C,GAIrB,IAAI+C,EAAMC,EAAUjU,SAASC,iBAAiB,WAE9C,UAAW8T,IAAmB,SAAU,CACtCC,EAAOD,MACF,CACL,OAAQA,GACN,IAAK,UACL,IAAIG,EAAMlU,SAASmU,gBAAgBC,WAAapU,SAASuD,KAAK6Q,UAC9D,IAAIC,EAAMH,EAAMlU,SAASmU,gBAAgBG,aAEzC,IAAK,IAAIpU,EAAI,EAAGA,EAAI+T,EAAQ1O,OAAQrF,IAAK,CACvC8T,EAAOC,EAAQ/T,GACf,IAAIqU,EAAOP,EAAKpG,UAChB,IAAI4G,EAAOD,EAAOP,EAAKM,aAEvB,GAAKE,GAAQH,GAASE,EAAOL,EAAM,CACjC,OAGJ,MACA,IAAK,OACLF,EAAO/C,EAAQwD,mBACf,GAAIT,IAAS,KAAM,CACjBA,EAAOC,EAAQ,GAEjB,MACA,IAAK,KACLD,EAAO/C,EAAQC,uBACf,GAAI8C,IAAS,KAAM,CACjBA,EAAOC,EAAQA,EAAQ1O,OAAS,GAElC,MACA,IAAK,SACLyO,EAAOC,EAAQA,EAAQ1O,OAAS,GAChC,MACA,IAAK,MAEL,QACAyO,EAAOC,EAAQ,IAInB,GAAID,EAAM,CACR/C,EAAQyD,gBAAgB,qBACxBV,EAAK1Q,aAAa,oBAAqB,QACvC,IAAIqR,EAAOX,EAAKtI,cAAc,SAAWsI,EAAKtI,cAAc,KAC5D,GAAIiJ,IAAS,KAAM,CACjBA,EAAK5N,QAEP,IAAK+M,EAAU,CACbc,OAMR,SAASxB,IACPpT,SAAS6U,SAASC,OAAO,MAG3B,SAASlD,IACP,GAAI5R,SAAS+U,cAAe,CAC1B/U,SAAS+U,cAAcnO,QAI3B,SAASkM,EAAgBkC,GACvB,OAAO,WACL,IAAIC,EAAUC,EAAE,wCAChB,GAAID,EAAQ1P,SAAW,EAAG,CACxB7E,QAAQC,IAAI,oDACZ,OAEF,GAAIqU,GAAO,GAAKA,EAAMC,EAAQ1P,OAAQ,CACpC0P,EAAQD,GAAKG,YACR,CACLzU,QAAQC,IAAI,yCAKlB,SAASiU,IACP,IAAIQ,EAAMpV,SAAS0L,cAAc,8BACjC,GAAI0J,IAAQ,KAAM,CAChB,OAEF,IAAIC,EAAOrV,SAASmU,gBAAgBC,WAAapU,SAASuD,KAAK6Q,UAC/DkB,EAAUtV,SAASmU,gBAAgBG,aACnCC,EAAOa,EAAIxH,UACX4G,EAAOD,EAAOa,EAAId,aAClBiB,EAAS,IAET,GAAKH,EAAIlE,yBAA2B,MAAUsD,EAAOc,EAAU,CAG7DlR,OAAOoR,OAAOpR,OAAOqR,QAAS,GAC9B,OAEF,GAAIJ,EAAQd,EAAOgB,EAAS,CAC1BnR,OAAOoR,OAAOpR,OAAOqR,QAASlB,EAAOgB,OAChC,CACL,IAAIG,EAAOL,EAAOC,EAClB,GAAII,EAAQlB,EAAOe,EAAS,CAC1BnR,OAAOoR,OAAOpR,OAAOqR,QAASjB,EAAOc,EAAUC,KAKrD,SAASrD,EAAWyD,GAClB,OAAO,WACLvR,OAAOwR,SAAS,EAAGD,GACnBpE,EAAgB,cAIpB,SAASiB,EAAalL,EAAUuO,GAC9B,OAAO,WACLzR,OAAO0R,SAAS,EAAGxO,GACnBiK,EAAgBsE,MAIpB,SAAS7D,IACP5N,OAAO0R,SAAS,EAAG,GACnB9V,SAAS0L,cAAc,MAAM3E,QAG/B,SAASkM,EAAW8C,GAClB,OAAO,WACL,IAAIpB,EAAO3U,SAAS0L,cAAc,mCAClC,GAAIiJ,IAAS,KAAM,CACjB,IAAIjT,EAAMiT,EAAKlO,aAAa,QAC5B,GAAIsP,EAAQ,CACV3R,OAAOlC,KAAKR,OACP,CACL0C,OAAOyQ,SAASmB,KAAOtU,KAM/B,SAASuU,EAAgBC,GACvB,IAAIC,KAEJ,IAAK,IAAIC,KAAK3E,EAAS,CACrB,IAAI/J,EAAM+J,EAAQ2E,GAClBD,EAAWzO,EAAIoK,KAAOqE,EAAWzO,EAAIoK,SACrCqE,EAAWzO,EAAIoK,KAAK7C,KAAKvH,GAG3B,IAAI2O,EAAStN,OAAOiG,KAAKmH,GAAYG,KAAK,SAASnR,EAAGoR,GACpD,OAAOJ,EAAWI,GAAGhR,OAAS4Q,EAAWhR,GAAGI,SAG9C,GAAI8Q,EAAO9Q,SAAW,EAAG,CACvB,OAGH,IAAIiR,EAAO,mEACVA,GAAQ,uDACVA,GAAQ,UAEN,IAAK,IAAItW,EAAI,EAAGA,EAAImW,EAAO9Q,OAAQrF,IAAK,CACtC,IAAI4R,EAAMqE,EAAWE,EAAOnW,IAE5B,IAAIuW,EAAevW,IAAOmW,EAAO9Q,OAAS,EAC1C,IAAIwG,EAAQ7L,EAAI,IAAM,EAEtB,GAAI6L,EAAO,CACTyK,GAAQ,OAEVA,GAAQ,OAERA,GAAQ,OAAS1E,EAAI,GAAGA,IAAM,QAC9B0E,GAAQ,6BAER,IAAK,IAAIE,KAAM5E,EAAK,CAClB0E,GAAQ,YAAc1E,EAAI4E,GAAIhP,IAAM,UAAYoK,EAAI4E,GAAI7E,IAAM,QAGhE2E,GAAQ,QACRA,GAAQ,QAER,IAAKzK,GAAS0K,EAAc,CAC1BD,GAAQ,SAIdA,GAAQ,WAENN,EAAWzH,UAAY+H,EAGzB,SAASlD,IACR,IAAIqD,EAAY3W,SAAS0L,cAAc,qBACvChL,QAAQC,IAAIgW,GACb,GAAIA,IAAc9O,WAAa8O,IAAc,KAAM,CAElDA,EAAY3W,SAASqD,cAAc,OAChCsT,EAAU1T,GAAK,mBACjB0T,EAAUC,UAAU,eACpBD,EAAUxG,MAAM,aACjB8F,EAAgBU,GAChB,IAAIpT,EAAOvD,SAASqM,qBAAqB,QAAQ,GACjD9I,EAAKC,YAAYmT,OACX,CAENA,EAAUzS,UAAU2S,OAAO,aAC3B,YAuBH,SAAW3X,EAAGC,EAAGC,GACf,aAEAA,EAAMiC,MAAM,WACVjC,EAAMwB,GAAG,0BAA2B,QAAS,SAASsG,GAEpDrH,KAAKqE,UAAUoI,OAAO,0BAGtB,IAAIwK,EAAe,gDACnB,IAAIC,EAAcD,EAAe,2BACjC,IAAIE,EAAY,cAEhB,IAAIC,EAASpX,KAAKqX,QAAQC,MAC1B,IAAIC,EAAWvX,KAAKqX,QAAQG,QAC5B,IAAIC,EAAenY,EAAEuM,cAAc,IAAM7L,KAAKqX,QAAQK,aACtD,IAAIC,EAAwBrY,EAAEuM,cAAc,IAAM7L,KAAKqX,QAAQO,qBAG/D,IAAIC,GAAoB,YAAa,eAAgB,mBAAoB,gBAAiB,eAE1F,GAAGT,GAAUG,GAAYE,EAAc,CACrC,IAAIK,EAAQ,KACZ,OAAOP,GACL,IAAK,OACLO,EAAQZ,EAAc,QAAUE,EAAS,KAAOD,EAChD,MACA,IAAK,MACLW,EAAQZ,EAAc,OAASE,EAAS,KAAOD,EAC/C,MACA,IAAK,WACLW,EAAQZ,EAAc,YAAcE,EAAS,KAAOD,EACpD,MACA,QACA,MAEF,GAAGW,EAAO,CAERvY,EAAMoC,KAAM,MAAOmW,GAAQ3V,KAAK,SAASwU,EAAMoB,GAC7CpB,EAAO1H,KAAKC,MAAMyH,GAClB,GAAGA,GAAQA,EAAKzQ,UAAYyQ,EAAKzQ,SAAS,GAAI,CAC5C,IAAIhC,EAAUyS,EAAKzQ,SAAS,GAC5B,IAAI8R,EAAU,GACd,IAAK,IAAIC,KAAO/T,EAAQgU,KAAM,CAC5B,GAAGhU,EAAQgU,KAAKrP,OAAS,MAAQgP,EAAgBhO,QAAQoO,KAAS,EAAG,CACnED,GAAW,WAAaC,EAAM,YAC9B,OAAOA,GACL,IAAK,QACL,IAAK,MACLD,GAAW,gBAAmB9T,EAAQgU,KAAKD,GAAK5U,QAAQ,KAAK,IAAM,KAAQa,EAAQgU,KAAKD,GAAO,OAC/F,MACA,IAAK,QACLD,GAAW,mBAAsB9T,EAAQgU,KAAKD,GAAO,KAAQ/T,EAAQgU,KAAKD,GAAO,OACjF,MACA,IAAK,UACL,IAAK,MACLD,GAAW,YAAe9T,EAAQgU,KAAKD,GAAO,KAAQ/T,EAAQgU,KAAKD,GAAO,OAC1E,MACA,IAAK,WACLD,GAAW,0CAA6C9T,EAAQgU,KAAKD,GAAO,KAAQ/T,EAAQgU,KAAKD,GAAO,OACxG,MACA,IAAK,YACL,GAAG/T,EAAQgU,KAAKD,GAAKpO,QAAQ,OAAS,EAAG,CACvCmO,GAAW,oBAAuB9T,EAAQgU,KAAKD,GAAKE,UAAU,EAAEjU,EAAQgU,KAAKD,GAAKpO,QAAQ,MAAQ,uBAAyB3F,EAAQgU,KAAKD,GAAKE,UAAUjU,EAAQgU,KAAKD,GAAKpO,QAAQ,KAAK,GAAK,KAAQ3F,EAAQgU,KAAKD,GAAO,OACvN,MAGF,QAEAD,GAAW9T,EAAQgU,KAAKD,GACxB,MAEFD,GAAW,cAGtBL,EAAsBzX,WAAW0K,YAAY+M,GACtCF,EAAapT,UAAUoI,OAAO,aAC9BgL,EAAa5L,cAAc,SAAS+C,UAAYoJ,KAGnD5V,MAAM,WACLuV,EAAsBtT,UAAUoI,OAAO,aACvCkL,EAAsB/I,UAAY,0BAMxCvH,EAAMyE,mBAGRvM,EAAMwB,GAAG,kBAAmB,QAAS,SAASsG,GAE5CrH,KAAKqE,UAAUoI,OAAO,kBAGtB,IAAI2L,EAAiBpY,KAAKqX,QAAQgB,cAClC,IAAIC,EAAUC,WAAWvY,KAAKqX,QAAQmB,QACtC,IAAIC,EAAUF,WAAWvY,KAAKqX,QAAQqB,QACtC,IAAIC,EAAWJ,WAAWvY,KAAKqX,QAAQuB,SACvC,IAAIC,EAAkB5J,KAAKC,MAAMlP,KAAKqX,QAAQyB,gBAC9C,IAAIC,EAAc9J,KAAKC,MAAMlP,KAAKqX,QAAQ2B,YAE1CzZ,EAAMyD,UAAU,uBAChBzD,EAAMqE,WAAW,qBAAsB,WACrC,IAAIqV,EAAa,KACjB,GAAGJ,EAAiB,CAClB,IAAIK,EAAYC,EAAEC,OAAOP,EAAgB,GAAIA,EAAgB,IAC7D,IAAIQ,EAAYF,EAAEC,OAAOP,EAAgB,GAAIA,EAAgB,IAC7DI,EAAaE,EAAEG,aAAaJ,EAAWG,GAIzC,IAAIE,EAAMJ,EAAEI,IAAInB,GAEhB,IAAIoB,EAAa,qDACjB,IAAIC,EAAgB,gFACpB,IAAIC,EAAY,IAAIP,EAAEQ,UAAUH,GAAeI,QAAS,EAAGC,QAAS,GAAIC,YAAaL,IACrF,IAAIM,EAAgB,sDACpB,IAAIC,EAAqB,uGACzB,IAAIC,EAAe,IAAId,EAAEQ,UAAUI,GAAkBH,QAAS,EAAGC,QAAS,GAAIC,YAAaE,IAE3F,GAAGf,EAAY,CAGb5O,WAAW,WACTkP,EAAIW,UAAUjB,GACZY,QAAQ,MAET,QACE,GAAIvB,GAAWG,EAAS,CAC7B,GAAGE,EAAU,CACXY,EAAIY,QAAQ,IAAIhB,EAAEC,OAAOX,EAASH,GAASK,OACtC,CACLY,EAAIY,QAAQ,IAAIhB,EAAEC,OAAOX,EAASH,GAAS,IAI/CiB,EAAIa,SAASV,GAEb,IAAIW,GACFC,aAAcZ,GAIhBP,EAAEoB,QAAQC,OAAOH,GAAYI,MAAMlB,GAEnC,GAAGR,EAAa,CACdI,EAAEuB,QAAQ3B,GAAa0B,MAAMlB,MAOjClS,EAAMyE,sBA3JZ,CA8JGvH,OAAQpE,SAAUoE,OAAOhF,QAiB5B,SAAUF,EAAGC,EAAGC,GACd,aAEAA,EAAMiC,MAAM,WACVjC,EAAMob,uBAAyB,IAAIpb,EAAM8P,YAAY,QAAS,uBAAwB,sBAAuB,KAC7G9P,EAAMob,uBAAuBrJ,QAE7B/R,EAAMwB,GAAG,gBAAiB,QAAS,SAASsG,GAC1C,IAAIuT,EAAoB5a,KAAK4G,aAAa,2BAC1C,IAAIiU,EAAuB7a,KAAK4G,aAAa,+BAC7C,IAAIxF,EAASpB,KAAK4G,aAAa,eAC/B,IAAIkU,EAAgBxb,EAAEuM,cAAczK,GACpC,IAAIuV,EAAO3W,KAAK4O,UAChB,GAAI5O,KAAKqE,UAAUsN,SAAS,aAAc,CACxCgF,EAAOA,EAAKtT,QAAQuX,EAAmBC,OAClC,CACLlE,EAAOA,EAAKtT,QAAQwX,EAAsBD,GAE5C5a,KAAK4O,UAAY+H,EACjB3W,KAAKqE,UAAU2S,OAAO,aACtB8D,EAAczW,UAAU2S,OAAO,eAGjCzX,EAAMwB,GAAG,gBAAiB,QAAS,SAASsG,GAC1C,IAAIjG,EAASpB,KAAK4G,aAAa,eAC/B,IAAImU,EAAczb,EAAEuM,cAAczK,EAAS,aAC3C,IAAI4Z,EAAUD,EAAYnU,aAAa,OACvC,GAAIoU,IAAY,MAAQA,IAAYhT,WAAagT,IAAY,MAAO,CAClED,EAAYtX,aAAa,MAAOsX,EAAYnU,aAAa,gBAI7DvH,EAAE8B,iBAAiB,SAAU,WAC3B,IAAIT,EAAIpB,EAAEiE,eAAe,aACzBgR,EAAYpU,SAASmU,gBAAgBC,WAAapU,SAASuD,KAAK6Q,UAChE,GAAI7T,IAAM,KAAM,CACd,GAAI6T,GAAa,IAAK,CACpB7T,EAAE4P,MAAM2K,QAAU,MACb,CACLva,EAAE4P,MAAM2K,QAAU,SAvC5B,CA8CG1W,OAAQpE,SAAUoE,OAAOhF,QAiB5B,SAAUF,EAAGC,EAAGC,GACd,aAEA,IAAI2b,EAAa,KAAMC,EAAY,IAAKC,EAExC,SAASC,EAAiBnX,GACxB,GAAIA,EAAQoX,kBAAmB,CAC7B,IAAIC,EAAMrX,EAAQgH,MAAMxF,OACxBxB,EAAQoX,kBAAkBC,EAAKA,IAInC,SAASC,IACP,GAAIJ,EAAOlQ,MAAMxF,OAAU,EAAG,CAC5B,IAAI+V,EAAStb,SAASoD,eAAe,UACrC8G,WAAWoR,EAAOC,OAAOha,KAAK+Z,GAAS,IAI3C,SAASE,EAAkBP,GACzB,IAAIQ,EAAKzb,SAASoD,eAAe,gBACjC,IAAIsY,EAAoB,WACtB,GAAIT,EAAOlQ,MAAMxF,SAAW,EAAG,CACpCkW,EAAGvX,UAAUC,IAAI,aACL,CACZsX,EAAGvX,UAAUoI,OAAO,WAKjBoP,IACAD,EAAGza,iBAAiB,QAAS,WAC3Bia,EAAOlQ,MAAM,GACbkQ,EAAOlU,QACP2U,MAEFT,EAAOja,iBAAiB,QAAS0a,EAAmB,OAGtDtc,EAAMiC,MAAM,WACV4Z,EAAS9b,EAAEiE,eAAe4X,GAE1B,SAASW,EAAqBpb,GAC5B,GAAIwa,EAAY,CACdG,EAAiBD,GACjBF,EAAa,UACR,GAKT,GAAIE,IAAW,KAAM,CAEnBO,EAAkBP,GAGlB,GAAI7b,EAAMwc,cAAe,CACvBxc,EAAMyc,aAAehX,aAAarE,KAAKtB,GACrCqM,IAAK,kBACLX,aAAcxL,EAAM0c,YACpBzQ,WAAYjM,EAAMqC,OAClB2J,SAAU,EACVjB,MAAO,KACN,IAAM6Q,GAGT9b,EAAE8B,iBAAiB,SAAU,WAC3B,IAAIkG,EAAQ,IAAI6U,YAAY,YAC5Bd,EAAOe,cAAc9U,KAIzB+T,EAAOja,iBAAiB,QAAS2a,EAAsB,OACvDV,EAAOlU,QAIT,GAAIkU,IAAW,MAAQ7b,EAAM6c,0BAA2B,CACtD9c,EAAEuM,cAAc,SAASkL,UAAU,YAEnCxX,EAAMwB,GAAG,oBAAqB,SAAU,SAASL,GAC/C,IAAIL,EAAGiW,EAAahX,EAAEc,iBAAiB,sCACvC,IAAIC,EAAE,EAAGA,EAAEiW,EAAW5Q,OAAQrF,IAAK,CACjC,GAAIiW,EAAWjW,KAAOL,MAAQsW,EAAWjW,GAAGgc,QAAS,CACnD/F,EAAWjW,GAAGiV,SAGlB,IAAMtV,KAAKqc,QAAS,CAClBrc,KAAKsV,QAEPkG,IACA,OAAO,QAGTjc,EAAMwB,GAAGzB,EAAEiE,eAAe,cAAe,SAAUiY,GACnDjc,EAAMwB,GAAGzB,EAAEiE,eAAe,YAAa,SAAUiY,OA/FvD,CAoGGjX,OAAQpE,SAAUoE,OAAOhF","file":"searx.min.js"} \ No newline at end of file
+{"version":3,"sources":["searx.js"],"names":["window","searx","w","d","Element","ElementPrototype","matches","matchesSelector","webkitMatchesSelector","msMatchesSelector","selector","node","this","nodes","parentNode","document","querySelectorAll","i","prototype","callbackSafe","callback","el","e","call","exception","console","log","on","obj","eventType","useCapture","addEventListener","target","srcElement","found","parentElement","ready","readyState","bind","http","method","url","req","XMLHttpRequest","resolve","reject","promise","then","catch","open","onload","status","response","responseType","Error","statusText","onerror","onabort","send","ex","loadStyle","src","path","static_path","id","replace","s","getElementById","createElement","setAttribute","body","appendChild","loadScript","hasAttribute","apply","insertBefore","newNode","referenceNode","element","insertAfter","nextSibling","classList","add","f","exports","module","define","amd","g","global","self","AutoComplete","t","n","r","o","u","a","require","code","l","length","1","ConditionOperator","EventType","params","Array","isArray","forEach","elements","input","specificParams","merge","defaults","DOMResults","create","Input","nodeName","match","getAttribute","_Position","$Listeners","blur","_Blur","destroy","focus","_Focus","keyup","event","KEYUP","keydown","KEYDOWN","position","getEventsByType","type","mappings","key","KeyboardMappings","Event","undefined","eventIdentifier","condition","mapping","Operator","AND","OR","Not","hasOwnProperty","Is","keyCode","From","To","name","Conditions","Callback","makeRequest","propertyHttpHeaders","Object","getOwnPropertyNames","HttpHeaders","request","_HttpMethod","_Url","queryParams","_Pre","queryParamsStringify","encodeURIComponent","_QueryArg","indexOf","setRequestHeader","onreadystatechange","$Cache","ajax","timeout","$AjaxTimer","clearTimeout","setTimeout","Delay","Request","abort","cache","_Cache","removeEventListener","removeChild","tmp","arguments","EmptyMessage","Highlight","getRegex","value","RegExp","transform","Content-type","Limit","MinChars","HttpMethod","QueryArg","Url","Enter","liActive","querySelector","preventDefault","_Select","KeyUpAndDown_down","KeyUpAndDown_up","first","last","active","currentIndex","children","lisCount","getElementsByTagName","remove","item","AlphaNum","oldValue","currentValue","_MinChars","_Render","_Post","_Open","_EmptyMessage","emptyMessage","_Limit","limit","isNaN","parseInt","minchars","_Highlight","label","now","li","onclick","onmouseenter","offsetTop","offsetHeight","offsetLeft","clientWidth","ul","_RenderRaw","_RenderResponseItems","hasChildNodes","childNodes","reverse","Math","min","abs","innerHTML","Label","Value","returnResponse","json","JSON","parse","keys","push","ImageLayout","container_selector","results_selector","img_selector","maxHeight","margin","_alignAllDone","_getHeigth","images","width","img","naturalWidth","naturalHeight","_setSize","height","imgWidth","imagesLength","style","marginLeft","marginTop","marginRight","marginBottom","_alignImgs","imgGroup","slice","h","containerWidth","align","results_selectorNode","results_length","previous","current","previousElementSibling","watch","imgNodeLength","results_nodes","throttleAlign","highlightResult","contains","vimKeys","27","fun","removeFocus","des","cat","73","searchInputFocus","66","scrollPage","innerHeight","70","85","68","71","scrollPageTo","scrollHeight","86","75","74","80","pageButtonClick","78","79","openResult","84","82","reloadPage","72","toggleHelp","ctrlKey","altKey","shiftKey","metaKey","tagName","toLowerCase","which","noScroll","effectiveWhich","next","results","top","documentElement","scrollTop","bot","clientHeight","etop","ebot","nextElementSibling","removeAttribute","link","scrollPageToSelected","location","reload","activeElement","num","buttons","$","click","sel","wtop","wheight","offset","scroll","scrollX","wbot","amount","scrollBy","nav","scrollTo","newTab","href","initHelpContent","divElement","categories","k","sorted","sort","b","html","lastCategory","cj","helpPanel","className","toggle","overpass_url","query_start","query_end","osm_id","dataset","osmId","osm_type","osmType","result_table","resultTable","result_table_loadicon","resultTableLoadicon","osm_ignore_tags","query","contentType","newHtml","row","tags","substring","leaflet_target","leafletTarget","map_lon","parseFloat","mapLon","map_lat","mapLat","map_zoom","mapZoom","map_boundingbox","mapBoundingbox","map_geojson","mapGeojson","map_bounds","southWest","L","latLng","northEast","latLngBounds","map","osmMapnikUrl","osmMapnikAttrib","osmMapnik","TileLayer","minZoom","maxZoom","attribution","osmWikimediaUrl","osmWikimediaAttrib","osmWikimedia","fitBounds","setView","addLayer","baseLayers","OSM Mapnik","control","layers","addTo","geoJson","image_thumbnail_layout","btnLabelCollapsed","btnLabelNotCollapsed","targetElement","iframe_load","srctest","opacity","firstFocus","qinput_id","qinput","placeCursorAtEnd","setSelectionRange","len","submitIfQuery","search","submit","createClearButton","cs","updateClearButton","placeCursorAtEndOnce","autocompleter","autocomplete","no_item_found","CustomEvent","dispatchEvent","search_on_category_select","checked"],"mappings":";;AAiBAA,OAAOC,MAAQ,SAAUC,EAAGC,GAE1B,aAMA,GAAID,EAAEE,QAAS,EACb,SAAUC,GACRA,EAAiBC,QAAUD,EAAiBC,SAC5CD,EAAiBE,iBACjBF,EAAiBG,uBACjBH,EAAiBI,mBACjB,SAASC,GACP,IAAIC,EAAOC,KAAMC,GAASF,EAAKG,YAAcH,EAAKI,UAAUC,iBAAiBN,GAAWO,GAAK,EAC7F,MAAOJ,IAAQI,IAAMJ,EAAMI,IAAMN,GACjC,QAASE,EAAMI,KARnB,CAUGb,QAAQc,WAGb,SAASC,EAAaC,EAAUC,EAAIC,GAClC,IACEF,EAASG,KAAKF,EAAIC,GAClB,MAAOE,GACPC,QAAQC,IAAIF,IAIhB,IAAIvB,EAAQD,OAAOC,OAAS,GAE5BA,EAAM0B,GAAK,SAASC,EAAKC,EAAWT,EAAUU,GAC5CA,EAAaA,GAAc,MAC3B,UAAWF,IAAQ,SAAU,CAE3BA,EAAIG,iBAAiBF,EAAWT,EAAUU,OACrC,CAEL3B,EAAE4B,iBAAiBF,EAAW,SAASP,GACrC,IAAID,EAAKC,EAAEU,QAAUV,EAAEW,WAAYC,EAAQ,MAC3C,MAAOb,GAAMA,EAAGf,SAAWe,IAAOlB,KAAO+B,EAAQb,EAAGf,QAAQsB,IAAOP,EAAKA,EAAGc,cAC3E,GAAID,EAAOf,EAAaC,EAAUC,EAAIC,IACrCQ,KAIP7B,EAAMmC,MAAQ,SAAShB,GACrB,GAAIL,SAASsB,YAAc,UAAW,CACpCjB,EAASG,KAAKrB,OACT,CACLA,EAAE6B,iBAAiB,mBAAoBX,EAASkB,KAAKpC,MAIzDD,EAAMsC,KAAO,SAASC,EAAQC,EAAKrB,GACjC,IAAIsB,EAAM,IAAIC,eACdC,EAAU,aACVC,EAAS,aACTC,EAAU,CACRC,KAAM,SAAS3B,GAAYwB,EAAUxB,EAAU,OAAO0B,GACtDE,MAAO,SAAS5B,GAAYyB,EAASzB,EAAU,OAAO0B,IAGxD,IACEJ,EAAIO,KAAKT,EAAQC,EAAK,MAGtBC,EAAIQ,OAAS,WACX,GAAIR,EAAIS,QAAU,IAAK,CACrBP,EAAQF,EAAIU,SAAUV,EAAIW,kBACrB,CACLR,EAAOS,MAAMZ,EAAIa,eAKrBb,EAAIc,QAAU,WACZX,EAAOS,MAAM,mBAGfZ,EAAIe,QAAU,WACZZ,EAAOS,MAAM,4BAIfZ,EAAIgB,OACJ,MAAOC,GACPd,EAAOc,GAGT,OAAOb,GAGT7C,EAAM2D,UAAY,SAASC,GACzB,IAAIC,EAAO7D,EAAM8D,YAAcF,EAC/BG,EAAK,SAAWH,EAAII,QAAQ,IAAK,KACjCC,EAAI/D,EAAEgE,eAAeH,GACrB,GAAIE,IAAM,KAAM,CACdA,EAAI/D,EAAEiE,cAAc,QACpBF,EAAEG,aAAa,KAAML,GACrBE,EAAEG,aAAa,MAAO,cACtBH,EAAEG,aAAa,OAAQ,YACvBH,EAAEG,aAAa,OAAQP,GACvB3D,EAAEmE,KAAKC,YAAYL,KAIvBjE,EAAMuE,WAAa,SAASX,EAAKzC,GAC/B,IAAI0C,EAAO7D,EAAM8D,YAAcF,EAC/BG,EAAK,UAAYH,EAAII,QAAQ,IAAK,KAClCC,EAAI/D,EAAEgE,eAAeH,GACrB,GAAIE,IAAM,KAAM,CACdA,EAAI/D,EAAEiE,cAAc,UACpBF,EAAEG,aAAa,KAAML,GACrBE,EAAEG,aAAa,MAAOP,GACtBI,EAAEhB,OAAS9B,EACX8C,EAAEV,QAAU,WACVU,EAAEG,aAAa,QAAS,MAE1BlE,EAAEmE,KAAKC,YAAYL,QACd,IAAKA,EAAEO,aAAa,SAAU,CACnC,IACErD,EAASsD,MAAMR,EAAG,IAClB,MAAO1C,GACPC,QAAQC,IAAIF,QAET,CACLC,QAAQC,IAAI,mCAAqCoC,EAAO,mBAI5D7D,EAAM0E,aAAe,SAAUC,EAASC,GACtCC,QAAQhE,WAAW6D,aAAaC,EAASC,IAG3C5E,EAAM8E,YAAc,SAASH,EAASC,GACpCA,EAAc/D,WAAW6D,aAAaC,EAASC,EAAcG,cAG/D/E,EAAM0B,GAAG,SAAU,QAAS,SAASL,GACnC,IAAID,EAAKC,EAAEU,QAAUV,EAAEW,WACvBrB,KAAKE,WAAWmE,UAAUC,IAAI,eAGhC,OAAOjF,EAjJM,CAkJZD,OAAQe,WACV,SAAUoE,GAAG,UAAUC,UAAU,iBAAiBC,SAAS,YAAY,CAACA,OAAOD,QAAQD,SAAS,UAAUG,SAAS,YAAYA,OAAOC,IAAI,CAACD,OAAO,GAAGH,OAAO,CAAC,IAAIK,EAAE,UAAUxF,SAAS,YAAY,CAACwF,EAAExF,YAAY,UAAUyF,SAAS,YAAY,CAACD,EAAEC,YAAY,UAAUC,OAAO,YAAY,CAACF,EAAEE,SAAS,CAACF,EAAE5E,KAAK4E,EAAEG,aAAeR,MAAjU,CAAwU,WAAW,IAAIG,EAAOD,EAAOD,EAAQ,OAAO,SAAU9D,EAAEsE,EAAEC,EAAEC,GAAG,SAAS5B,EAAE6B,EAAEC,GAAG,IAAIH,EAAEE,GAAG,CAAC,IAAIH,EAAEG,GAAG,CAAC,IAAIE,SAASC,SAAS,YAAYA,QAAQ,IAAIF,GAAGC,EAAE,OAAOA,EAAEF,GAAG,GAAG,GAAG9E,EAAE,OAAOA,EAAE8E,GAAG,GAAG,IAAIZ,EAAE,IAAI7B,MAAM,uBAAuByC,EAAE,KAAK,MAAMZ,EAAEgB,KAAK,mBAAmBhB,EAAE,IAAIiB,EAAEP,EAAEE,GAAG,CAACX,QAAQ,IAAIQ,EAAEG,GAAG,GAAGxE,KAAK6E,EAAEhB,QAAQ,SAAS9D,GAAG,IAAIuE,EAAED,EAAEG,GAAG,GAAGzE,GAAG,OAAO4C,EAAE2B,EAAEA,EAAEvE,IAAI8E,EAAEA,EAAEhB,QAAQ9D,EAAEsE,EAAEC,EAAEC,GAAG,OAAOD,EAAEE,GAAGX,QAAQ,IAAInE,SAASiF,SAAS,YAAYA,QAAQ,IAAI,IAAIH,EAAE,EAAEA,EAAED,EAAEO,OAAON,IAAI7B,EAAE4B,EAAEC,IAAI,OAAO7B,EAAvb,CAA2b,CAACoC,EAAE,CAAC,SAASJ,EAAQb,EAAOD;;;;;;;;;;AAU50B,aACA,IAAImB,GACJ,SAAWA,GACPA,EAAkBA,EAAkB,OAAS,GAAK,MAClDA,EAAkBA,EAAkB,MAAQ,GAAK,MAFrD,CAGGA,IAAsBA,EAAoB,KAC7C,IAAIC,GACJ,SAAWA,GACPA,EAAUA,EAAU,WAAa,GAAK,UACtCA,EAAUA,EAAU,SAAW,GAAK,SAFxC,CAGGA,IAAcA,EAAY,KAO7B,IAAIb,EAAgB,WAEhB,SAASA,EAAac,EAAQ/F,GAC1B,GAAI+F,SAAgB,EAAG,CAAEA,EAAS,GAClC,GAAI/F,SAAkB,EAAG,CAAEA,EAAW,sBACtC,GAAIgG,MAAMC,QAAQjG,GAAW,CACzBA,EAASkG,QAAQ,SAAU1C,GACvB,IAAIyB,EAAac,EAAQvC,UAG5B,UAAWxD,GAAY,SAAU,CAClC,IAAImG,EAAW9F,SAASC,iBAAiBN,GACzCgG,MAAMxF,UAAU0F,QAAQrF,KAAKsF,EAAU,SAAUC,GAC7C,IAAInB,EAAac,EAAQK,SAG5B,CACD,IAAIC,EAAiBpB,EAAaqB,MAAMrB,EAAasB,SAAUR,EAAQ,CACnES,WAAYnG,SAASqD,cAAc,SAEvCuB,EAAazE,UAAUiG,OAAOJ,EAAgBrG,GAC9C,OAAOqG,GAGfpB,EAAazE,UAAUiG,OAAS,SAAUV,EAAQ3B,GAC9C2B,EAAOW,MAAQtC,EACf,GAAI2B,EAAOW,MAAMC,SAASC,MAAM,cAAgBb,EAAOW,MAAM3C,aAAa,UAAY,OAASgC,EAAOW,MAAMG,aAAa,QAAQD,MAAM,mBAAoB,CACvJb,EAAOW,MAAM/C,aAAa,eAAgB,OAC1CoC,EAAOe,UAAUf,GACjBA,EAAOW,MAAMtG,WAAWyD,YAAYkC,EAAOS,YAC3CT,EAAOgB,WAAa,CAChBC,KAAMjB,EAAOkB,MAAMrF,KAAKmE,GACxBmB,QAASjC,EAAazE,UAAU0G,QAAQtF,KAAK,KAAMmE,GACnDoB,MAAOpB,EAAOqB,OAAOxF,KAAKmE,GAC1BsB,MAAOpC,EAAazE,UAAU8G,MAAM1F,KAAK,KAAMmE,EAAQD,EAAUyB,OACjEC,QAASvC,EAAazE,UAAU8G,MAAM1F,KAAK,KAAMmE,EAAQD,EAAU2B,SACnEC,SAAU3B,EAAOe,UAAUlF,KAAKmE,IAEpC,IAAK,IAAIuB,KAASvB,EAAOgB,WAAY,CACjChB,EAAOW,MAAMrF,iBAAiBiG,EAAOvB,EAAOgB,WAAWO,OAInErC,EAAazE,UAAUmH,gBAAkB,SAAU5B,EAAQ6B,GACvD,IAAIC,EAAW,GACf,IAAK,IAAIC,KAAO/B,EAAOgC,iBAAkB,CACrC,IAAIT,EAAQxB,EAAUyB,MACtB,GAAIxB,EAAOgC,iBAAiBD,GAAKE,QAAUC,UAAW,CAClDX,EAAQvB,EAAOgC,iBAAiBD,GAAKE,MAEzC,GAAIV,GAASM,EAAM,CACfC,EAASC,GAAO/B,EAAOgC,iBAAiBD,IAGhD,OAAOD,GAEX5C,EAAazE,UAAU8G,MAAQ,SAAUvB,EAAQ6B,EAAMN,GACnD,IAAIY,EAAkB,SAAUC,GAC5B,GAAKvB,IAAU,MAAQwB,EAAQC,UAAYxC,EAAkByC,KAAS1B,IAAU,OAASwB,EAAQC,UAAYxC,EAAkB0C,GAAK,CAChIJ,EAAYlD,EAAaqB,MAAM,CAC3BkC,IAAK,OACNL,GACH,GAAIA,EAAUM,eAAe,MAAO,CAChC,GAAIN,EAAUO,IAAMpB,EAAMqB,QAAS,CAC/B/B,GAASuB,EAAUK,QAElB,CACD5B,EAAQuB,EAAUK,UAGrB,GAAIL,EAAUM,eAAe,SAAWN,EAAUM,eAAe,MAAO,CACzE,GAAInB,EAAMqB,SAAWR,EAAUS,MAAQtB,EAAMqB,SAAWR,EAAUU,GAAI,CAClEjC,GAASuB,EAAUK,QAElB,CACD5B,EAAQuB,EAAUK,QAKlC,IAAK,IAAIM,KAAQ7D,EAAazE,UAAUmH,gBAAgB5B,EAAQ6B,GAAO,CACnE,IAAIQ,EAAUnD,EAAaqB,MAAM,CAC7B+B,SAAUxC,EAAkByC,KAC7BvC,EAAOgC,iBAAiBe,IAAQlC,EAAQf,EAAkByC,KAAOF,EAAQC,SAC5ED,EAAQW,WAAW7C,QAAQgC,GAC3B,GAAItB,IAAU,KAAM,CAChBwB,EAAQY,SAASnI,KAAKkF,EAAQuB,MAI1CrC,EAAazE,UAAUyI,YAAc,SAAUlD,EAAQrF,GACnD,IAAIwI,EAAsBC,OAAOC,oBAAoBrD,EAAOsD,aAAcC,EAAU,IAAIrH,eAAkBH,EAASiE,EAAOwD,cAAexH,EAAMgE,EAAOyD,OAAQC,EAAc1D,EAAO2D,OAAQC,EAAuBC,mBAAmB7D,EAAO8D,aAAe,IAAMD,mBAAmBH,GACpR,GAAI3H,EAAO8E,MAAM,UAAW,CACxB,GAAI7E,EAAI+H,QAAQ,QAAU,EAAG,CACzB/H,GAAO,IAAM4H,MAEZ,CACD5H,GAAO,IAAM4H,GAGrBL,EAAQ/G,KAAKT,EAAQC,EAAK,MAC1B,IAAK,IAAIxB,EAAI2I,EAAoBvD,OAAS,EAAGpF,GAAK,EAAGA,IAAK,CACtD+I,EAAQS,iBAAiBb,EAAoB3I,GAAIwF,EAAOsD,YAAYH,EAAoB3I,KAE5F+I,EAAQU,mBAAqB,WACzB,GAAIV,EAAQ3H,YAAc,GAAK2H,EAAQ7G,QAAU,IAAK,CAClDsD,EAAOkE,OAAOR,GAAeH,EAAQ5G,SACrChC,EAAS4I,EAAQ5G,YAGzB,OAAO4G,GAEXrE,EAAazE,UAAU0J,KAAO,SAAUnE,EAAQuD,EAASa,GACrD,GAAIA,SAAiB,EAAG,CAAEA,EAAU,KACpC,GAAIpE,EAAOqE,WAAY,CACnB9K,OAAO+K,aAAatE,EAAOqE,YAE/B,GAAID,IAAY,KAAM,CAClBpE,EAAOqE,WAAa9K,OAAOgL,WAAWrF,EAAazE,UAAU0J,KAAKtI,KAAK,KAAMmE,EAAQuD,EAAS,OAAQvD,EAAOwE,WAE5G,CACD,GAAIxE,EAAOyE,QAAS,CAChBzE,EAAOyE,QAAQC,QAEnB1E,EAAOyE,QAAUlB,EACjBvD,EAAOyE,QAAQxH,KAAK+C,EAAO8D,YAAc,IAAM9D,EAAO2D,UAG9DzE,EAAazE,UAAUkK,MAAQ,SAAU3E,EAAQrF,GAC7C,IAAIgC,EAAWqD,EAAO4E,OAAO5E,EAAO2D,QACpC,GAAIhH,IAAauF,UAAW,CACxB,IAAIqB,EAAUrE,EAAazE,UAAUyI,YAAYlD,EAAQrF,GACzDuE,EAAazE,UAAU0J,KAAKnE,EAAQuD,OAEnC,CACD5I,EAASgC,KAGjBuC,EAAazE,UAAU0G,QAAU,SAAUnB,GACvC,IAAK,IAAIuB,KAASvB,EAAOgB,WAAY,CACjChB,EAAOW,MAAMkE,oBAAoBtD,EAAOvB,EAAOgB,WAAWO,IAE9DvB,EAAOS,WAAWpG,WAAWyK,YAAY9E,EAAOS,aAEpD,OAAOvB,EAhJQ,GAkJnBA,EAAaqB,MAAQ,WACjB,IAAIA,EAAQ,GAAIwE,EAChB,IAAK,IAAIvK,EAAI,EAAGA,EAAIwK,UAAUpF,OAAQpF,IAAK,CACvC,IAAKuK,KAAOC,UAAUxK,GAAI,CACtB+F,EAAMwE,GAAOC,UAAUxK,GAAGuK,IAGlC,OAAOxE,GAEXrB,EAAasB,SAAW,CACpBgE,MAAO,IACPS,aAAc,iBACdC,UAAW,CACPC,SAAU,SAAUC,GAChB,OAAO,IAAIC,OAAOD,EAAO,OAE7BE,UAAW,SAAUF,GACjB,MAAO,WAAaA,EAAQ,cAGpC9B,YAAa,CACTiC,eAAgB,qCAEpBC,MAAO,EACPC,SAAU,EACVC,WAAY,MACZC,SAAU,IACVC,IAAK,KACL5D,iBAAkB,CACd6D,MAAS,CACL7C,WAAY,CAAC,CACLL,GAAI,GACJF,IAAK,QAEbQ,SAAU,SAAU1B,GAChB,GAAIpH,KAAKsG,WAAWK,aAAa,SAASiD,QAAQ,UAAY,EAAG,CAC7D,IAAI+B,EAAW3L,KAAKsG,WAAWsF,cAAc,aAC7C,GAAID,IAAa,KAAM,CACnBvE,EAAMyE,iBACN7L,KAAK8L,QAAQH,GACb3L,KAAKsG,WAAW7C,aAAa,QAAS,mBAIlD0E,SAAUxC,EAAkByC,IAC5BN,MAAOlC,EAAU2B,SAErBwE,kBAAqB,CACjBlD,WAAY,CAAC,CACLL,GAAI,GACJF,IAAK,OAET,CACIE,GAAI,GACJF,IAAK,QAEbQ,SAAU,SAAU1B,GAChBA,EAAMyE,kBAEV1D,SAAUxC,EAAkB0C,GAC5BP,MAAOlC,EAAU2B,SAErByE,gBAAmB,CACfnD,WAAY,CAAC,CACLL,GAAI,GACJF,IAAK,OAET,CACIE,GAAI,GACJF,IAAK,QAEbQ,SAAU,SAAU1B,GAChBA,EAAMyE,iBACN,IAAII,EAAQjM,KAAKsG,WAAWsF,cAAc,+BAAgCM,EAAOlM,KAAKsG,WAAWsF,cAAc,8BAA+BO,EAASnM,KAAKsG,WAAWsF,cAAc,aACrL,GAAIO,EAAQ,CACR,IAAIC,EAAetG,MAAMxF,UAAUsJ,QAAQjJ,KAAKwL,EAAOjM,WAAWmM,SAAUF,GAAS3E,EAAW4E,GAAgBhF,EAAMqB,QAAU,IAAK6D,EAAWtM,KAAKsG,WAAWiG,qBAAqB,MAAM9G,OAC3L,GAAI+B,EAAW,EAAG,CACdA,EAAW8E,EAAW,OAErB,GAAI9E,GAAY8E,EAAU,CAC3B9E,EAAW,EAEf2E,EAAO9H,UAAUmI,OAAO,UACxBL,EAAO5K,cAAc8K,SAASI,KAAKjF,GAAUnD,UAAUC,IAAI,eAE1D,GAAI4H,GAAQ9E,EAAMqB,SAAW,GAAI,CAClCyD,EAAK7H,UAAUC,IAAI,eAElB,GAAI2H,EAAO,CACZA,EAAM5H,UAAUC,IAAI,YAG5B6D,SAAUxC,EAAkB0C,GAC5BP,MAAOlC,EAAUyB,OAErBqF,SAAY,CACR7D,WAAY,CAAC,CACLL,GAAI,GACJF,IAAK,MACN,CACCI,KAAM,GACNC,GAAI,GACJL,IAAK,OAEbQ,SAAU,WACN,IAAI6D,EAAW3M,KAAKwG,MAAMG,aAAa,+BAAgCiG,EAAe5M,KAAKwJ,OAC3F,GAAIoD,IAAiB,IAAMA,EAAanH,QAAUzF,KAAK6M,YAAa,CAChE,IAAKF,GAAYC,GAAgBD,EAAU,CACvC3M,KAAKsG,WAAW7C,aAAa,QAAS,qBAE1CsB,EAAazE,UAAUkK,MAAMxK,KAAM,SAAUwC,GACzCxC,KAAK8M,QAAQ9M,KAAK+M,MAAMvK,IACxBxC,KAAKgN,SACPtL,KAAK1B,SAGfmI,SAAUxC,EAAkByC,IAC5BN,MAAOlC,EAAUyB,QAGzBf,WAAY,KACZgE,QAAS,KACT9D,MAAO,KAIPyG,cAAe,WACX,IAAIC,EAAe,GACnB,GAAIlN,KAAKwG,MAAM3C,aAAa,mCAAoC,CAC5DqJ,EAAelN,KAAKwG,MAAMG,aAAa,wCAEtC,GAAI3G,KAAK8K,eAAiB,MAAO,CAClCoC,EAAelN,KAAK8K,iBAEnB,CACDoC,EAAe,GAEnB,OAAOA,GAKXC,OAAQ,WACJ,IAAIC,EAAQpN,KAAKwG,MAAMG,aAAa,2BACpC,GAAI0G,MAAMD,IAAUA,IAAU,KAAM,CAChC,OAAOpN,KAAKqL,MAEhB,OAAOiC,SAASF,EAAO,KAK3BP,UAAW,WACP,IAAIU,EAAWvN,KAAKwG,MAAMG,aAAa,8BACvC,GAAI0G,MAAME,IAAaA,IAAa,KAAM,CACtC,OAAOvN,KAAKsL,SAEhB,OAAOgC,SAASC,EAAU,KAK9BC,WAAY,SAAUC,GAClB,OAAOA,EAAMpK,QAAQrD,KAAK+K,UAAUC,SAAShL,KAAKwJ,QAASxJ,KAAK+K,UAAUI,YAK9E9B,YAAa,WACT,GAAIrJ,KAAKwG,MAAM3C,aAAa,4BAA6B,CACrD,OAAO7D,KAAKwG,MAAMG,aAAa,4BAEnC,OAAO3G,KAAKuL,YAKhB5B,UAAW,WACP,GAAI3J,KAAKwG,MAAM3C,aAAa,gCAAiC,CACzD,OAAO7D,KAAKwG,MAAMG,aAAa,gCAEnC,OAAO3G,KAAKwL,UAKhBlC,KAAM,WACF,GAAItJ,KAAKwG,MAAM3C,aAAa,qBAAsB,CAC9C,OAAO7D,KAAKwG,MAAMG,aAAa,qBAEnC,OAAO3G,KAAKyL,KAKhB1E,MAAO,SAAU2G,GACb,GAAIA,IAAQ,KAAM,CACd1N,KAAKsG,WAAW7C,aAAa,QAAS,gBACtCzD,KAAKwG,MAAM/C,aAAa,8BAA+BzD,KAAKwG,MAAMyE,WAEjE,CACD,IAAIpF,EAAS7F,KACboK,WAAW,WACPvE,EAAOkB,MAAM,OACd,OAMX0D,OAAQ,SAAUQ,GACd,OAAOjL,KAAK+J,OAAOkB,IAKvB/D,OAAQ,WACJ,IAAIyF,EAAW3M,KAAKwG,MAAMG,aAAa,+BACvC,KAAMgG,GAAY3M,KAAKwG,MAAMyE,OAAS0B,IAAa3M,KAAK6M,aAAe7M,KAAKwG,MAAMyE,MAAMxF,OAAQ,CAC5FzF,KAAKsG,WAAW7C,aAAa,QAAS,uBAM9CuJ,MAAO,WACH,IAAInH,EAAS7F,KACb8F,MAAMxF,UAAU0F,QAAQrF,KAAKX,KAAKsG,WAAWiG,qBAAqB,MAAO,SAAUoB,GAC/E,GAAIA,EAAGhH,aAAa,UAAY,SAAU,CACxCgH,EAAGC,QAAU,SAAUxG,GACjBvB,EAAOiG,QAAQ6B,IAEnBA,EAAGE,aAAe,WACd,IAAI1B,EAAStG,EAAOS,WAAWsF,cAAc,aAC7C,GAAIO,IAAWwB,EAAI,CACf,GAAIxB,IAAW,KAAM,CACjBA,EAAO9H,UAAUmI,OAAO,UAE5BmB,EAAGtJ,UAAUC,IAAI,gBASrCsC,UAAW,WACP5G,KAAKsG,WAAW7C,aAAa,QAAS,gBACtCzD,KAAKsG,WAAW7C,aAAa,QAAS,QAAUzD,KAAKwG,MAAMsH,UAAY9N,KAAKwG,MAAMuH,cAAgB,WAAa/N,KAAKwG,MAAMwH,WAAa,YAAchO,KAAKwG,MAAMyH,YAAc,QAKlLnB,QAAS,SAAUtK,GACf,IAAI0L,EACJ,UAAW1L,GAAY,SAAU,CAC7B0L,EAAKlO,KAAKmO,WAAW3L,OAEpB,CACD0L,EAAKlO,KAAKoO,qBAAqB5L,GAEnC,GAAIxC,KAAKsG,WAAW+H,gBAAiB,CACjCrO,KAAKsG,WAAWqE,YAAY3K,KAAKsG,WAAWgI,WAAW,IAE3DtO,KAAKsG,WAAW3C,YAAYuK,IAKhCE,qBAAsB,SAAU5L,GAC5B,IAAI0L,EAAK/N,SAASqD,cAAc,MAAOmK,EAAKxN,SAASqD,cAAc,MAAO4J,EAAQpN,KAAKmN,SAEvF,GAAIC,EAAQ,EAAG,CACX5K,EAAWA,EAAS+L,eAEnB,GAAInB,IAAU,EAAG,CAClBA,EAAQ5K,EAASiD,OAErB,IAAK,IAAIgH,EAAO,EAAGA,EAAO+B,KAAKC,IAAID,KAAKE,IAAItB,GAAQ5K,EAASiD,QAASgH,IAAQ,CAC1EkB,EAAGgB,UAAYnM,EAASiK,GAAMmC,MAC9BjB,EAAGlK,aAAa,0BAA2BjB,EAASiK,GAAMoC,OAC1DX,EAAGvK,YAAYgK,GACfA,EAAKxN,SAASqD,cAAc,MAEhC,OAAO0K,GAKXC,WAAY,SAAU3L,GAClB,IAAI0L,EAAK/N,SAASqD,cAAc,MAAOmK,EAAKxN,SAASqD,cAAc,MACnE,GAAIhB,EAASiD,OAAS,EAAG,CACrBzF,KAAKsG,WAAWqI,UAAYnM,MAE3B,CACD,IAAI0K,EAAelN,KAAKiN,gBACxB,GAAIC,IAAiB,GAAI,CACrBS,EAAGgB,UAAYzB,EACfS,EAAGlK,aAAa,QAAS,UACzByK,EAAGvK,YAAYgK,IAGvB,OAAOO,GAKXnB,MAAO,SAAUvK,GACb,IACI,IAAIsM,EAAiB,GAErB,IAAIC,EAAOC,KAAKC,MAAMzM,GACtB,GAAIyG,OAAOiG,KAAKH,GAAMtJ,SAAW,EAAG,CAChC,MAAO,GAEX,GAAIK,MAAMC,QAAQgJ,GAAO,CACrB,IAAK,IAAI1O,EAAI,EAAGA,EAAI4I,OAAOiG,KAAKH,GAAMtJ,OAAQpF,IAAK,CAC/CyO,EAAeA,EAAerJ,QAAU,CAAEoJ,MAASE,EAAK1O,GAAIuO,MAAS5O,KAAKwN,WAAWuB,EAAK1O,UAG7F,CACD,IAAK,IAAI4K,KAAS8D,EAAM,CACpBD,EAAeK,KAAK,CAChBN,MAAS5D,EACT2D,MAAS5O,KAAKwN,WAAWuB,EAAK9D,OAI1C,OAAO6D,EAEX,MAAO1H,GAEH,OAAO5E,IAMfgH,KAAM,WACF,OAAOxJ,KAAKwG,MAAMyE,OAKtBa,QAAS,SAAUW,GACtB5L,QAAQC,IAAI,kBACL,GAAI2L,EAAK5I,aAAa,2BAA4B,CAC9C7D,KAAKwG,MAAMyE,MAAQwB,EAAK9F,aAAa,+BAEpC,CACD3G,KAAKwG,MAAMyE,MAAQwB,EAAKkC,UAE5B3O,KAAKwG,MAAM/C,aAAa,8BAA+BzD,KAAKwG,MAAMyE,QAEtEf,WAAY,KACZH,OAAQ,GACRlD,WAAY,IAEhBpC,EAAOD,QAAUO,GAEf,KAAK,GAAG,CAAC,GAthB0W,CAshBtW;;;;;;;;;;;CAYf,SAAUzF,EAAGC,GACX,aAEA,SAAS6P,EAAYC,EAAoBC,EAAkBC,EAAcC,GACvExP,KAAKqP,mBAAqBA,EAC1BrP,KAAKsP,iBAAmBA,EACxBtP,KAAKuP,aAAeA,EACpBvP,KAAKyP,OAAS,GACdzP,KAAKwP,UAAYA,EACjBxP,KAAK0P,cAAgB,KAcvBN,EAAY9O,UAAUqP,WAAa,SAASC,EAAQC,GAClD,IAAI3K,EAAI,EACR4K,EAEAD,GAASD,EAAOnK,OAASzF,KAAKyP,OAC9B,IAAK,IAAIpP,EAAI,EAAGA,EAAIuP,EAAOnK,OAAQpF,IAAK,CACtCyP,EAAMF,EAAOvP,GACb,GAAKyP,EAAIC,aAAe,GAAOD,EAAIE,cAAgB,EAAI,CACrD9K,GAAK4K,EAAIC,aAAeD,EAAIE,kBACvB,CAEL9K,GAAK,GAIT,OAAO2K,EAAQ3K,GAGjBkK,EAAY9O,UAAU2P,SAAW,SAASL,EAAQM,GAChD,IAAIJ,EAAKK,EAAUC,EAAeR,EAAOnK,OACzC,IAAK,IAAIpF,EAAI,EAAGA,EAAI+P,EAAc/P,IAAK,CACrCyP,EAAMF,EAAOvP,GACb,GAAKyP,EAAIC,aAAe,GAAOD,EAAIE,cAAgB,EAAI,CACrDG,EAAWD,EAASJ,EAAIC,aAAeD,EAAIE,kBACtC,CAELG,EAAWD,EAEbJ,EAAIO,MAAMR,MAAQM,EAAW,KAC7BL,EAAIO,MAAMH,OAASA,EAAS,KAC5BJ,EAAIO,MAAMC,WAAa,MACvBR,EAAIO,MAAME,UAAY,MACtBT,EAAIO,MAAMG,YAAcxQ,KAAKyP,OAAS,EAAI,KAC1CK,EAAIO,MAAMI,aAAezQ,KAAKyP,OAAS,EAAI,OAI/CL,EAAY9O,UAAUoQ,WAAa,SAASC,GAC1C,IAAIC,EAAOC,EACXC,EAAiBvR,EAAEqM,cAAc5L,KAAKqP,oBAAoBpB,YAE1D3O,EAAG,MAAOqR,EAASlL,OAAS,EAAG,CAC7B,IAAK,IAAIpF,EAAI,EAAGA,GAAKsQ,EAASlL,OAAQpF,IAAK,CACzCuQ,EAAQD,EAASC,MAAM,EAAGvQ,GAC1BwQ,EAAI7Q,KAAK2P,WAAWiB,EAAOE,GAC3B,GAAID,EAAI7Q,KAAKwP,UAAW,CACtBxP,KAAKiQ,SAASW,EAAOC,GACrBF,EAAWA,EAASC,MAAMvQ,GAC1B,SAASf,GAGbU,KAAKiQ,SAASW,EAAOpC,KAAKC,IAAIzO,KAAKwP,UAAWqB,IAC9C,QAIJzB,EAAY9O,UAAUyQ,MAAQ,SAASzB,GACrC,IAAI0B,EAAuBzR,EAAEa,iBAAiBJ,KAAKsP,kBACnD2B,EAAiBD,EAAqBvL,OACtCyL,EAAW,KACXC,EAAU,KACVR,EAAW,GACX,IAAK,IAAItQ,EAAI,EAAGA,EAAI4Q,EAAgB5Q,IAAK,CACvC8Q,EAAUH,EAAqB3Q,GAC/B,GAAI8Q,EAAQC,yBAA2BF,GAAYP,EAASlL,OAAS,EAAG,CAItEzF,KAAK0Q,WAAWC,GAEhBA,EAAW,GAGbA,EAASxB,KAAKgC,EAAQvF,cAAc5L,KAAKuP,eAEzC2B,EAAWC,EAGb,GAAIR,EAASlL,OAAS,EAAG,CACvBzF,KAAK0Q,WAAWC,KAIpBvB,EAAY9O,UAAU+Q,MAAQ,WAC5B,IAAIhR,EAAGyP,EAAKa,EAAUW,EACtBtQ,EAAMhB,KACNuR,EAAgBhS,EAAEa,iBAAiBJ,KAAKsP,kBACxC2B,EAAiBM,EAAc9L,OAE/B,SAASsL,EAAMrQ,GACbM,EAAI+P,QAGN,SAASS,EAAc9Q,GACrB,GAAIM,EAAI0O,cAAe,CACrB1O,EAAI0O,cAAgB,MACpBtF,WAAW,WACTpJ,EAAI+P,QACJ/P,EAAI0O,cAAgB,MACnB,MAIPpQ,EAAE6B,iBAAiB,SAAUqQ,GAC7BlS,EAAE6B,iBAAiB,WAAY4P,GAE/B,IAAK1Q,EAAI,EAAGA,EAAI4Q,EAAgB5Q,IAAK,CACnCyP,EAAMyB,EAAclR,GAAGuL,cAAc5L,KAAKuP,cAC1C,UAAWO,IAAQ,YAAa,CAC9BA,EAAI3O,iBAAiB,OAAQqQ,GAC7B1B,EAAI3O,iBAAiB,QAASqQ,MAKpClS,EAAED,MAAM+P,YAAcA,GA1IxB,CA4IGhQ,OAAQe,UACVd,MAAMmC,MAAM,WAEXnC,MAAM0B,GAAG,UAAW,QAAS,WAC3B0Q,EAAgBzR,KAAhByR,CAAsB,QAGxBpS,MAAM0B,GAAG,YAAa,QAAS,SAASL,GACtC,IAAID,EAAKC,EAAEU,OACX,MAAOX,IAAOsH,UAAW,CACvB,GAAItH,EAAG4D,UAAUqN,SAAS,UAAW,CACnC,GAAIjR,EAAGkG,aAAa,uBAAyB,KAAM,CACjD8K,EAAgBhR,EAAhBgR,CAAoB,MAEtB,MAEFhR,EAAKA,EAAGP,aAET,MAEH,IAAIyR,EAAU,CACZC,GAAI,CACFhK,IAAK,SACLiK,IAAKC,EACLC,IAAK,sCACLC,IAAK,WAEPC,GAAI,CACFrK,IAAK,IACLiK,IAAKK,EACLH,IAAK,4BACLC,IAAK,WAEPG,GAAI,CACFvK,IAAK,IACLiK,IAAKO,GAAYhT,OAAOiT,aACxBN,IAAK,qBACLC,IAAK,cAEPM,GAAI,CACF1K,IAAK,IACLiK,IAAKO,EAAWhT,OAAOiT,aACvBN,IAAK,uBACLC,IAAK,cAEPO,GAAI,CACF3K,IAAK,IACLiK,IAAKO,GAAYhT,OAAOiT,YAAc,GACtCN,IAAK,wBACLC,IAAK,cAEPQ,GAAI,CACF5K,IAAK,IACLiK,IAAKO,EAAWhT,OAAOiT,YAAc,GACrCN,IAAK,0BACLC,IAAK,cAEPS,GAAI,CACF7K,IAAK,IACLiK,IAAKa,GAAcvS,SAASuD,KAAKiP,aAAc,OAC/CZ,IAAK,gCACLC,IAAK,cAEPY,GAAI,CACFhL,IAAK,IACLiK,IAAKa,EAAavS,SAASuD,KAAKiP,aAAc,UAC9CZ,IAAK,mCACLC,IAAK,cAEPa,GAAI,CACFjL,IAAK,IACLiK,IAAKJ,EAAgB,MACrBM,IAAK,gCACLC,IAAK,WAEPc,GAAI,CACFlL,IAAK,IACLiK,IAAKJ,EAAgB,QACrBM,IAAK,4BACLC,IAAK,WAEPe,GAAI,CACFnL,IAAK,IACLiK,IAAKmB,EAAgB,GACrBjB,IAAK,sBACLC,IAAK,WAEPiB,GAAI,CACFrL,IAAK,IACLiK,IAAKmB,EAAgB,GACrBjB,IAAK,kBACLC,IAAK,WAEPkB,GAAI,CACFtL,IAAK,IACLiK,IAAKsB,EAAW,OAChBpB,IAAK,qBACLC,IAAK,WAEPoB,GAAI,CACFxL,IAAK,IACLiK,IAAKsB,EAAW,MAChBpB,IAAK,+BACLC,IAAK,WAEPqB,GAAI,CACFzL,IAAK,IACLiK,IAAKyB,EACLvB,IAAK,8BACLC,IAAK,WAEPuB,GAAI,CACF3L,IAAK,IACLiK,IAAK2B,EACLzB,IAAK,qBACLC,IAAK,UAIT3S,MAAM0B,GAAGZ,SAAU,UAAW,SAASO,GAErC,GAAIiR,EAAQpJ,eAAe7H,EAAE+H,WAAa/H,EAAE+S,UAAY/S,EAAEgT,SAAWhT,EAAEiT,WAAajT,EAAEkT,QAAS,CAC7F,IAAIC,EAAUnT,EAAEU,OAAOyS,QAAQC,cAC/B,GAAIpT,EAAE+H,UAAY,GAAI,CACpB,GAAIoL,IAAY,SAAWA,IAAY,UAAYA,IAAY,WAAY,CACzElC,EAAQjR,EAAE+H,SAASoJ,WAEhB,CACL,GAAInR,EAAEU,SAAWjB,SAASuD,MAAQmQ,IAAY,KAAOA,IAAY,SAAU,CACzEnT,EAAEmL,iBACF8F,EAAQjR,EAAE+H,SAASoJ,WAM3B,SAASJ,EAAgBsC,GACvB,OAAO,SAASC,GACd,IAAI7C,EAAUhR,SAASyL,cAAc,8BACrCqI,EAAiBF,EACjB,GAAI5C,IAAY,KAAM,CAEpBA,EAAUhR,SAASyL,cAAc,WACjC,GAAIuF,IAAY,KAAM,CAEpB,OAGF,GAAI4C,IAAU,QAAUA,IAAU,KAAM,CACtCE,EAAiB9C,GAIrB,IAAI+C,EAAMC,EAAUhU,SAASC,iBAAiB,WAE9C,UAAW6T,IAAmB,SAAU,CACtCC,EAAOD,MACF,CACL,OAAQA,GACN,IAAK,UACL,IAAIG,EAAMjU,SAASkU,gBAAgBC,WAAanU,SAASuD,KAAK4Q,UAC9D,IAAIC,EAAMH,EAAMjU,SAASkU,gBAAgBG,aAEzC,IAAK,IAAInU,EAAI,EAAGA,EAAI8T,EAAQ1O,OAAQpF,IAAK,CACvC6T,EAAOC,EAAQ9T,GACf,IAAIoU,EAAOP,EAAKpG,UAChB,IAAI4G,EAAOD,EAAOP,EAAKM,aAEvB,GAAKE,GAAQH,GAASE,EAAOL,EAAM,CACjC,OAGJ,MACA,IAAK,OACLF,EAAO/C,EAAQwD,mBACf,GAAIT,IAAS,KAAM,CACjBA,EAAOC,EAAQ,GAEjB,MACA,IAAK,KACLD,EAAO/C,EAAQC,uBACf,GAAI8C,IAAS,KAAM,CACjBA,EAAOC,EAAQA,EAAQ1O,OAAS,GAElC,MACA,IAAK,SACLyO,EAAOC,EAAQA,EAAQ1O,OAAS,GAChC,MACA,IAAK,MAEL,QACAyO,EAAOC,EAAQ,IAInB,GAAID,EAAM,CACR/C,EAAQyD,gBAAgB,qBACxBV,EAAKzQ,aAAa,oBAAqB,QACvC,IAAIoR,EAAOX,EAAKtI,cAAc,SAAWsI,EAAKtI,cAAc,KAC5D,GAAIiJ,IAAS,KAAM,CACjBA,EAAK5N,QAEP,IAAK+M,EAAU,CACbc,OAMR,SAASxB,IACPnT,SAAS4U,SAASC,OAAO,MAG3B,SAASlD,IACP,GAAI3R,SAAS8U,cAAe,CAC1B9U,SAAS8U,cAAcnO,QAI3B,SAASkM,EAAgBkC,GACvB,OAAO,WACL,IAAIC,EAAUC,EAAE,wCAChB,GAAID,EAAQ1P,SAAW,EAAG,CACxB5E,QAAQC,IAAI,oDACZ,OAEF,GAAIoU,GAAO,GAAKA,EAAMC,EAAQ1P,OAAQ,CACpC0P,EAAQD,GAAKG,YACR,CACLxU,QAAQC,IAAI,yCAKlB,SAASgU,IACP,IAAIQ,EAAMnV,SAASyL,cAAc,8BACjC,GAAI0J,IAAQ,KAAM,CAChB,OAEF,IAAIC,EAAOpV,SAASkU,gBAAgBC,WAAanU,SAASuD,KAAK4Q,UAC/DkB,EAAUrV,SAASkU,gBAAgBG,aACnCC,EAAOa,EAAIxH,UACX4G,EAAOD,EAAOa,EAAId,aAClBiB,EAAS,IAET,GAAKH,EAAIlE,yBAA2B,MAAUsD,EAAOc,EAAU,CAG7DpW,OAAOsW,OAAOtW,OAAOuW,QAAS,GAC9B,OAEF,GAAIJ,EAAQd,EAAOgB,EAAS,CAC1BrW,OAAOsW,OAAOtW,OAAOuW,QAASlB,EAAOgB,OAChC,CACL,IAAIG,EAAOL,EAAOC,EAClB,GAAII,EAAQlB,EAAOe,EAAS,CAC1BrW,OAAOsW,OAAOtW,OAAOuW,QAASjB,EAAOc,EAAUC,KAKrD,SAASrD,EAAWyD,GAClB,OAAO,WACLzW,OAAO0W,SAAS,EAAGD,GACnBpE,EAAgB,UAAhBA,IAIJ,SAASiB,EAAalL,EAAUuO,GAC9B,OAAO,WACL3W,OAAO4W,SAAS,EAAGxO,GACnBiK,EAAgBsE,EAAhBtE,IAIJ,SAASS,IACP9S,OAAO4W,SAAS,EAAG,GACnB7V,SAASyL,cAAc,MAAM3E,QAG/B,SAASkM,EAAW8C,GAClB,OAAO,WACL,IAAIpB,EAAO1U,SAASyL,cAAc,mCAClC,GAAIiJ,IAAS,KAAM,CACjB,IAAIhT,EAAMgT,EAAKlO,aAAa,QAC5B,GAAIsP,EAAQ,CACV7W,OAAOiD,KAAKR,OACP,CACLzC,OAAO2V,SAASmB,KAAOrU,KAM/B,SAASsU,EAAgBC,GACvB,IAAIC,EAAa,GAEjB,IAAK,IAAIC,KAAK3E,EAAS,CACrB,IAAI/J,EAAM+J,EAAQ2E,GAClBD,EAAWzO,EAAIoK,KAAOqE,EAAWzO,EAAIoK,MAAQ,GAC7CqE,EAAWzO,EAAIoK,KAAK7C,KAAKvH,GAG3B,IAAI2O,EAAStN,OAAOiG,KAAKmH,GAAYG,KAAK,SAASnR,EAAGoR,GACpD,OAAOJ,EAAWI,GAAGhR,OAAS4Q,EAAWhR,GAAGI,SAG9C,GAAI8Q,EAAO9Q,SAAW,EAAG,CACvB,OAGH,IAAIiR,EAAO,mEACVA,GAAQ,uDACVA,GAAQ,UAEN,IAAK,IAAIrW,EAAI,EAAGA,EAAIkW,EAAO9Q,OAAQpF,IAAK,CACtC,IAAI2R,EAAMqE,EAAWE,EAAOlW,IAE5B,IAAIsW,EAAetW,IAAOkW,EAAO9Q,OAAS,EAC1C,IAAIwG,EAAQ5L,EAAI,IAAM,EAEtB,GAAI4L,EAAO,CACTyK,GAAQ,OAEVA,GAAQ,OAERA,GAAQ,OAAS1E,EAAI,GAAGA,IAAM,QAC9B0E,GAAQ,6BAER,IAAK,IAAIE,KAAM5E,EAAK,CAClB0E,GAAQ,YAAc1E,EAAI4E,GAAIhP,IAAM,UAAYoK,EAAI4E,GAAI7E,IAAM,QAGhE2E,GAAQ,QACRA,GAAQ,QAER,IAAKzK,GAAS0K,EAAc,CAC1BD,GAAQ,SAIdA,GAAQ,WAENN,EAAWzH,UAAY+H,EAGzB,SAASlD,IACR,IAAIqD,EAAY1W,SAASyL,cAAc,qBACvC/K,QAAQC,IAAI+V,GACb,GAAIA,IAAc9O,WAAa8O,IAAc,KAAM,CAElDA,EAAY1W,SAASqD,cAAc,OAChCqT,EAAUzT,GAAK,mBACjByT,EAAUC,UAAU,eACpBD,EAAUxG,MAAM,aACjB8F,EAAgBU,GAChB,IAAInT,EAAOvD,SAASoM,qBAAqB,QAAQ,GACjD7I,EAAKC,YAAYkT,OACX,CAENA,EAAUxS,UAAU0S,OAAO,aAC3B,YAuBH,SAAWzX,EAAGC,EAAGF,GACf,aAEAA,EAAMmC,MAAM,WACVnC,EAAM0B,GAAG,0BAA2B,QAAS,SAASqG,GAEpDpH,KAAKqE,UAAUmI,OAAO,0BAGtB,IAAIwK,EAAe,gDACnB,IAAIC,EAAcD,EAAe,2BACjC,IAAIE,EAAY,cAEhB,IAAIC,EAASnX,KAAKoX,QAAQC,MAC1B,IAAIC,EAAWtX,KAAKoX,QAAQG,QAC5B,IAAIC,EAAejY,EAAEqM,cAAc,IAAM5L,KAAKoX,QAAQK,aACtD,IAAIC,EAAwBnY,EAAEqM,cAAc,IAAM5L,KAAKoX,QAAQO,qBAG/D,IAAIC,EAAkB,CAAE,YAAa,eAAgB,mBAAoB,gBAAiB,eAE1F,GAAGT,GAAUG,GAAYE,EAAc,CACrC,IAAIK,EAAQ,KACZ,OAAOP,GACL,IAAK,OACLO,EAAQZ,EAAc,QAAUE,EAAS,KAAOD,EAChD,MACA,IAAK,MACLW,EAAQZ,EAAc,OAASE,EAAS,KAAOD,EAC/C,MACA,IAAK,WACLW,EAAQZ,EAAc,YAAcE,EAAS,KAAOD,EACpD,MACA,QACA,MAEF,GAAGW,EAAO,CAERxY,EAAMsC,KAAM,MAAOkW,GAAQ1V,KAAK,SAASuU,EAAMoB,GAC7CpB,EAAO1H,KAAKC,MAAMyH,GAClB,GAAGA,GAAQA,EAAKzQ,UAAYyQ,EAAKzQ,SAAS,GAAI,CAC5C,IAAI/B,EAAUwS,EAAKzQ,SAAS,GAC5B,IAAI8R,EAAU,GACd,IAAK,IAAIC,KAAO9T,EAAQ+T,KAAM,CAC5B,GAAG/T,EAAQ+T,KAAKrP,OAAS,MAAQgP,EAAgBhO,QAAQoO,KAAS,EAAG,CACnED,GAAW,WAAaC,EAAM,YAC9B,OAAOA,GACL,IAAK,QACL,IAAK,MACLD,GAAW,gBAAmB7T,EAAQ+T,KAAKD,GAAK3U,QAAQ,KAAK,IAAM,KAAQa,EAAQ+T,KAAKD,GAAO,OAC/F,MACA,IAAK,QACLD,GAAW,mBAAsB7T,EAAQ+T,KAAKD,GAAO,KAAQ9T,EAAQ+T,KAAKD,GAAO,OACjF,MACA,IAAK,UACL,IAAK,MACLD,GAAW,YAAe7T,EAAQ+T,KAAKD,GAAO,KAAQ9T,EAAQ+T,KAAKD,GAAO,OAC1E,MACA,IAAK,WACLD,GAAW,0CAA6C7T,EAAQ+T,KAAKD,GAAO,KAAQ9T,EAAQ+T,KAAKD,GAAO,OACxG,MACA,IAAK,YACL,GAAG9T,EAAQ+T,KAAKD,GAAKpO,QAAQ,OAAS,EAAG,CACvCmO,GAAW,oBAAuB7T,EAAQ+T,KAAKD,GAAKE,UAAU,EAAEhU,EAAQ+T,KAAKD,GAAKpO,QAAQ,MAAQ,uBAAyB1F,EAAQ+T,KAAKD,GAAKE,UAAUhU,EAAQ+T,KAAKD,GAAKpO,QAAQ,KAAK,GAAK,KAAQ1F,EAAQ+T,KAAKD,GAAO,OACvN,MAGF,QAEAD,GAAW7T,EAAQ+T,KAAKD,GACxB,MAEFD,GAAW,cAGtBL,EAAsBxX,WAAWyK,YAAY+M,GACtCF,EAAanT,UAAUmI,OAAO,aAC9BgL,EAAa5L,cAAc,SAAS+C,UAAYoJ,KAGnD3V,MAAM,WACLsV,EAAsBrT,UAAUmI,OAAO,aACvCkL,EAAsB/I,UAAY,0BAMxCvH,EAAMyE,mBAGRxM,EAAM0B,GAAG,kBAAmB,QAAS,SAASqG,GAE5CpH,KAAKqE,UAAUmI,OAAO,kBAGtB,IAAI2L,EAAiBnY,KAAKoX,QAAQgB,cAClC,IAAIC,EAAUC,WAAWtY,KAAKoX,QAAQmB,QACtC,IAAIC,EAAUF,WAAWtY,KAAKoX,QAAQqB,QACtC,IAAIC,EAAWJ,WAAWtY,KAAKoX,QAAQuB,SACvC,IAAIC,EAAkB5J,KAAKC,MAAMjP,KAAKoX,QAAQyB,gBAC9C,IAAIC,EAAc9J,KAAKC,MAAMjP,KAAKoX,QAAQ2B,YAE1C1Z,EAAM2D,UAAU,uBAChB3D,EAAMuE,WAAW,qBAAsB,WACrC,IAAIoV,EAAa,KACjB,GAAGJ,EAAiB,CAClB,IAAIK,EAAYC,EAAEC,OAAOP,EAAgB,GAAIA,EAAgB,IAC7D,IAAIQ,EAAYF,EAAEC,OAAOP,EAAgB,GAAIA,EAAgB,IAC7DI,EAAaE,EAAEG,aAAaJ,EAAWG,GAIzC,IAAIE,EAAMJ,EAAEI,IAAInB,GAEhB,IAAIoB,EAAa,qDACjB,IAAIC,EAAgB,gFACpB,IAAIC,EAAY,IAAIP,EAAEQ,UAAUH,EAAc,CAACI,QAAS,EAAGC,QAAS,GAAIC,YAAaL,IACrF,IAAIM,EAAgB,sDACpB,IAAIC,EAAqB,uGACzB,IAAIC,EAAe,IAAId,EAAEQ,UAAUI,EAAiB,CAACH,QAAS,EAAGC,QAAS,GAAIC,YAAaE,IAE3F,GAAGf,EAAY,CAGb5O,WAAW,WACTkP,EAAIW,UAAUjB,EAAY,CACxBY,QAAQ,MAET,QACE,GAAIvB,GAAWG,EAAS,CAC7B,GAAGE,EAAU,CACXY,EAAIY,QAAQ,IAAIhB,EAAEC,OAAOX,EAASH,GAASK,OACtC,CACLY,EAAIY,QAAQ,IAAIhB,EAAEC,OAAOX,EAASH,GAAS,IAI/CiB,EAAIa,SAASV,GAEb,IAAIW,EAAa,CACfC,aAAcZ,GAIhBP,EAAEoB,QAAQC,OAAOH,GAAYI,MAAMlB,GAEnC,GAAGR,EAAa,CACdI,EAAEuB,QAAQ3B,GAAa0B,MAAMlB,MAOjClS,EAAMyE,sBA3JZ,CA8JGzM,OAAQe,SAAUf,OAAOC,QAiB5B,SAAUC,EAAGC,EAAGF,GACd,aAEAA,EAAMmC,MAAM,WACVnC,EAAMqb,uBAAyB,IAAIrb,EAAM+P,YAAY,QAAS,uBAAwB,sBAAuB,KAC7G/P,EAAMqb,uBAAuBrJ,QAE7BhS,EAAM0B,GAAG,gBAAiB,QAAS,SAASqG,GAC1C,IAAIuT,EAAoB3a,KAAK2G,aAAa,2BAC1C,IAAIiU,EAAuB5a,KAAK2G,aAAa,+BAC7C,IAAIvF,EAASpB,KAAK2G,aAAa,eAC/B,IAAIkU,EAAgBtb,EAAEqM,cAAcxK,GACpC,IAAIsV,EAAO1W,KAAK2O,UAChB,GAAI3O,KAAKqE,UAAUqN,SAAS,aAAc,CACxCgF,EAAOA,EAAKrT,QAAQsX,EAAmBC,OAClC,CACLlE,EAAOA,EAAKrT,QAAQuX,EAAsBD,GAE5C3a,KAAK2O,UAAY+H,EACjB1W,KAAKqE,UAAU0S,OAAO,aACtB8D,EAAcxW,UAAU0S,OAAO,eAGjC1X,EAAM0B,GAAG,gBAAiB,QAAS,SAASqG,GAC1C,IAAIhG,EAASpB,KAAK2G,aAAa,eAC/B,IAAImU,EAAcvb,EAAEqM,cAAcxK,EAAS,aAC3C,IAAI2Z,EAAUD,EAAYnU,aAAa,OACvC,GAAIoU,IAAY,MAAQA,IAAYhT,WAAagT,IAAY,MAAO,CAClED,EAAYrX,aAAa,MAAOqX,EAAYnU,aAAa,gBAI7DrH,EAAE6B,iBAAiB,SAAU,WAC3B,IAAIT,EAAInB,EAAEgE,eAAe,aACzB+Q,EAAYnU,SAASkU,gBAAgBC,WAAanU,SAASuD,KAAK4Q,UAChE,GAAI5T,IAAM,KAAM,CACd,GAAI4T,GAAa,IAAK,CACpB5T,EAAE2P,MAAM2K,QAAU,MACb,CACLta,EAAE2P,MAAM2K,QAAU,SAvC5B,CA8CG5b,OAAQe,SAAUf,OAAOC,QAiB5B,SAAUC,EAAGC,EAAGF,GACd,aAEA,IAAI4b,EAAa,KAAMC,EAAY,IAAKC,EAExC,SAASC,EAAiBlX,GACxB,GAAIA,EAAQmX,kBAAmB,CAC7B,IAAIC,EAAMpX,EAAQ+G,MAAMxF,OACxBvB,EAAQmX,kBAAkBC,EAAKA,IAInC,SAASC,IACP,GAAIJ,EAAOlQ,MAAMxF,OAAU,EAAG,CAC5B,IAAI+V,EAASrb,SAASoD,eAAe,UACrC6G,WAAWoR,EAAOC,OAAO/Z,KAAK8Z,GAAS,IAI3C,SAASE,EAAkBP,GACzB,IAAIQ,EAAKxb,SAASoD,eAAe,gBACjC,IAAIqY,EAAoB,WACtB,GAAIT,EAAOlQ,MAAMxF,SAAW,EAAG,CACpCkW,EAAGtX,UAAUC,IAAI,aACL,CACZqX,EAAGtX,UAAUmI,OAAO,WAKjBoP,IACAD,EAAGxa,iBAAiB,QAAS,WAC3Bga,EAAOlQ,MAAM,GACbkQ,EAAOlU,QACP2U,MAEFT,EAAOha,iBAAiB,QAASya,EAAmB,OAGtDvc,EAAMmC,MAAM,WACV2Z,EAAS5b,EAAEgE,eAAe2X,GAE1B,SAASW,EAAqBnb,GAC5B,GAAIua,EAAY,CACdG,EAAiBD,GACjBF,EAAa,UACR,GAKT,GAAIE,IAAW,KAAM,CAEnBO,EAAkBP,GAGlB,GAAI9b,EAAMyc,cAAe,CACvBzc,EAAM0c,aAAehX,aAAapE,KAAKrB,EAAG,CACxCmM,IAAK,kBACLX,aAAczL,EAAM2c,cACpBzQ,WAAYlM,EAAMuC,OAClB0J,SAAU,EACVjB,MAAO,KACN,IAAM6Q,GAGT5b,EAAE6B,iBAAiB,SAAU,WAC3B,IAAIiG,EAAQ,IAAI6U,YAAY,YAC5Bd,EAAOe,cAAc9U,KAIzB+T,EAAOha,iBAAiB,QAAS0a,EAAsB,OACvDV,EAAOlU,QAIT,GAAIkU,IAAW,MAAQ9b,EAAM8c,0BAA2B,CACtD5c,EAAEqM,cAAc,SAASkL,UAAU,YAEnCzX,EAAM0B,GAAG,oBAAqB,SAAU,SAASL,GAC/C,IAAIL,EAAGgW,EAAa9W,EAAEa,iBAAiB,sCACvC,IAAIC,EAAE,EAAGA,EAAEgW,EAAW5Q,OAAQpF,IAAK,CACjC,GAAIgW,EAAWhW,KAAOL,MAAQqW,EAAWhW,GAAG+b,QAAS,CACnD/F,EAAWhW,GAAGgV,SAGlB,IAAMrV,KAAKoc,QAAS,CAClBpc,KAAKqV,QAEPkG,IACA,OAAO,QAGTlc,EAAM0B,GAAGxB,EAAEgE,eAAe,cAAe,SAAUgY,GACnDlc,EAAM0B,GAAGxB,EAAEgE,eAAe,YAAa,SAAUgY,OA/FvD,CAoGGnc,OAAQe,SAAUf,OAAOC","file":"searx.min.js"} \ No newline at end of file
diff --git a/searx/static/themes/simple/js/searx_head/00_init.js b/searx/static/themes/simple/js/searx_head/00_init.js
new file mode 100644
index 000000000..3ac61c8ae
--- /dev/null
+++ b/searx/static/themes/simple/js/searx_head/00_init.js
@@ -0,0 +1,40 @@
+/**
+* searx is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Affero General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* searx is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU Affero General Public License for more details.
+*
+* You should have received a copy of the GNU Affero General Public License
+* along with searx. If not, see < http://www.gnu.org/licenses/ >.
+*
+* (C) 2019 by Alexandre Flament
+*
+*/
+(function(w, d) {
+ 'use strict';
+
+ // add data- properties
+ var script = d.currentScript || (function() {
+ var scripts = d.getElementsByTagName('script');
+ return scripts[scripts.length - 1];
+ })();
+
+ // try to detect touch screen
+ w.searx = {
+ touch: (("ontouchstart" in w) || w.DocumentTouch && document instanceof DocumentTouch) || false,
+ method: script.getAttribute('data-method'),
+ autocompleter: script.getAttribute('data-autocompleter') === 'true',
+ search_on_category_select: script.getAttribute('data-search-on-category-select') === 'true',
+ infinite_scroll: script.getAttribute('data-infinite-scroll') === 'true',
+ static_path: script.getAttribute('data-static-path'),
+ no_item_found: script.getAttribute('data-no-item-found')
+ }
+
+ // update the css
+ d.getElementsByTagName("html")[0].className = (w.searx.touch)?"js touch":"js";
+})(window, document); \ No newline at end of file
diff --git a/searx/static/themes/simple/js/searx_src/00_searx_toolkit.js b/searx/static/themes/simple/js/searx_src/00_searx_toolkit.js
index fb524427d..dbef4be73 100644
--- a/searx/static/themes/simple/js/searx_src/00_searx_toolkit.js
+++ b/searx/static/themes/simple/js/searx_src/00_searx_toolkit.js
@@ -15,7 +15,7 @@
* (C) 2017 by Alexandre Flament, <alex@al-f.net>
*
*/
-(function(w, d, searx) {
+window.searx = (function(w, d) {
'use strict';
@@ -45,7 +45,7 @@
}
}
- searx = searx || {};
+ var searx = window.searx || {};
searx.on = function(obj, eventType, callback, useCapture) {
useCapture = useCapture || false;
@@ -110,7 +110,7 @@
};
searx.loadStyle = function(src) {
- var path = searx.staticPath + src,
+ var path = searx.static_path + src,
id = "style_" + src.replace('.', '_'),
s = d.getElementById(id);
if (s === null) {
@@ -124,7 +124,7 @@
};
searx.loadScript = function(src, callback) {
- var path = searx.staticPath + src,
+ var path = searx.static_path + src,
id = "script_" + src.replace('.', '_'),
s = d.getElementById(id);
if (s === null) {
@@ -161,4 +161,4 @@
});
return searx;
-})(window, document, window.searx);
+})(window, document);
diff --git a/searx/static/themes/simple/js/searx_src/searx_search.js b/searx/static/themes/simple/js/searx_src/searx_search.js
index 964be2194..580d98d6a 100644
--- a/searx/static/themes/simple/js/searx_src/searx_search.js
+++ b/searx/static/themes/simple/js/searx_src/searx_search.js
@@ -73,7 +73,7 @@
if (searx.autocompleter) {
searx.autocomplete = AutoComplete.call(w, {
Url: "./autocompleter",
- EmptyMessage: searx.noItemFound,
+ EmptyMessage: searx.no_item_found,
HttpMethod: searx.method,
MinChars: 4,
Delay: 300,
diff --git a/searx/static/themes/simple/leaflet/leaflet.css b/searx/static/themes/simple/leaflet/leaflet.css
index 230e5bad1..d1b47a125 100644
--- a/searx/static/themes/simple/leaflet/leaflet.css
+++ b/searx/static/themes/simple/leaflet/leaflet.css
@@ -1,636 +1,636 @@
-/* required styles */
-
-.leaflet-pane,
-.leaflet-tile,
-.leaflet-marker-icon,
-.leaflet-marker-shadow,
-.leaflet-tile-container,
-.leaflet-pane > svg,
-.leaflet-pane > canvas,
-.leaflet-zoom-box,
-.leaflet-image-layer,
-.leaflet-layer {
- position: absolute;
- left: 0;
- top: 0;
- }
-.leaflet-container {
- overflow: hidden;
- }
-.leaflet-tile,
-.leaflet-marker-icon,
-.leaflet-marker-shadow {
- -webkit-user-select: none;
- -moz-user-select: none;
- user-select: none;
- -webkit-user-drag: none;
- }
-/* Safari renders non-retina tile on retina better with this, but Chrome is worse */
-.leaflet-safari .leaflet-tile {
- image-rendering: -webkit-optimize-contrast;
- }
-/* hack that prevents hw layers "stretching" when loading new tiles */
-.leaflet-safari .leaflet-tile-container {
- width: 1600px;
- height: 1600px;
- -webkit-transform-origin: 0 0;
- }
-.leaflet-marker-icon,
-.leaflet-marker-shadow {
- display: block;
- }
-/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */
-/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */
-.leaflet-container .leaflet-overlay-pane svg,
-.leaflet-container .leaflet-marker-pane img,
-.leaflet-container .leaflet-shadow-pane img,
-.leaflet-container .leaflet-tile-pane img,
-.leaflet-container img.leaflet-image-layer {
- max-width: none !important;
- max-height: none !important;
- }
-
-.leaflet-container.leaflet-touch-zoom {
- -ms-touch-action: pan-x pan-y;
- touch-action: pan-x pan-y;
- }
-.leaflet-container.leaflet-touch-drag {
- -ms-touch-action: pinch-zoom;
- /* Fallback for FF which doesn't support pinch-zoom */
- touch-action: none;
- touch-action: pinch-zoom;
-}
-.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
- -ms-touch-action: none;
- touch-action: none;
-}
-.leaflet-container {
- -webkit-tap-highlight-color: transparent;
-}
-.leaflet-container a {
- -webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);
-}
-.leaflet-tile {
- filter: inherit;
- visibility: hidden;
- }
-.leaflet-tile-loaded {
- visibility: inherit;
- }
-.leaflet-zoom-box {
- width: 0;
- height: 0;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- z-index: 800;
- }
-/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
-.leaflet-overlay-pane svg {
- -moz-user-select: none;
- }
-
-.leaflet-pane { z-index: 400; }
-
-.leaflet-tile-pane { z-index: 200; }
-.leaflet-overlay-pane { z-index: 400; }
-.leaflet-shadow-pane { z-index: 500; }
-.leaflet-marker-pane { z-index: 600; }
-.leaflet-tooltip-pane { z-index: 650; }
-.leaflet-popup-pane { z-index: 700; }
-
-.leaflet-map-pane canvas { z-index: 100; }
-.leaflet-map-pane svg { z-index: 200; }
-
-.leaflet-vml-shape {
- width: 1px;
- height: 1px;
- }
-.lvml {
- behavior: url(#default#VML);
- display: inline-block;
- position: absolute;
- }
-
-
-/* control positioning */
-
-.leaflet-control {
- position: relative;
- z-index: 800;
- pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
- pointer-events: auto;
- }
-.leaflet-top,
-.leaflet-bottom {
- position: absolute;
- z-index: 1000;
- pointer-events: none;
- }
-.leaflet-top {
- top: 0;
- }
-.leaflet-right {
- right: 0;
- }
-.leaflet-bottom {
- bottom: 0;
- }
-.leaflet-left {
- left: 0;
- }
-.leaflet-control {
- float: left;
- clear: both;
- }
-.leaflet-right .leaflet-control {
- float: right;
- }
-.leaflet-top .leaflet-control {
- margin-top: 10px;
- }
-.leaflet-bottom .leaflet-control {
- margin-bottom: 10px;
- }
-.leaflet-left .leaflet-control {
- margin-left: 10px;
- }
-.leaflet-right .leaflet-control {
- margin-right: 10px;
- }
-
-
-/* zoom and fade animations */
-
-.leaflet-fade-anim .leaflet-tile {
- will-change: opacity;
- }
-.leaflet-fade-anim .leaflet-popup {
- opacity: 0;
- -webkit-transition: opacity 0.2s linear;
- -moz-transition: opacity 0.2s linear;
- -o-transition: opacity 0.2s linear;
- transition: opacity 0.2s linear;
- }
-.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
- opacity: 1;
- }
-.leaflet-zoom-animated {
- -webkit-transform-origin: 0 0;
- -ms-transform-origin: 0 0;
- transform-origin: 0 0;
- }
-.leaflet-zoom-anim .leaflet-zoom-animated {
- will-change: transform;
- }
-.leaflet-zoom-anim .leaflet-zoom-animated {
- -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
- -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
- -o-transition: -o-transform 0.25s cubic-bezier(0,0,0.25,1);
- transition: transform 0.25s cubic-bezier(0,0,0.25,1);
- }
-.leaflet-zoom-anim .leaflet-tile,
-.leaflet-pan-anim .leaflet-tile {
- -webkit-transition: none;
- -moz-transition: none;
- -o-transition: none;
- transition: none;
- }
-
-.leaflet-zoom-anim .leaflet-zoom-hide {
- visibility: hidden;
- }
-
-
-/* cursors */
-
-.leaflet-interactive {
- cursor: pointer;
- }
-.leaflet-grab {
- cursor: -webkit-grab;
- cursor: -moz-grab;
- }
-.leaflet-crosshair,
-.leaflet-crosshair .leaflet-interactive {
- cursor: crosshair;
- }
-.leaflet-popup-pane,
-.leaflet-control {
- cursor: auto;
- }
-.leaflet-dragging .leaflet-grab,
-.leaflet-dragging .leaflet-grab .leaflet-interactive,
-.leaflet-dragging .leaflet-marker-draggable {
- cursor: move;
- cursor: -webkit-grabbing;
- cursor: -moz-grabbing;
- }
-
-/* marker & overlays interactivity */
-.leaflet-marker-icon,
-.leaflet-marker-shadow,
-.leaflet-image-layer,
-.leaflet-pane > svg path,
-.leaflet-tile-container {
- pointer-events: none;
- }
-
-.leaflet-marker-icon.leaflet-interactive,
-.leaflet-image-layer.leaflet-interactive,
-.leaflet-pane > svg path.leaflet-interactive {
- pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
- pointer-events: auto;
- }
-
-/* visual tweaks */
-
-.leaflet-container {
- background: #ddd;
- outline: 0;
- }
-.leaflet-container a {
- color: #0078A8;
- }
-.leaflet-container a.leaflet-active {
- outline: 2px solid orange;
- }
-.leaflet-zoom-box {
- border: 2px dotted #38f;
- background: rgba(255,255,255,0.5);
- }
-
-
-/* general typography */
-.leaflet-container {
- font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif;
- }
-
-
-/* general toolbar styles */
-
-.leaflet-bar {
- box-shadow: 0 1px 5px rgba(0,0,0,0.65);
- border-radius: 4px;
- }
-.leaflet-bar a,
-.leaflet-bar a:hover {
- background-color: #fff;
- border-bottom: 1px solid #ccc;
- width: 26px;
- height: 26px;
- line-height: 26px;
- display: block;
- text-align: center;
- text-decoration: none;
- color: black;
- }
-.leaflet-bar a,
-.leaflet-control-layers-toggle {
- background-position: 50% 50%;
- background-repeat: no-repeat;
- display: block;
- }
-.leaflet-bar a:hover {
- background-color: #f4f4f4;
- }
-.leaflet-bar a:first-child {
- border-top-left-radius: 4px;
- border-top-right-radius: 4px;
- }
-.leaflet-bar a:last-child {
- border-bottom-left-radius: 4px;
- border-bottom-right-radius: 4px;
- border-bottom: none;
- }
-.leaflet-bar a.leaflet-disabled {
- cursor: default;
- background-color: #f4f4f4;
- color: #bbb;
- }
-
-.leaflet-touch .leaflet-bar a {
- width: 30px;
- height: 30px;
- line-height: 30px;
- }
-.leaflet-touch .leaflet-bar a:first-child {
- border-top-left-radius: 2px;
- border-top-right-radius: 2px;
- }
-.leaflet-touch .leaflet-bar a:last-child {
- border-bottom-left-radius: 2px;
- border-bottom-right-radius: 2px;
- }
-
-/* zoom control */
-
-.leaflet-control-zoom-in,
-.leaflet-control-zoom-out {
- font: bold 18px 'Lucida Console', Monaco, monospace;
- text-indent: 1px;
- }
-
-.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out {
- font-size: 22px;
- }
-
-
-/* layers control */
-
-.leaflet-control-layers {
- box-shadow: 0 1px 5px rgba(0,0,0,0.4);
- background: #fff;
- border-radius: 5px;
- }
-.leaflet-control-layers-toggle {
- background-image: url(images/layers.png);
- width: 36px;
- height: 36px;
- }
-.leaflet-retina .leaflet-control-layers-toggle {
- background-image: url(images/layers-2x.png);
- background-size: 26px 26px;
- }
-.leaflet-touch .leaflet-control-layers-toggle {
- width: 44px;
- height: 44px;
- }
-.leaflet-control-layers .leaflet-control-layers-list,
-.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
- display: none;
- }
-.leaflet-control-layers-expanded .leaflet-control-layers-list {
- display: block;
- position: relative;
- }
-.leaflet-control-layers-expanded {
- padding: 6px 10px 6px 6px;
- color: #333;
- background: #fff;
- }
-.leaflet-control-layers-scrollbar {
- overflow-y: scroll;
- overflow-x: hidden;
- padding-right: 5px;
- }
-.leaflet-control-layers-selector {
- margin-top: 2px;
- position: relative;
- top: 1px;
- }
-.leaflet-control-layers label {
- display: block;
- }
-.leaflet-control-layers-separator {
- height: 0;
- border-top: 1px solid #ddd;
- margin: 5px -10px 5px -6px;
- }
-
-/* Default icon URLs */
-.leaflet-default-icon-path {
- background-image: url(images/marker-icon.png);
- }
-
-
-/* attribution and scale controls */
-
-.leaflet-container .leaflet-control-attribution {
- background: #fff;
- background: rgba(255, 255, 255, 0.7);
- margin: 0;
- }
-.leaflet-control-attribution,
-.leaflet-control-scale-line {
- padding: 0 5px;
- color: #333;
- }
-.leaflet-control-attribution a {
- text-decoration: none;
- }
-.leaflet-control-attribution a:hover {
- text-decoration: underline;
- }
-.leaflet-container .leaflet-control-attribution,
-.leaflet-container .leaflet-control-scale {
- font-size: 11px;
- }
-.leaflet-left .leaflet-control-scale {
- margin-left: 5px;
- }
-.leaflet-bottom .leaflet-control-scale {
- margin-bottom: 5px;
- }
-.leaflet-control-scale-line {
- border: 2px solid #777;
- border-top: none;
- line-height: 1.1;
- padding: 2px 5px 1px;
- font-size: 11px;
- white-space: nowrap;
- overflow: hidden;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-
- background: #fff;
- background: rgba(255, 255, 255, 0.5);
- }
-.leaflet-control-scale-line:not(:first-child) {
- border-top: 2px solid #777;
- border-bottom: none;
- margin-top: -2px;
- }
-.leaflet-control-scale-line:not(:first-child):not(:last-child) {
- border-bottom: 2px solid #777;
- }
-
-.leaflet-touch .leaflet-control-attribution,
-.leaflet-touch .leaflet-control-layers,
-.leaflet-touch .leaflet-bar {
- box-shadow: none;
- }
-.leaflet-touch .leaflet-control-layers,
-.leaflet-touch .leaflet-bar {
- border: 2px solid rgba(0,0,0,0.2);
- background-clip: padding-box;
- }
-
-
-/* popup */
-
-.leaflet-popup {
- position: absolute;
- text-align: center;
- margin-bottom: 20px;
- }
-.leaflet-popup-content-wrapper {
- padding: 1px;
- text-align: left;
- border-radius: 12px;
- }
-.leaflet-popup-content {
- margin: 13px 19px;
- line-height: 1.4;
- }
-.leaflet-popup-content p {
- margin: 18px 0;
- }
-.leaflet-popup-tip-container {
- width: 40px;
- height: 20px;
- position: absolute;
- left: 50%;
- margin-left: -20px;
- overflow: hidden;
- pointer-events: none;
- }
-.leaflet-popup-tip {
- width: 17px;
- height: 17px;
- padding: 1px;
-
- margin: -10px auto 0;
-
- -webkit-transform: rotate(45deg);
- -moz-transform: rotate(45deg);
- -ms-transform: rotate(45deg);
- -o-transform: rotate(45deg);
- transform: rotate(45deg);
- }
-.leaflet-popup-content-wrapper,
-.leaflet-popup-tip {
- background: white;
- color: #333;
- box-shadow: 0 3px 14px rgba(0,0,0,0.4);
- }
-.leaflet-container a.leaflet-popup-close-button {
- position: absolute;
- top: 0;
- right: 0;
- padding: 4px 4px 0 0;
- border: none;
- text-align: center;
- width: 18px;
- height: 14px;
- font: 16px/14px Tahoma, Verdana, sans-serif;
- color: #c3c3c3;
- text-decoration: none;
- font-weight: bold;
- background: transparent;
- }
-.leaflet-container a.leaflet-popup-close-button:hover {
- color: #999;
- }
-.leaflet-popup-scrolled {
- overflow: auto;
- border-bottom: 1px solid #ddd;
- border-top: 1px solid #ddd;
- }
-
-.leaflet-oldie .leaflet-popup-content-wrapper {
- zoom: 1;
- }
-.leaflet-oldie .leaflet-popup-tip {
- width: 24px;
- margin: 0 auto;
-
- -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
- filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
- }
-.leaflet-oldie .leaflet-popup-tip-container {
- margin-top: -1px;
- }
-
-.leaflet-oldie .leaflet-control-zoom,
-.leaflet-oldie .leaflet-control-layers,
-.leaflet-oldie .leaflet-popup-content-wrapper,
-.leaflet-oldie .leaflet-popup-tip {
- border: 1px solid #999;
- }
-
-
-/* div icon */
-
-.leaflet-div-icon {
- background: #fff;
- border: 1px solid #666;
- }
-
-
-/* Tooltip */
-/* Base styles for the element that has a tooltip */
-.leaflet-tooltip {
- position: absolute;
- padding: 6px;
- background-color: #fff;
- border: 1px solid #fff;
- border-radius: 3px;
- color: #222;
- white-space: nowrap;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- pointer-events: none;
- box-shadow: 0 1px 3px rgba(0,0,0,0.4);
- }
-.leaflet-tooltip.leaflet-clickable {
- cursor: pointer;
- pointer-events: auto;
- }
-.leaflet-tooltip-top:before,
-.leaflet-tooltip-bottom:before,
-.leaflet-tooltip-left:before,
-.leaflet-tooltip-right:before {
- position: absolute;
- pointer-events: none;
- border: 6px solid transparent;
- background: transparent;
- content: "";
- }
-
-/* Directions */
-
-.leaflet-tooltip-bottom {
- margin-top: 6px;
-}
-.leaflet-tooltip-top {
- margin-top: -6px;
-}
-.leaflet-tooltip-bottom:before,
-.leaflet-tooltip-top:before {
- left: 50%;
- margin-left: -6px;
- }
-.leaflet-tooltip-top:before {
- bottom: 0;
- margin-bottom: -12px;
- border-top-color: #fff;
- }
-.leaflet-tooltip-bottom:before {
- top: 0;
- margin-top: -12px;
- margin-left: -6px;
- border-bottom-color: #fff;
- }
-.leaflet-tooltip-left {
- margin-left: -6px;
-}
-.leaflet-tooltip-right {
- margin-left: 6px;
-}
-.leaflet-tooltip-left:before,
-.leaflet-tooltip-right:before {
- top: 50%;
- margin-top: -6px;
- }
-.leaflet-tooltip-left:before {
- right: 0;
- margin-right: -12px;
- border-left-color: #fff;
- }
-.leaflet-tooltip-right:before {
- left: 0;
- margin-left: -12px;
- border-right-color: #fff;
- }
+/* required styles */
+
+.leaflet-pane,
+.leaflet-tile,
+.leaflet-marker-icon,
+.leaflet-marker-shadow,
+.leaflet-tile-container,
+.leaflet-pane > svg,
+.leaflet-pane > canvas,
+.leaflet-zoom-box,
+.leaflet-image-layer,
+.leaflet-layer {
+ position: absolute;
+ left: 0;
+ top: 0;
+ }
+.leaflet-container {
+ overflow: hidden;
+ }
+.leaflet-tile,
+.leaflet-marker-icon,
+.leaflet-marker-shadow {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+ -webkit-user-drag: none;
+ }
+/* Safari renders non-retina tile on retina better with this, but Chrome is worse */
+.leaflet-safari .leaflet-tile {
+ image-rendering: -webkit-optimize-contrast;
+ }
+/* hack that prevents hw layers "stretching" when loading new tiles */
+.leaflet-safari .leaflet-tile-container {
+ width: 1600px;
+ height: 1600px;
+ -webkit-transform-origin: 0 0;
+ }
+.leaflet-marker-icon,
+.leaflet-marker-shadow {
+ display: block;
+ }
+/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */
+/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */
+.leaflet-container .leaflet-overlay-pane svg,
+.leaflet-container .leaflet-marker-pane img,
+.leaflet-container .leaflet-shadow-pane img,
+.leaflet-container .leaflet-tile-pane img,
+.leaflet-container img.leaflet-image-layer {
+ max-width: none !important;
+ max-height: none !important;
+ }
+
+.leaflet-container.leaflet-touch-zoom {
+ -ms-touch-action: pan-x pan-y;
+ touch-action: pan-x pan-y;
+ }
+.leaflet-container.leaflet-touch-drag {
+ -ms-touch-action: pinch-zoom;
+ /* Fallback for FF which doesn't support pinch-zoom */
+ touch-action: none;
+ touch-action: pinch-zoom;
+}
+.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
+ -ms-touch-action: none;
+ touch-action: none;
+}
+.leaflet-container {
+ -webkit-tap-highlight-color: transparent;
+}
+.leaflet-container a {
+ -webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);
+}
+.leaflet-tile {
+ filter: inherit;
+ visibility: hidden;
+ }
+.leaflet-tile-loaded {
+ visibility: inherit;
+ }
+.leaflet-zoom-box {
+ width: 0;
+ height: 0;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ z-index: 800;
+ }
+/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
+.leaflet-overlay-pane svg {
+ -moz-user-select: none;
+ }
+
+.leaflet-pane { z-index: 400; }
+
+.leaflet-tile-pane { z-index: 200; }
+.leaflet-overlay-pane { z-index: 400; }
+.leaflet-shadow-pane { z-index: 500; }
+.leaflet-marker-pane { z-index: 600; }
+.leaflet-tooltip-pane { z-index: 650; }
+.leaflet-popup-pane { z-index: 700; }
+
+.leaflet-map-pane canvas { z-index: 100; }
+.leaflet-map-pane svg { z-index: 200; }
+
+.leaflet-vml-shape {
+ width: 1px;
+ height: 1px;
+ }
+.lvml {
+ behavior: url(#default#VML);
+ display: inline-block;
+ position: absolute;
+ }
+
+
+/* control positioning */
+
+.leaflet-control {
+ position: relative;
+ z-index: 800;
+ pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
+ pointer-events: auto;
+ }
+.leaflet-top,
+.leaflet-bottom {
+ position: absolute;
+ z-index: 1000;
+ pointer-events: none;
+ }
+.leaflet-top {
+ top: 0;
+ }
+.leaflet-right {
+ right: 0;
+ }
+.leaflet-bottom {
+ bottom: 0;
+ }
+.leaflet-left {
+ left: 0;
+ }
+.leaflet-control {
+ float: left;
+ clear: both;
+ }
+.leaflet-right .leaflet-control {
+ float: right;
+ }
+.leaflet-top .leaflet-control {
+ margin-top: 10px;
+ }
+.leaflet-bottom .leaflet-control {
+ margin-bottom: 10px;
+ }
+.leaflet-left .leaflet-control {
+ margin-left: 10px;
+ }
+.leaflet-right .leaflet-control {
+ margin-right: 10px;
+ }
+
+
+/* zoom and fade animations */
+
+.leaflet-fade-anim .leaflet-tile {
+ will-change: opacity;
+ }
+.leaflet-fade-anim .leaflet-popup {
+ opacity: 0;
+ -webkit-transition: opacity 0.2s linear;
+ -moz-transition: opacity 0.2s linear;
+ -o-transition: opacity 0.2s linear;
+ transition: opacity 0.2s linear;
+ }
+.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
+ opacity: 1;
+ }
+.leaflet-zoom-animated {
+ -webkit-transform-origin: 0 0;
+ -ms-transform-origin: 0 0;
+ transform-origin: 0 0;
+ }
+.leaflet-zoom-anim .leaflet-zoom-animated {
+ will-change: transform;
+ }
+.leaflet-zoom-anim .leaflet-zoom-animated {
+ -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
+ -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
+ -o-transition: -o-transform 0.25s cubic-bezier(0,0,0.25,1);
+ transition: transform 0.25s cubic-bezier(0,0,0.25,1);
+ }
+.leaflet-zoom-anim .leaflet-tile,
+.leaflet-pan-anim .leaflet-tile {
+ -webkit-transition: none;
+ -moz-transition: none;
+ -o-transition: none;
+ transition: none;
+ }
+
+.leaflet-zoom-anim .leaflet-zoom-hide {
+ visibility: hidden;
+ }
+
+
+/* cursors */
+
+.leaflet-interactive {
+ cursor: pointer;
+ }
+.leaflet-grab {
+ cursor: -webkit-grab;
+ cursor: -moz-grab;
+ }
+.leaflet-crosshair,
+.leaflet-crosshair .leaflet-interactive {
+ cursor: crosshair;
+ }
+.leaflet-popup-pane,
+.leaflet-control {
+ cursor: auto;
+ }
+.leaflet-dragging .leaflet-grab,
+.leaflet-dragging .leaflet-grab .leaflet-interactive,
+.leaflet-dragging .leaflet-marker-draggable {
+ cursor: move;
+ cursor: -webkit-grabbing;
+ cursor: -moz-grabbing;
+ }
+
+/* marker & overlays interactivity */
+.leaflet-marker-icon,
+.leaflet-marker-shadow,
+.leaflet-image-layer,
+.leaflet-pane > svg path,
+.leaflet-tile-container {
+ pointer-events: none;
+ }
+
+.leaflet-marker-icon.leaflet-interactive,
+.leaflet-image-layer.leaflet-interactive,
+.leaflet-pane > svg path.leaflet-interactive {
+ pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
+ pointer-events: auto;
+ }
+
+/* visual tweaks */
+
+.leaflet-container {
+ background: #ddd;
+ outline: 0;
+ }
+.leaflet-container a {
+ color: #0078A8;
+ }
+.leaflet-container a.leaflet-active {
+ outline: 2px solid orange;
+ }
+.leaflet-zoom-box {
+ border: 2px dotted #38f;
+ background: rgba(255,255,255,0.5);
+ }
+
+
+/* general typography */
+.leaflet-container {
+ font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif;
+ }
+
+
+/* general toolbar styles */
+
+.leaflet-bar {
+ box-shadow: 0 1px 5px rgba(0,0,0,0.65);
+ border-radius: 4px;
+ }
+.leaflet-bar a,
+.leaflet-bar a:hover {
+ background-color: #fff;
+ border-bottom: 1px solid #ccc;
+ width: 26px;
+ height: 26px;
+ line-height: 26px;
+ display: block;
+ text-align: center;
+ text-decoration: none;
+ color: black;
+ }
+.leaflet-bar a,
+.leaflet-control-layers-toggle {
+ background-position: 50% 50%;
+ background-repeat: no-repeat;
+ display: block;
+ }
+.leaflet-bar a:hover {
+ background-color: #f4f4f4;
+ }
+.leaflet-bar a:first-child {
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ }
+.leaflet-bar a:last-child {
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ border-bottom: none;
+ }
+.leaflet-bar a.leaflet-disabled {
+ cursor: default;
+ background-color: #f4f4f4;
+ color: #bbb;
+ }
+
+.leaflet-touch .leaflet-bar a {
+ width: 30px;
+ height: 30px;
+ line-height: 30px;
+ }
+.leaflet-touch .leaflet-bar a:first-child {
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px;
+ }
+.leaflet-touch .leaflet-bar a:last-child {
+ border-bottom-left-radius: 2px;
+ border-bottom-right-radius: 2px;
+ }
+
+/* zoom control */
+
+.leaflet-control-zoom-in,
+.leaflet-control-zoom-out {
+ font: bold 18px 'Lucida Console', Monaco, monospace;
+ text-indent: 1px;
+ }
+
+.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out {
+ font-size: 22px;
+ }
+
+
+/* layers control */
+
+.leaflet-control-layers {
+ box-shadow: 0 1px 5px rgba(0,0,0,0.4);
+ background: #fff;
+ border-radius: 5px;
+ }
+.leaflet-control-layers-toggle {
+ background-image: url(images/layers.png);
+ width: 36px;
+ height: 36px;
+ }
+.leaflet-retina .leaflet-control-layers-toggle {
+ background-image: url(images/layers-2x.png);
+ background-size: 26px 26px;
+ }
+.leaflet-touch .leaflet-control-layers-toggle {
+ width: 44px;
+ height: 44px;
+ }
+.leaflet-control-layers .leaflet-control-layers-list,
+.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
+ display: none;
+ }
+.leaflet-control-layers-expanded .leaflet-control-layers-list {
+ display: block;
+ position: relative;
+ }
+.leaflet-control-layers-expanded {
+ padding: 6px 10px 6px 6px;
+ color: #333;
+ background: #fff;
+ }
+.leaflet-control-layers-scrollbar {
+ overflow-y: scroll;
+ overflow-x: hidden;
+ padding-right: 5px;
+ }
+.leaflet-control-layers-selector {
+ margin-top: 2px;
+ position: relative;
+ top: 1px;
+ }
+.leaflet-control-layers label {
+ display: block;
+ }
+.leaflet-control-layers-separator {
+ height: 0;
+ border-top: 1px solid #ddd;
+ margin: 5px -10px 5px -6px;
+ }
+
+/* Default icon URLs */
+.leaflet-default-icon-path {
+ background-image: url(images/marker-icon.png);
+ }
+
+
+/* attribution and scale controls */
+
+.leaflet-container .leaflet-control-attribution {
+ background: #fff;
+ background: rgba(255, 255, 255, 0.7);
+ margin: 0;
+ }
+.leaflet-control-attribution,
+.leaflet-control-scale-line {
+ padding: 0 5px;
+ color: #333;
+ }
+.leaflet-control-attribution a {
+ text-decoration: none;
+ }
+.leaflet-control-attribution a:hover {
+ text-decoration: underline;
+ }
+.leaflet-container .leaflet-control-attribution,
+.leaflet-container .leaflet-control-scale {
+ font-size: 11px;
+ }
+.leaflet-left .leaflet-control-scale {
+ margin-left: 5px;
+ }
+.leaflet-bottom .leaflet-control-scale {
+ margin-bottom: 5px;
+ }
+.leaflet-control-scale-line {
+ border: 2px solid #777;
+ border-top: none;
+ line-height: 1.1;
+ padding: 2px 5px 1px;
+ font-size: 11px;
+ white-space: nowrap;
+ overflow: hidden;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+
+ background: #fff;
+ background: rgba(255, 255, 255, 0.5);
+ }
+.leaflet-control-scale-line:not(:first-child) {
+ border-top: 2px solid #777;
+ border-bottom: none;
+ margin-top: -2px;
+ }
+.leaflet-control-scale-line:not(:first-child):not(:last-child) {
+ border-bottom: 2px solid #777;
+ }
+
+.leaflet-touch .leaflet-control-attribution,
+.leaflet-touch .leaflet-control-layers,
+.leaflet-touch .leaflet-bar {
+ box-shadow: none;
+ }
+.leaflet-touch .leaflet-control-layers,
+.leaflet-touch .leaflet-bar {
+ border: 2px solid rgba(0,0,0,0.2);
+ background-clip: padding-box;
+ }
+
+
+/* popup */
+
+.leaflet-popup {
+ position: absolute;
+ text-align: center;
+ margin-bottom: 20px;
+ }
+.leaflet-popup-content-wrapper {
+ padding: 1px;
+ text-align: left;
+ border-radius: 12px;
+ }
+.leaflet-popup-content {
+ margin: 13px 19px;
+ line-height: 1.4;
+ }
+.leaflet-popup-content p {
+ margin: 18px 0;
+ }
+.leaflet-popup-tip-container {
+ width: 40px;
+ height: 20px;
+ position: absolute;
+ left: 50%;
+ margin-left: -20px;
+ overflow: hidden;
+ pointer-events: none;
+ }
+.leaflet-popup-tip {
+ width: 17px;
+ height: 17px;
+ padding: 1px;
+
+ margin: -10px auto 0;
+
+ -webkit-transform: rotate(45deg);
+ -moz-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ -o-transform: rotate(45deg);
+ transform: rotate(45deg);
+ }
+.leaflet-popup-content-wrapper,
+.leaflet-popup-tip {
+ background: white;
+ color: #333;
+ box-shadow: 0 3px 14px rgba(0,0,0,0.4);
+ }
+.leaflet-container a.leaflet-popup-close-button {
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding: 4px 4px 0 0;
+ border: none;
+ text-align: center;
+ width: 18px;
+ height: 14px;
+ font: 16px/14px Tahoma, Verdana, sans-serif;
+ color: #c3c3c3;
+ text-decoration: none;
+ font-weight: bold;
+ background: transparent;
+ }
+.leaflet-container a.leaflet-popup-close-button:hover {
+ color: #999;
+ }
+.leaflet-popup-scrolled {
+ overflow: auto;
+ border-bottom: 1px solid #ddd;
+ border-top: 1px solid #ddd;
+ }
+
+.leaflet-oldie .leaflet-popup-content-wrapper {
+ zoom: 1;
+ }
+.leaflet-oldie .leaflet-popup-tip {
+ width: 24px;
+ margin: 0 auto;
+
+ -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
+ filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
+ }
+.leaflet-oldie .leaflet-popup-tip-container {
+ margin-top: -1px;
+ }
+
+.leaflet-oldie .leaflet-control-zoom,
+.leaflet-oldie .leaflet-control-layers,
+.leaflet-oldie .leaflet-popup-content-wrapper,
+.leaflet-oldie .leaflet-popup-tip {
+ border: 1px solid #999;
+ }
+
+
+/* div icon */
+
+.leaflet-div-icon {
+ background: #fff;
+ border: 1px solid #666;
+ }
+
+
+/* Tooltip */
+/* Base styles for the element that has a tooltip */
+.leaflet-tooltip {
+ position: absolute;
+ padding: 6px;
+ background-color: #fff;
+ border: 1px solid #fff;
+ border-radius: 3px;
+ color: #222;
+ white-space: nowrap;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ pointer-events: none;
+ box-shadow: 0 1px 3px rgba(0,0,0,0.4);
+ }
+.leaflet-tooltip.leaflet-clickable {
+ cursor: pointer;
+ pointer-events: auto;
+ }
+.leaflet-tooltip-top:before,
+.leaflet-tooltip-bottom:before,
+.leaflet-tooltip-left:before,
+.leaflet-tooltip-right:before {
+ position: absolute;
+ pointer-events: none;
+ border: 6px solid transparent;
+ background: transparent;
+ content: "";
+ }
+
+/* Directions */
+
+.leaflet-tooltip-bottom {
+ margin-top: 6px;
+}
+.leaflet-tooltip-top {
+ margin-top: -6px;
+}
+.leaflet-tooltip-bottom:before,
+.leaflet-tooltip-top:before {
+ left: 50%;
+ margin-left: -6px;
+ }
+.leaflet-tooltip-top:before {
+ bottom: 0;
+ margin-bottom: -12px;
+ border-top-color: #fff;
+ }
+.leaflet-tooltip-bottom:before {
+ top: 0;
+ margin-top: -12px;
+ margin-left: -6px;
+ border-bottom-color: #fff;
+ }
+.leaflet-tooltip-left {
+ margin-left: -6px;
+}
+.leaflet-tooltip-right {
+ margin-left: 6px;
+}
+.leaflet-tooltip-left:before,
+.leaflet-tooltip-right:before {
+ top: 50%;
+ margin-top: -6px;
+ }
+.leaflet-tooltip-left:before {
+ right: 0;
+ margin-right: -12px;
+ border-left-color: #fff;
+ }
+.leaflet-tooltip-right:before {
+ left: 0;
+ margin-left: -12px;
+ border-right-color: #fff;
+ }
diff --git a/searx/templates/courgette/result_templates/key-value.html b/searx/templates/courgette/result_templates/key-value.html
new file mode 100644
index 000000000..789e8de92
--- /dev/null
+++ b/searx/templates/courgette/result_templates/key-value.html
@@ -0,0 +1,13 @@
+<div class="result">
+<table>
+ {% for key, value in result.items() %}
+ {% if key in ['engine', 'engines', 'template', 'score', 'category', 'positions'] %}
+ {% continue %}
+ {% endif %}
+ <tr>
+ <td><b>{{ key|upper }}</b>: {{ value|safe }}</td>
+ </tr>
+ {% endfor %}
+</table>
+<p class="engines">{{ result.engines|join(', ') }}</p>
+</div>
diff --git a/searx/templates/courgette/result_templates/torrent.html b/searx/templates/courgette/result_templates/torrent.html
index 2fd8395ad..7f94a221e 100644
--- a/searx/templates/courgette/result_templates/torrent.html
+++ b/searx/templates/courgette/result_templates/torrent.html
@@ -4,7 +4,7 @@
{% endif %}
<h3 class="result_title"><a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.title|safe }}</a></h3>
{% if result.content %}<span class="content">{{ result.content|safe }}</span><br />{% endif %}
- <span class="stats">{{ _('Seeder') }} : {{ result.seed }}, {{ _('Leecher') }} : {{ result.leech }}</span><br />
+ {% if result.seed is defined %}<span class="stats">{{ _('Seeder') }} : {{ result.seed }}, {{ _('Leecher') }} : {{ result.leech }}</span><br />{% endif %}
<span>
{% if result.magnetlink %}<a href="{{ result.magnetlink }}" class="magnetlink">{{ _('magnet link') }}</a>{% endif %}
{% if result.torrentfile %}<a href="{{ result.torrentfile }}" class="torrentfile" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ _('torrent file') }}</a>{% endif %}
diff --git a/searx/templates/courgette/results.html b/searx/templates/courgette/results.html
index c72b7c3f7..aa983e666 100644
--- a/searx/templates/courgette/results.html
+++ b/searx/templates/courgette/results.html
@@ -42,8 +42,8 @@
<div id="suggestions"><span>{{ _('Suggestions') }}</span>
{% for suggestion in suggestions %}
<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}">
- <input type="hidden" name="q" value="{{ suggestion }}">
- <input type="submit" value="{{ suggestion }}" />
+ <input type="hidden" name="q" value="{{ suggestion.url }}">
+ <input type="submit" value="{{ suggestion.title }}" />
</form>
{% endfor %}
</div>
diff --git a/searx/templates/legacy/result_templates/key-value.html b/searx/templates/legacy/result_templates/key-value.html
new file mode 100644
index 000000000..a5bb509d9
--- /dev/null
+++ b/searx/templates/legacy/result_templates/key-value.html
@@ -0,0 +1,13 @@
+<table class="result-table">
+ {% for key, value in result.items() %}
+ {% if key in ['engine', 'engines', 'template', 'score', 'category', 'positions'] %}
+ {% continue %}
+ {% endif %}
+ <tr>
+ <td><b>{{ key|upper }}</b>: {{ value|safe }}</td>
+ </tr>
+ {% endfor %}
+ <tr>
+ <td><b>ENGINES</b>: {{ result.engines|join(', ') }}</td>
+ </tr>
+</table>
diff --git a/searx/templates/legacy/result_templates/torrent.html b/searx/templates/legacy/result_templates/torrent.html
index 67e058ae5..068e05373 100644
--- a/searx/templates/legacy/result_templates/torrent.html
+++ b/searx/templates/legacy/result_templates/torrent.html
@@ -8,6 +8,6 @@
<p>
{% if result.magnetlink %}<a href="{{ result.magnetlink }}" class="magnetlink">{{ _('magnet link') }}</a>{% endif %}
{% if result.torrentfile %}<a href="{{ result.torrentfile }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} class="torrentfile">{{ _('torrent file') }}</a>{% endif %} -
- <span class="stats">{{ _('Seeder') }} : {{ result.seed }}, {{ _('Leecher') }} : {{ result.leech }}</span>
+ {% if result.seed is defined %}<span class="stats">{{ _('Seeder') }} : {{ result.seed }}, {{ _('Leecher') }} : {{ result.leech }}</span>{% endif %}
</p>
</div>
diff --git a/searx/templates/legacy/results.html b/searx/templates/legacy/results.html
index f0d78398d..2e28bc91f 100644
--- a/searx/templates/legacy/results.html
+++ b/searx/templates/legacy/results.html
@@ -44,8 +44,8 @@
{% set first = true %}
{% for suggestion in suggestions %}
{% if not first %} &bull; {% endif %}<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}">
- <input type="hidden" name="q" value="{{ suggestion }}">
- <input type="submit" class="suggestion" value="{{ suggestion }}" />
+ <input type="hidden" name="q" value="{{ suggestion.url }}">
+ <input type="submit" class="suggestion" value="{{ suggestion.title }}" />
</form>
{% set first = false %}
{% endfor %}
diff --git a/searx/templates/oscar/advanced.html b/searx/templates/oscar/advanced.html
index 95d99ba6a..bf5f86324 100644
--- a/searx/templates/oscar/advanced.html
+++ b/searx/templates/oscar/advanced.html
@@ -1,16 +1,17 @@
<input type="checkbox" name="advanced_search" id="check-advanced" {% if advanced_search %} checked="checked"{% endif %}>
-<label for="check-advanced">
+<label for="check-advanced">{{- "" -}}
<span class="glyphicon glyphicon-cog"></span>
- {{ _('Advanced settings') }}
+ {{- _('Advanced settings') -}}
</label>
<div id="advanced-search-container">
{% include 'oscar/categories.html' %}
+
<div class="row">
<div class="col-xs-6">
- {% include 'oscar/time-range.html' %}
+ {%- include 'oscar/time-range.html' -%}
</div>
<div class="col-xs-6">
- {% include 'oscar/languages.html' %}
+ {%- include 'oscar/languages.html' -%}
</div>
</div>
</div>
diff --git a/searx/templates/oscar/base.html b/searx/templates/oscar/base.html
index 243e8b3d7..66a9e6029 100644
--- a/searx/templates/oscar/base.html
+++ b/searx/templates/oscar/base.html
@@ -10,16 +10,17 @@
<meta name="referrer" content="no-referrer">
<meta name="viewport" content="width=device-width, initial-scale=1 , maximum-scale=1.0, user-scalable=1" />
{% block meta %}{% endblock %}
- <title>{% block title %}{% endblock %}{{ instance_name }}</title>
+ <title>{% block title %}{% endblock %}{{ instance_name }}</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap.min.css') }}" type="text/css" />
- {% if preferences.get_value('oscar-style') %}
- <link rel="stylesheet" href="{{ url_for('static', filename='css/'+preferences.get_value('oscar-style')+'.min.css') }}" type="text/css" />
- {% else %}
- <link rel="stylesheet" href="{{ url_for('static', filename='css/logicodev.min.css') }}" type="text/css" />
- {% endif %}
+ {% if preferences.get_value('oscar-style') -%}
+ {{' '}}<link rel="stylesheet" href="{{ url_for('static', filename='css/'+preferences.get_value('oscar-style')+'.min.css') }}" type="text/css" />
+ {%- else -%}
+ {{' '}}<link rel="stylesheet" href="{{ url_for('static', filename='css/logicodev.min.css') }}" type="text/css" />
+ {%- endif %}
+
<link rel="stylesheet" href="{{ url_for('static', filename='css/leaflet.min.css') }}" type="text/css" />
- {% for css in styles %}
+ {%- for css in styles %}
<link rel="stylesheet" href="{{ url_for('static', filename=css) }}" type="text/css" />
{% endfor %}
@@ -37,12 +38,6 @@
{% endblock %}
<link title="{{ instance_name }}" type="application/opensearchdescription+xml" rel="search" href="{{ url_for('opensearch') }}"/>
-
- <script type="text/javascript">
- searx = {};
- searx.method = "{{ method or 'POST' }}";
- searx.autocompleter = {% if autocomplete %}true{% else %}false{% endif %};
- </script>
<noscript>
<style type="text/css">
.tab-content > .active_if_nojs, .active_if_nojs {display: block !important; visibility: visible !important;}
@@ -54,6 +49,7 @@
</head>
<body>
{% include 'oscar/navbar.html' %}
+
<div class="container">
{% if errors %}
<div class="alert alert-danger fade in" role="alert">
@@ -99,11 +95,14 @@
</div>
<script src="{{ url_for('static', filename='js/jquery-1.11.1.min.js') }}"></script>
<script src="{{ url_for('static', filename='js/bootstrap.min.js') }}"></script>
- {% if autocomplete %}<script src="{{ url_for('static', filename='js/typeahead.bundle.min.js') }}"></script>{% endif %}
+ {% if autocomplete %} <script src="{{ url_for('static', filename='js/typeahead.bundle.min.js') }}"></script>{% endif %}
+
<script src="{{ url_for('static', filename='js/require-2.1.15.min.js') }}"></script>
- <script src="{{ url_for('static', filename='js/searx.min.js') }}"></script>
+ <script src="{{ url_for('static', filename='js/searx.min.js') }}"
+ data-method="{{ method or 'POST' }}"
+ data-autocompleter="{% if autocomplete %}true{% else %}false{% endif %}"></script>
{% for script in scripts %}
- <script src="{{ url_for('static', filename=script) }}"></script>
+ {{""}}<script src="{{ url_for('static', filename=script) }}"></script>
{% endfor %}
<noscript>
<style>
diff --git a/searx/templates/oscar/categories.html b/searx/templates/oscar/categories.html
index 1ace10f16..a5c5f61c7 100644
--- a/searx/templates/oscar/categories.html
+++ b/searx/templates/oscar/categories.html
@@ -1,13 +1,13 @@
<div id="categories">
-{% if rtl %}
- {% for category in categories | reverse %}
- <input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} />
+{%- if rtl -%}
+ {% for category in categories | reverse -%}
+ <input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} />{{- '' -}}
<label for="checkbox_{{ category|replace(' ', '_') }}">{{ _(category) }}</label>
- {% endfor %}
-{% else %}
- {% for category in categories %}
- <input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} />
+ {%- endfor %}
+{%- else -%}
+ {% for category in categories -%}
+ <input class="hidden" type="checkbox" id="checkbox_{{ category|replace(' ', '_') }}" name="category_{{ category }}" {% if category in selected_categories %}checked="checked"{% endif %} />{{- '' -}}
<label for="checkbox_{{ category|replace(' ', '_') }}">{{ _(category) }}</label>
- {% endfor %}
-{% endif %}
+ {%- endfor %}
+{%- endif -%}
</div>
diff --git a/searx/templates/oscar/infobox.html b/searx/templates/oscar/infobox.html
index c98fb0e63..9802f11e2 100644
--- a/searx/templates/oscar/infobox.html
+++ b/searx/templates/oscar/infobox.html
@@ -1,34 +1,35 @@
{% from 'oscar/macros.html' import result_link with context %}
<div class="panel panel-default infobox">
- <div class="panel-heading">
- <h4 class="panel-title infobox_part"><bdi>{{ infobox.infobox }}</bdi></h4>
+ <div class="panel-heading">{{- "" -}}
+ <h4 class="panel-title infobox_part"><bdi>{{ infobox.infobox }}</bdi></h4>{{- "" -}}
</div>
<div class="panel-body">
{% if infobox.img_src %}<img class="img-responsive center-block infobox_part" src="{{ image_proxify(infobox.img_src) }}" alt="{{ infobox.infobox }}" />{% endif %}
- {% if infobox.content %}<bdi><p class="infobox_part">{{ infobox.content }}</bdi></p>{% endif %}
- {% if infobox.attributes %}
+ {% if infobox.content %}<bdi><p class="infobox_part">{{ infobox.content | safe }}</p></bdi>{% endif %}
+
+ {% if infobox.attributes -%}
<table class="table table-striped infobox_part">
- {% for attribute in infobox.attributes %}
- <tr>
+ {% for attribute in infobox.attributes -%}
+ <tr>{{- "" -}}
<td><bdi>{{ attribute.label }}</bdi></td>
- {% if attribute.image %}
+ {%- if attribute.image -%}
<td><img class="img-responsive" src="{{ image_proxify(attribute.image.src) }}" alt="{{ attribute.image.alt }}" /></td>
- {% else %}
+ {%- else -%}
<td><bdi>{{ attribute.value }}</bdi></td>
- {% endif %}
+ {%- endif -%}
</tr>
- {% endfor %}
+ {% endfor -%}
</table>
{% endif %}
- {% if infobox.urls %}
- <div class="infobox_part">
+ {% if infobox.urls -%}
+ <div class="infobox_part">{{- "\n" -}}
<bdi>
- {% for url in infobox.urls %}
- <p class="btn btn-default btn-xs">{{ result_link(url.url, url.title) }}</a></p>
- {% endfor %}
- </bdi>
+ {%- for url in infobox.urls -%}
+ <p class="btn btn-default btn-xs">{{ result_link(url.url, url.title) }}</p>
+ {% endfor -%}
+ </bdi>{{- "" -}}
</div>
{% endif %}
</div>
diff --git a/searx/templates/oscar/languages.html b/searx/templates/oscar/languages.html
index 53ade43b2..5aff9f918 100644
--- a/searx/templates/oscar/languages.html
+++ b/searx/templates/oscar/languages.html
@@ -1,12 +1,8 @@
-{% if preferences %}
-<select class="custom-select form-control" name='language'>
-{% else %}
-<select class="time_range custom-select form-control" id='language' name='language'>
-{% endif %}
- <option value="all" {% if current_language == 'all' %}selected="selected"{% endif %}>{{ _('Default language') }}</option>
- {% for lang_id,lang_name,country_name,english_name in language_codes | sort(attribute=1) %}
- <option value="{{ lang_id }}" {% if lang_id == current_language %}selected="selected"{% endif %}>
- {{ lang_name }} {% if country_name %}({{ country_name }}) {% endif %}- {{ lang_id }}
- </option>
- {% endfor %}
+<select class="language custom-select form-control" id="language" name="language" accesskey="l">
+ <option value="all" {% if current_language == 'all' %}selected="selected"{% endif %}>{{ _('Default language') }}</option>
+{%- for lang_id,lang_name,country_name,english_name in language_codes | sort(attribute=1) -%}
+ <option value="{{ lang_id }}" {% if lang_id == current_language %}selected="selected"{% endif %}>
+ {{- lang_name }} {% if country_name %}({{ country_name }}) {% endif %}- {{ lang_id -}}
+ </option>
+{%- endfor -%}
</select>
diff --git a/searx/templates/oscar/macros.html b/searx/templates/oscar/macros.html
index 0ff957521..d2d1dc643 100644
--- a/searx/templates/oscar/macros.html
+++ b/searx/templates/oscar/macros.html
@@ -14,7 +14,7 @@
<!-- Draw result header -->
{% macro result_header(result, favicons) -%}
-<h4 class="result_header">{% if result.engine~".png" in favicons %}{{ draw_favicon(result.engine) }} {% endif %}{{ result_link(result.url, result.title|safe) }}</h4>
+<h4 class="result_header">{% if result.engine~".png" in favicons %}{{ draw_favicon(result.engine) }} {% endif %}{% if result.url %}{{ result_link(result.url, result.title|safe) }}{% else %}{{ result.title|safe}}{% endif %}</h4>
{%- endmacro %}
<!-- Draw result sub header -->
@@ -26,30 +26,38 @@
<!-- Draw result footer -->
{% macro result_footer(result) -%}
- <div class="clearfix"></div>
+ <div class="clearfix"></div>{{- "" -}}
<div class="pull-right">
- {% for engine in result.engines %}
- <span class="label label-default">{{ engine }}</span>
- {% endfor %}
- <small>{{ result_link("https://web.archive.org/web/" + result.url, icon('link') + _('cached'), "text-info") }}</small>
- {% if proxify %}
- <small>{{ result_link(proxify(result.url), icon('sort') + _('proxied'), "text-info") }}</small>
- {% endif %}
-</div>
-<div class="external-link">{{ result.pretty_url }}</div>
+ {%- for engine in result.engines -%}
+ <span class="label label-default">{{ engine }}</span>
+ {%- endfor -%}
+ {%- if result.url -%}
+ <small>{{ result_link("https://web.archive.org/web/" + result.url, icon('link') + _('cached'), "text-info") }}</small>
+ {%- endif -%}
+ {%- if proxify -%}
+ <small>{{ result_link(proxify(result.url), icon('sort') + _('proxied'), "text-info") }}</small>
+ {%- endif -%}
+ </div>
+ {%- if result.pretty_url -%}
+ <div class="external-link">{{ result.pretty_url }}</div>
+ {%- endif -%}
{%- endmacro %}
<!-- Draw result footer -->
{% macro result_footer_rtl(result) -%}
- <div class="clearfix"></div>
- {% for engine in result.engines %}
+ <div class="clearfix"></div>{{- "" -}}
+ {% for engine in result.engines -%}
<span class="label label-default">{{ engine }}</span>
- {% endfor %}
+ {%- endfor %}
+ {%- if result.url -%}
<small>{{ result_link("https://web.archive.org/web/" + result.url, icon('link') + _('cached'), "text-info") }}</small>
- {% if proxify %}
+ {%- endif -%}
+ {% if proxify -%}
<small>{{ result_link(proxify(result.url), icon('sort') + _('proxied'), "text-info") }}</small>
- {% endif %}
+ {%- endif %}
+ {%- if result.pretty_url -%}
<div class="external-link">{{ result.pretty_url }}</div>
+ {%- endif %}
{%- endmacro %}
{% macro preferences_item_header(info, label, rtl) -%}
diff --git a/searx/templates/oscar/navbar.html b/searx/templates/oscar/navbar.html
index 12bf14ffa..077fb9f15 100644
--- a/searx/templates/oscar/navbar.html
+++ b/searx/templates/oscar/navbar.html
@@ -1,9 +1,9 @@
-<div class="searx-navbar">
- <span class="instance {% if rtl %}pull-right{% else %}pull-left{% endif%}">
- <a href="{{ url_for('index') }}">{{ instance_name }}</a>
- </span>
- <span class="{% if rtl %}pull-left{% else %}pull-right{% endif %}">
- <a href="{{ url_for('about') }}">{{ _('about') }}</a>
- <a href="{{ url_for('preferences') }}">{{ _('preferences') }}</a>
- </span>
+<div class="searx-navbar">{{- "" -}}
+ <span class="instance {% if rtl %}pull-right{% else %}pull-left{% endif%}">{{- "" -}}
+ <a href="{{ url_for('index') }}">{{ instance_name }}</a>{{- "" -}}
+ </span>{{- "" -}}
+ <span class="{% if rtl %}pull-left{% else %}pull-right{% endif %}">{{- "" -}}
+ <a href="{{ url_for('about') }}">{{ _('about') }}</a>{{- "" -}}
+ <a href="{{ url_for('preferences') }}">{{ _('preferences') }}</a>{{- "" -}}
+ </span>{{- "" -}}
</div>
diff --git a/searx/templates/oscar/preferences.html b/searx/templates/oscar/preferences.html
index b64d72ddf..b03929df3 100644
--- a/searx/templates/oscar/preferences.html
+++ b/searx/templates/oscar/preferences.html
@@ -41,7 +41,7 @@
{% set language_label = _('Search language') %}
{% set language_info = _('What language do you prefer for search?') %}
{{ preferences_item_header(language_info, language_label, rtl) }}
- {% include 'oscar/languages.html' %}
+ {% include 'oscar/languages.html' %}
{{ preferences_item_footer(language_info, language_label, rtl) }}
{% set locale_label = _('Interface language') %}
@@ -131,6 +131,12 @@
{% endfor %}
</select>
{{ preferences_item_footer(info, label, rtl) }}
+
+ {% set label = _('Engine tokens') %}
+ {% set info = _('Access tokens for private engines') %}
+ {{ preferences_item_header(info, label, rtl) }}
+ <input class="form-control" id='tokens' name='tokens' value='{{ preferences.tokens.get_value() }}'/>
+ {{ preferences_item_footer(info, label, rtl) }}
</div>
</fieldset>
</div>
@@ -156,26 +162,26 @@
<div class="container-fluid">
<fieldset>
<div class="table-responsive">
- <table class="table table-hover table-condensed table-striped">
- <tr>
+ <table class="table table-hover table-condensed table-striped">
+ <tr>
{% if not rtl %}
- <th>{{ _("Allow") }}</th>
- <th>{{ _("Engine name") }}</th>
- <th>{{ _("Shortcut") }}</th>
- <th>{{ _("Selected language") }}</th>
- <th>{{ _("SafeSearch") }}</th>
- <th>{{ _("Time range") }}</th>
- <th>{{ _("Avg. time") }}</th>
- <th>{{ _("Max time") }}</th>
+ <th>{{ _("Allow") }}</th>
+ <th>{{ _("Engine name") }}</th>
+ <th>{{ _("Shortcut") }}</th>
+ <th>{{ _("Selected language") }}</th>
+ <th>{{ _("SafeSearch") }}</th>
+ <th>{{ _("Time range") }}</th>
+ <th>{{ _("Avg. time") }}</th>
+ <th>{{ _("Max time") }}</th>
{% else %}
- <th>{{ _("Max time") }}</th>
- <th>{{ _("Avg. time") }}</th>
- <th>{{ _("Time range") }}</th>
- <th>{{ _("SafeSearch") }}</th>
- <th>{{ _("Selected language") }}</th>
- <th>{{ _("Shortcut") }}</th>
- <th>{{ _("Engine name") }}</th>
- <th>{{ _("Allow") }}</th>
+ <th>{{ _("Max time") }}</th>
+ <th>{{ _("Avg. time") }}</th>
+ <th>{{ _("Time range") }}</th>
+ <th>{{ _("SafeSearch") }}</th>
+ <th>{{ _("Selected language") }}</th>
+ <th>{{ _("Shortcut") }}</th>
+ <th>{{ _("Engine name") }}</th>
+ <th>{{ _("Allow") }}</th>
{% endif %}
</tr>
{% for search_engine in engines_by_category[categ] %}
@@ -186,19 +192,19 @@
{{ checkbox_toggle('engine_' + search_engine.name|replace(' ', '_') + '__' + categ|replace(' ', '_'), (search_engine.name, categ) in disabled_engines) }}
</td>
<th>{{ search_engine.name }}</th>
- <td class="name">{{ shortcuts[search_engine.name] }}</td>
- <td>{{ support_toggle(stats[search_engine.name].supports_selected_language) }}</td>
- <td>{{ support_toggle(search_engine.safesearch==True) }}</td>
- <td>{{ support_toggle(search_engine.time_range_support==True) }}</td>
- <td class="{{ 'danger' if stats[search_engine.name]['warn_time'] else '' }}">{{ 'N/A' if stats[search_engine.name].time==None else stats[search_engine.name].time }}</td>
- <td class="{{ 'danger' if stats[search_engine.name]['warn_timeout'] else '' }}">{{ search_engine.timeout }}</td>
- {% else %}
- <td class="{{ 'danger' if stats[search_engine.name]['warn_timeout'] else '' }}">{{ search_engine.timeout }}</td>
- <td class="{{ 'danger' if stats[search_engine.name]['warn_time'] else '' }}">{{ 'N/A' if stats[search_engine.name].time==None else stats[search_engine.name].time }}</td>
- <td>{{ support_toggle(search_engine.time_range_support==True) }}</td>
- <td>{{ support_toggle(search_engine.safesearch==True) }}</td>
- <td>{{ support_toggle(stats[search_engine.name].supports_selected_language) }}</td>
- <td>{{ shortcuts[search_engine.name] }}</td>
+ <td class="name">{{ shortcuts[search_engine.name] }}</td>
+ <td>{{ support_toggle(stats[search_engine.name].supports_selected_language) }}</td>
+ <td>{{ support_toggle(search_engine.safesearch==True) }}</td>
+ <td>{{ support_toggle(search_engine.time_range_support==True) }}</td>
+ <td class="{{ 'danger' if stats[search_engine.name]['warn_time'] else '' }}">{{ 'N/A' if stats[search_engine.name].time==None else stats[search_engine.name].time }}</td>
+ <td class="{{ 'danger' if stats[search_engine.name]['warn_timeout'] else '' }}">{{ search_engine.timeout }}</td>
+ {% else %}
+ <td class="{{ 'danger' if stats[search_engine.name]['warn_timeout'] else '' }}">{{ search_engine.timeout }}</td>
+ <td class="{{ 'danger' if stats[search_engine.name]['warn_time'] else '' }}">{{ 'N/A' if stats[search_engine.name].time==None else stats[search_engine.name].time }}</td>
+ <td>{{ support_toggle(search_engine.time_range_support==True) }}</td>
+ <td>{{ support_toggle(search_engine.safesearch==True) }}</td>
+ <td>{{ support_toggle(stats[search_engine.name].supports_selected_language) }}</td>
+ <td>{{ shortcuts[search_engine.name] }}</td>
<th>{{ search_engine.name }}</th>
<td class="onoff-checkbox">
{{ checkbox_toggle('engine_' + search_engine.name|replace(' ', '_') + '__' + categ|replace(' ', '_'), (search_engine.name, categ) in disabled_engines) }}
@@ -207,7 +213,7 @@
</tr>
{% endif %}
{% endfor %}
- </table>
+ </table>
</div>
</fieldset>
</div>
diff --git a/searx/templates/oscar/result_templates/code.html b/searx/templates/oscar/result_templates/code.html
index ba74d0333..a1c18a6b7 100644
--- a/searx/templates/oscar/result_templates/code.html
+++ b/searx/templates/oscar/result_templates/code.html
@@ -1,18 +1,18 @@
-{% from 'oscar/macros.html' import result_header, result_sub_header, result_footer, result_footer_rtl, icon %}
-
-{{ result_header(result, favicons) }}
-{{ result_sub_header(result) }}
-
-{% if result.content %}<p class="result-content">{{ result.content|safe }}</p>{% endif %}
-
-{% if result.repository %}<p class="result-content">{{ icon('file') }} <a href="{{ result.repository }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.repository }}</a></p>{% endif %}
-
-<div dir="ltr">
-{{ result.codelines|code_highlighter(result.code_language)|safe }}
-</div>
-
-{% if rtl %}
-{{ result_footer_rtl(result) }}
-{% else %}
-{{ result_footer(result) }}
-{% endif %}
+{% from 'oscar/macros.html' import result_header, result_sub_header, result_footer, result_footer_rtl, icon %}
+
+{{ result_header(result, favicons) }}
+{{ result_sub_header(result) }}
+
+{% if result.content %}<p class="result-content">{{ result.content|safe }}</p>{% endif %}
+
+{% if result.repository %}<p class="result-content">{{ icon('file') }} <a href="{{ result.repository }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}>{{ result.repository }}</a></p>{% endif %}
+
+<div dir="ltr">
+{{ result.codelines|code_highlighter(result.code_language)|safe }}
+</div>
+
+{% if rtl %}
+{{ result_footer_rtl(result) }}
+{% else %}
+{{ result_footer(result) }}
+{% endif %}
diff --git a/searx/templates/oscar/result_templates/default.html b/searx/templates/oscar/result_templates/default.html
index 3ed0f3122..885cbbfa8 100644
--- a/searx/templates/oscar/result_templates/default.html
+++ b/searx/templates/oscar/result_templates/default.html
@@ -1,31 +1,31 @@
-{% from 'oscar/macros.html' import result_header, result_sub_header, result_footer, result_footer_rtl, icon with context %}
-
-{{ result_header(result, favicons) }}
-{{ result_sub_header(result) }}
-
-{% if result.embedded %}
- <small> &bull; <a class="text-info btn-collapse collapsed cursor-pointer media-loader disabled_if_nojs" data-toggle="collapse" data-target="#result-media-{{ index }}" data-btn-text-collapsed="{{ _('show media') }}" data-btn-text-not-collapsed="{{ _('hide media') }}">{{ icon('music') }} {{ _('show media') }}</a></small>
-{% endif %}
-
-{% if result.embedded %}
-<div id="result-media-{{ index }}" class="collapse">
- {{ result.embedded|safe }}
-</div>
-{% endif %}
-
-{% if result.img_src %}
-<div class="container-fluid">
- <div class="row">
-<img src="{{ image_proxify(result.img_src) }}" alt="{{ result.title|striptags }}" title="{{ result.title|striptags }}" style="width: auto; max-height: 60px; min-height: 60px;" class="col-xs-2 col-sm-4 col-md-4 result-content">
-{% if result.content %}<p class="result-content col-xs-8 col-sm-8 col-md-8">{{ result.content|safe }}</p>{% endif %}
- </div>
-</div>
-{% else %}
-{% if result.content %}<p class="result-content">{{ result.content|safe }}</p>{% endif %}
-{% endif %}
-
-{% if rtl %}
-{{ result_footer_rtl(result) }}
-{% else %}
-{{ result_footer(result) }}
-{% endif %}
+{% from 'oscar/macros.html' import result_header, result_sub_header, result_footer, result_footer_rtl, icon with context %}
+
+{{- result_header(result, favicons) -}}
+{{- result_sub_header(result) -}}
+
+{%- if result.embedded -%}
+ <small> &bull; <a class="text-info btn-collapse collapsed cursor-pointer media-loader disabled_if_nojs" data-toggle="collapse" data-target="#result-media-{{ index }}" data-btn-text-collapsed="{{ _('show media') }}" data-btn-text-not-collapsed="{{ _('hide media') }}">{{ icon('music') }} {{ _('show media') }}</a></small>
+{%- endif -%}
+
+{%- if result.embedded -%}
+<div id="result-media-{{ index }}" class="collapse">
+ {{ result.embedded|safe }}
+</div>
+{%- endif -%}
+
+{%- if result.img_src -%}
+<div class="container-fluid">
+ <div class="row">
+<img src="{{ image_proxify(result.img_src) }}" alt="{{ result.title|striptags }}" title="{{ result.title|striptags }}" style="width: auto; max-height: 60px; min-height: 60px;" class="col-xs-2 col-sm-4 col-md-4 result-content">
+{% if result.content %}<p class="result-content col-xs-8 col-sm-8 col-md-8">{{ result.content|safe }}</p>{% endif -%}
+ </div>
+</div>
+{%- else -%}
+{%- if result.content %}<p class="result-content">{{ result.content|safe }}</p>{% endif -%}
+{%- endif -%}
+
+{%- if rtl -%}
+{{ result_footer_rtl(result) }}
+{%- else -%}
+{{ result_footer(result) }}
+{%- endif -%}
diff --git a/searx/templates/oscar/result_templates/images.html b/searx/templates/oscar/result_templates/images.html
index b23f34915..d0a3b7b83 100644
--- a/searx/templates/oscar/result_templates/images.html
+++ b/searx/templates/oscar/result_templates/images.html
@@ -1,39 +1,36 @@
-{% from 'oscar/macros.html' import draw_favicon %}
-
-<a href="{{ result.img_src }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} data-toggle="modal" data-target="#modal-{{ index }}-{{pageno}}">
- <img src="{% if result.thumbnail_src %}{{ image_proxify(result.thumbnail_src) }}{% else %}{{ image_proxify(result.img_src) }}{% endif %}" alt="{{ result.title|striptags }}" title="{{ result.title|striptags }}" class="img-thumbnail">
-</a>
-
-<div class="modal fade" id="modal-{{ index }}-{{ pageno }}" tabindex="-1" role="dialog" aria-hidden="true">
- <div class="modal-dialog">
- <div class="modal-wrapper">
- <div class="modal-header">
- <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
- <h4 class="modal-title">{% if result.engine~".png" in favicons %}{{ draw_favicon(result.engine) }} {% endif %}{{ result.title|striptags }}</h4>
- </div>
- <div class="modal-body">
- <img class="img-responsive center-block" src="{% if result.thumbnail_src %}{{ image_proxify(result.thumbnail_src) }}{% else %}{{ image_proxify(result.img_src) }}{% endif %}" alt="{{ result.title|striptags }}">
- {% if result.author %}<span class="photo-author">{{ result.author }}</span><br />{% endif %}
- {% if result.content %}
- <p class="result-content">
- {{ result.content }}
- </p>
- {% endif %}
- </div>
- <div class="modal-footer">
- <div class="clearfix"></div>
- <span class="label label-default pull-right">{{ result.engine }}</span>
- <p class="text-muted pull-left">{{ result.pretty_url }}</p>
- <div class="clearfix"></div>
- <div class="row">
- <div class="col-md-6">
- <a href="{{ result.img_src }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} class="btn btn-default">{{ _('Get image') }}</a>
- </div>
- <div class="col-md-6">
- <a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} class="btn btn-default">{{ _('View source') }}</a>
- </div>
- </div>
- </div>
- </div>
- </div>
-</div>
+{%- from 'oscar/macros.html' import draw_favicon -%}
+
+<a href="{{ result.img_src }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} data-toggle="modal" data-target="#modal-{{ index }}-{{pageno}}">{{- "" -}}
+ <img src="{% if result.thumbnail_src %}{{ image_proxify(result.thumbnail_src) }}{% else %}{{ image_proxify(result.img_src) }}{% endif %}" alt="{{ result.title|striptags }}" title="{{ result.title|striptags }}" class="img-thumbnail">{{- "" -}}
+</a>
+<div class="modal fade" id="modal-{{ index }}-{{ pageno }}" tabindex="-1" role="dialog" aria-hidden="true">{{- "" -}}
+ <div class="modal-dialog">{{- "" -}}
+ <div class="modal-wrapper">{{- "" -}}
+ <div class="modal-header">{{- "" -}}
+ <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>{{- "" -}}
+ <h4 class="modal-title">{% if result.engine~".png" in favicons %}{{ draw_favicon(result.engine) }} {% endif %}{{ result.title|striptags }}</h4>{{- "" -}}
+ </div>{{- "" -}}
+ <div class="modal-body">{{- "" -}}
+ <img class="img-responsive center-block" src="{% if result.thumbnail_src %}{{ image_proxify(result.thumbnail_src) }}{% else %}{{ image_proxify(result.img_src) }}{% endif %}" alt="{{ result.title|striptags }}">
+ {%- if result.author %}<span class="photo-author">{{ result.author }}</span><br />{% endif -%}
+ {%- if result.content %}<p class="result-content">{{ result.content|striptags }}</p>{% endif -%}
+ {%- if result.img_format %}<p class="result-format">{{ result.img_format }}</p>{% endif -%}
+ {%- if result.source %}<p class="result-source">{{ result.source }}</p>{% endif -%}
+ </div>{{- "" -}}
+ <div class="modal-footer">{{- "" -}}
+ <div class="clearfix"></div>{{- "" -}}
+ <span class="label label-default pull-right">{{ result.engine }}</span>{{- "" -}}
+ <p class="text-muted pull-left">{{ result.pretty_url }}</p>{{- "" -}}
+ <div class="clearfix"></div>{{- "" -}}
+ <div class="row">{{- "" -}}
+ <div class="col-md-6">{{- "" -}}
+ <a href="{{ result.img_src }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} class="btn btn-default">{{ _('Get image') }}</a>{{- "" -}}
+ </div>{{- "" -}}
+ <div class="col-md-6">{{- "" -}}
+ <a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %} class="btn btn-default">{{ _('View source') }}</a>{{- "" -}}
+ </div>{{- "" -}}
+ </div>{{- "" -}}
+ </div>{{- "" -}}
+ </div>{{- "" -}}
+ </div>{{- "" -}}
+</div>{{- "" -}}
diff --git a/searx/templates/oscar/result_templates/key-value.html b/searx/templates/oscar/result_templates/key-value.html
new file mode 100644
index 000000000..67c748e7f
--- /dev/null
+++ b/searx/templates/oscar/result_templates/key-value.html
@@ -0,0 +1,19 @@
+{% from 'oscar/macros.html' import result_footer, result_footer_rtl with context %}
+<div class="panel panel-default">
+<table class="table table-responsive table-bordered table-condensed">
+ {% for key, value in result.items() %}
+ {% if key in ['engine', 'engines', 'template', 'score', 'category', 'positions'] %}
+ {% continue %}
+ {% endif %}
+ <tr>
+ <td><b>{{ key|upper }}</b>: {{ value }}</td>
+ </tr>
+ {% endfor %}
+</table>
+
+{% if rtl %}
+{{ result_footer_rtl(result) }}
+{% else %}
+{{ result_footer(result) }}
+{% endif %}
+</div>
diff --git a/searx/templates/oscar/result_templates/map.html b/searx/templates/oscar/result_templates/map.html
index 822c7cdea..712375d7f 100644
--- a/searx/templates/oscar/result_templates/map.html
+++ b/searx/templates/oscar/result_templates/map.html
@@ -1,72 +1,72 @@
-{% from 'oscar/macros.html' import result_header, result_sub_header, result_footer, result_footer_rtl, icon %}
-
-{{ result_header(result, favicons) }}
-{{ result_sub_header(result) }}
-
-{% if (result.latitude and result.longitude) or result.boundingbox %}
- <small> &bull; <a class="text-info btn-collapse collapsed searx_init_map cursor-pointer disabled_if_nojs" data-toggle="collapse" data-target="#result-map-{{ index }}" data-leaflet-target="osm-map-{{ index }}" data-map-lon="{{ result.longitude }}" data-map-lat="{{ result.latitude }}" {% if result.boundingbox %}data-map-boundingbox='{{ result.boundingbox|tojson|safe }}'{% endif %} {% if result.geojson %}data-map-geojson='{{ result.geojson|tojson|safe }}'{% endif %} data-btn-text-collapsed="{{ _('show map') }}" data-btn-text-not-collapsed="{{ _('hide map') }}">{{ icon('globe') }} {{ _('show map') }}</a></small>
-{% endif %}
-
-{% if result.osm and (result.osm.type and result.osm.id) %}
- <small> &bull; <a class="text-info btn-collapse collapsed cursor-pointer searx_overpass_request disabled_if_nojs" data-toggle="collapse" data-target="#result-overpass-{{ index }}" data-osm-type="{{ result.osm.type }}" data-osm-id="{{ result.osm.id }}" data-result-table="result-overpass-table-{{ index }}" data-result-table-loadicon="result-overpass-table-loading-{{ index }}" data-btn-text-collapsed="{{ _('show details') }}" data-btn-text-not-collapsed="{{ _('hide details') }}">{{ icon('map-marker') }} {{ _('show details') }}</a></small>
-{% endif %}
-
-{# {% if (result.latitude and result.longitude) %}
- <small> &bull; <a class="text-info btn-collapse collapsed cursor-pointer disabled_if_nojs" data-toggle="collapse" data-target="#result-geodata-{{ index }}" data-btn-text-collapsed="{{ _('show geodata') }}" data-btn-text-not-collapsed="{{ _('hide geodata') }}">{{ icon('map-marker') }} {{ _('show geodata') }}</a></small>
-{% endif %} #}
-
-<div class="container-fluid">
-
-{% if result.address %}
-<p class="row result-content result-adress col-xs-12 col-sm-5 col-md-4" itemscope itemtype="http://schema.org/PostalAddress">
- {% if result.address.name %}
- <strong itemprop="name">{{ result.address.name }}</strong><br/>
- {% endif %}
- {% if result.address.road %}
- <span itemprop="streetAddress">
- {% if result.address.house_number %}{{ result.address.house_number }}, {% endif %}
- {{ result.address.road }}
- </span><br/>
- {% endif %}
- {% if result.address.locality %}
- <span itemprop="addressLocality">{{ result.address.locality }}</span>
- {% if result.address.postcode %}, <span itemprop="postalCode">{{ result.address.postcode }}</span>{% endif %}
- <br/>
- {% endif %}
- {% if result.address.country %}
- <span itemprop="addressCountry">{{ result.address.country }}</span>
- {% endif %}
-</p>
-{% endif %}
-
-{% if result.osm and (result.osm.type and result.osm.id) %}
- <div class="row result-content collapse col-xs-12 col-sm-7 col-md-8" id="result-overpass-{{ index }}"{% if rtl %} dir="ltr"{% endif %}>
- <div class="text-center" id="result-overpass-table-loading-{{ index }}"><img src="{{ url_for('static', filename='img/loader.gif') }}" alt="Loading ..."/></div>
- <table class="table table-striped table-condensed hidden" id="result-overpass-table-{{ index }}">
- <tr><th>key</th><th>value</th></tr>
- </table>
- </div>
-{% endif %}
-
-{# {% if (result.latitude and result.longitude) %}
- <div class="row collapse col-xs-12 col-sm-5 col-md-4" id="result-geodata-{{ index }}">
- <strong>Longitude:</strong> {{ result.longitude }} <br/>
- <strong>Latitude:</strong> {{ result.latitude }}
- </div>
-{% endif %} #}
-
-{% if result.content %}<p class="row result-content col-xs-12 col-sm-12 col-md-12">{{ result.content|safe }}</p>{% endif %}
-
-</div>
-
-{% if (result.latitude and result.longitude) or result.boundingbox %}
- <div class="collapse" id="result-map-{{ index }}">
- <div style="height:300px; width:100%; margin: 10px 0;" id="osm-map-{{ index }}"></div>
- </div>
-{% endif %}
-
-{% if rtl %}
-{{ result_footer_rtl(result) }}
-{% else %}
-{{ result_footer(result) }}
-{% endif %}
+{% from 'oscar/macros.html' import result_header, result_sub_header, result_footer, result_footer_rtl, icon %}
+
+{{ result_header(result, favicons) }}
+{{ result_sub_header(result) }}
+
+{% if (result.latitude and result.longitude) or result.boundingbox %}
+ <small> &bull; <a class="text-info btn-collapse collapsed searx_init_map cursor-pointer disabled_if_nojs" data-toggle="collapse" data-target="#result-map-{{ index }}" data-leaflet-target="osm-map-{{ index }}" data-map-lon="{{ result.longitude }}" data-map-lat="{{ result.latitude }}" {% if result.boundingbox %}data-map-boundingbox='{{ result.boundingbox|tojson|safe }}'{% endif %} {% if result.geojson %}data-map-geojson='{{ result.geojson|tojson|safe }}'{% endif %} data-btn-text-collapsed="{{ _('show map') }}" data-btn-text-not-collapsed="{{ _('hide map') }}">{{ icon('globe') }} {{ _('show map') }}</a></small>
+{% endif %}
+
+{% if result.osm and (result.osm.type and result.osm.id) %}
+ <small> &bull; <a class="text-info btn-collapse collapsed cursor-pointer searx_overpass_request disabled_if_nojs" data-toggle="collapse" data-target="#result-overpass-{{ index }}" data-osm-type="{{ result.osm.type }}" data-osm-id="{{ result.osm.id }}" data-result-table="result-overpass-table-{{ index }}" data-result-table-loadicon="result-overpass-table-loading-{{ index }}" data-btn-text-collapsed="{{ _('show details') }}" data-btn-text-not-collapsed="{{ _('hide details') }}">{{ icon('map-marker') }} {{ _('show details') }}</a></small>
+{% endif %}
+
+{# {% if (result.latitude and result.longitude) %}
+ <small> &bull; <a class="text-info btn-collapse collapsed cursor-pointer disabled_if_nojs" data-toggle="collapse" data-target="#result-geodata-{{ index }}" data-btn-text-collapsed="{{ _('show geodata') }}" data-btn-text-not-collapsed="{{ _('hide geodata') }}">{{ icon('map-marker') }} {{ _('show geodata') }}</a></small>
+{% endif %} #}
+
+<div class="container-fluid">
+
+{% if result.address %}
+<p class="row result-content result-adress col-xs-12 col-sm-5 col-md-4" itemscope itemtype="http://schema.org/PostalAddress">
+ {% if result.address.name %}
+ <strong itemprop="name">{{ result.address.name }}</strong><br/>
+ {% endif %}
+ {% if result.address.road %}
+ <span itemprop="streetAddress">
+ {% if result.address.house_number %}{{ result.address.house_number }}, {% endif %}
+ {{ result.address.road }}
+ </span><br/>
+ {% endif %}
+ {% if result.address.locality %}
+ <span itemprop="addressLocality">{{ result.address.locality }}</span>
+ {% if result.address.postcode %}, <span itemprop="postalCode">{{ result.address.postcode }}</span>{% endif %}
+ <br/>
+ {% endif %}
+ {% if result.address.country %}
+ <span itemprop="addressCountry">{{ result.address.country }}</span>
+ {% endif %}
+</p>
+{% endif %}
+
+{% if result.osm and (result.osm.type and result.osm.id) %}
+ <div class="row result-content collapse col-xs-12 col-sm-7 col-md-8" id="result-overpass-{{ index }}"{% if rtl %} dir="ltr"{% endif %}>
+ <div class="text-center" id="result-overpass-table-loading-{{ index }}"><img src="{{ url_for('static', filename='img/loader.gif') }}" alt="Loading ..."/></div>
+ <table class="table table-striped table-condensed hidden" id="result-overpass-table-{{ index }}">
+ <tr><th>key</th><th>value</th></tr>
+ </table>
+ </div>
+{% endif %}
+
+{# {% if (result.latitude and result.longitude) %}
+ <div class="row collapse col-xs-12 col-sm-5 col-md-4" id="result-geodata-{{ index }}">
+ <strong>Longitude:</strong> {{ result.longitude }} <br/>
+ <strong>Latitude:</strong> {{ result.latitude }}
+ </div>
+{% endif %} #}
+
+{% if result.content %}<p class="row result-content col-xs-12 col-sm-12 col-md-12">{{ result.content|safe }}</p>{% endif %}
+
+</div>
+
+{% if (result.latitude and result.longitude) or result.boundingbox %}
+ <div class="collapse" id="result-map-{{ index }}">
+ <div style="height:300px; width:100%; margin: 10px 0;" id="osm-map-{{ index }}"></div>
+ </div>
+{% endif %}
+
+{% if rtl %}
+{{ result_footer_rtl(result) }}
+{% else %}
+{{ result_footer(result) }}
+{% endif %}
diff --git a/searx/templates/oscar/result_templates/torrent.html b/searx/templates/oscar/result_templates/torrent.html
index bc2b30fbe..089367e36 100644
--- a/searx/templates/oscar/result_templates/torrent.html
+++ b/searx/templates/oscar/result_templates/torrent.html
@@ -3,7 +3,7 @@
{{ result_header(result, favicons) }}
{{ result_sub_header(result) }}
-<p class="result-content">{{ icon('transfer') }} {{ _('Seeder') }} <span class="badge">{{ result.seed }}</span> &bull; {{ _('Leecher') }} <span class="badge">{{ result.leech }}</span>
+{% if result.seed is defined %}<p class="result-content">{{ icon('transfer') }} {{ _('Seeder') }} <span class="badge">{{ result.seed }}</span> &bull; {{ _('Leecher') }} <span class="badge">{{ result.leech }}</span>{% endif %}
{% if result.filesize %}<br />{{ icon('floppy-disk') }} {{ _('Filesize') }}
<span class="badge">
{% if result.filesize < 1024 %}{{ result.filesize }} {{ _('Bytes') }}
diff --git a/searx/templates/oscar/result_templates/videos.html b/searx/templates/oscar/result_templates/videos.html
index 36fb26240..3c1913d9d 100644
--- a/searx/templates/oscar/result_templates/videos.html
+++ b/searx/templates/oscar/result_templates/videos.html
@@ -1,27 +1,27 @@
-{% from 'oscar/macros.html' import result_header, result_sub_header, result_footer, result_footer_rtl, icon %}
-
-{{ result_header(result, favicons) }}
-{{ result_sub_header(result) }}
-
-{% if result.embedded %}
- <small> &bull; <a class="text-info btn-collapse collapsed cursor-pointer media-loader disabled_if_nojs" data-toggle="collapse" data-target="#result-video-{{ index }}" data-btn-text-collapsed="{{ _('show video') }}" data-btn-text-not-collapsed="{{ _('hide video') }}">{{ icon('film') }} {{ _('show video') }}</a></small>
-{% endif %}
-
-{% if result.embedded %}
-<div id="result-video-{{ index }}" class="collapse">
- {{ result.embedded|safe }}
-</div>
-{% endif %}
-
-<div class="container-fluid">
- <div class="row">
- <a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}><img class="thumbnail col-xs-6 col-sm-4 col-md-4 result-content" src="{{ image_proxify(result.thumbnail) }}" alt="{{ result.title|striptags }} {{ result.engine }}" /></a>
- {% if result.content %}<p class="col-xs-12 col-sm-8 col-md-8 result-content">{{ result.content|safe }}</p>{% endif %}
- </div>
-</div>
-
-{% if rtl %}
-{{ result_footer_rtl(result) }}
-{% else %}
-{{ result_footer(result) }}
-{% endif %}
+{% from 'oscar/macros.html' import result_header, result_sub_header, result_footer, result_footer_rtl, icon %}
+
+{{ result_header(result, favicons) }}
+{{ result_sub_header(result) }}
+
+{% if result.embedded %}
+ <small> &bull; <a class="text-info btn-collapse collapsed cursor-pointer media-loader disabled_if_nojs" data-toggle="collapse" data-target="#result-video-{{ index }}" data-btn-text-collapsed="{{ _('show video') }}" data-btn-text-not-collapsed="{{ _('hide video') }}">{{ icon('film') }} {{ _('show video') }}</a></small>
+{% endif %}
+
+{% if result.embedded %}
+<div id="result-video-{{ index }}" class="collapse">
+ {{ result.embedded|safe }}
+</div>
+{% endif %}
+
+<div class="container-fluid">
+ <div class="row">
+ <a href="{{ result.url }}" {% if results_on_new_tab %}target="_blank" rel="noopener noreferrer"{% else %}rel="noreferrer"{% endif %}><img class="thumbnail col-xs-6 col-sm-4 col-md-4 result-content" src="{{ image_proxify(result.thumbnail) }}" alt="{{ result.title|striptags }} {{ result.engine }}" /></a>
+ {% if result.content %}<p class="col-xs-12 col-sm-8 col-md-8 result-content">{{ result.content|safe }}</p>{% endif %}
+ </div>
+</div>
+
+{% if rtl %}
+{{ result_footer_rtl(result) }}
+{% else %}
+{{ result_footer(result) }}
+{% endif %}
diff --git a/searx/templates/oscar/results.html b/searx/templates/oscar/results.html
index ee1052dba..43e3e26d9 100644
--- a/searx/templates/oscar/results.html
+++ b/searx/templates/oscar/results.html
@@ -1,155 +1,156 @@
-{% extends "oscar/base.html" %}
-{% macro search_form_attrs(pageno) -%}
- {% for category in selected_categories %}<input type="hidden" name="category_{{ category }}" value="1"/>{% endfor %}
- <input type="hidden" name="q" value="{{ q|e }}" />
- <input type="hidden" name="pageno" value="{{ pageno }}" />
- <input type="hidden" name="time_range" value="{{ time_range }}" />
- <input type="hidden" name="language" value="{{ current_language }}" />
-{%- endmacro %}
-{%- macro search_url() %}{{ base_url }}?q={{ q|urlencode }}{% if selected_categories %}&amp;categories={{ selected_categories|join(",") | replace(' ','+') }}{% endif %}{% if pageno > 1 %}&amp;pageno={{ pageno }}{% endif %}{% if time_range %}&amp;time_range={{ time_range }}{% endif %}{% if current_language != 'all' %}&amp;language={{ current_language }}{% endif %}{% endmacro -%}
-
-{% block title %}{{ q|e }} - {% endblock %}
-{% block meta %}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q|e }}" href="{{ search_url() }}&amp;format=rss">{% endblock %}
-{% block content %}
- {% include 'oscar/search.html' %}
- <div class="row">
- <div class="col-sm-8" id="main_results">
- <h1 class="sr-only">{{ _('Search results') }}</h1>
-
- {% if corrections %}
- <div class="result">
- <span class="result_header text-muted form-inline pull-left suggestion_item">{{ _('Try searching for:') }}</span>
- {% for correction in corrections %}
- <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" role="navigation" class="form-inline pull-left suggestion_item">
- <input type="hidden" name="q" value="{{ correction }}">
- <button type="submit" class="btn btn-default btn-xs">{{ correction }}</button>
- </form>
- {% endfor %}
- </div>
- {% endif %}
-
- {% if answers %}
- {% for answer in answers %}
- <div class="result well">
- <span>{{ answer }}</span>
- </div>
- {% endfor %}
- {% endif %}
-
- {% for result in results %}
- <div class="result {% if result['template'] %}result-{{ result.template|replace('.html', '') }}{% else %}result-default{% endif %}">
- {% set index = loop.index %}
- {% if result.template %}
- {% include get_result_template('oscar', result['template']) %}
- {% else %}
- {% include 'oscar/result_templates/default.html' %}
- {% endif %}
- </div>
- {% endfor %}
-
- {% if not results and not answers %}
- {% include 'oscar/messages/no_results.html' %}
- {% endif %}
-
- <div class="clearfix"></div>
-
- {% if paging %}
- {% if rtl %}
- <div id="pagination">
- <div class="pull-left">
- <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" class="pull-left">
- {{ search_form_attrs(pageno+1) }}
- <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-backward"></span> {{ _('next page') }}</button>
- </form>
- </div>
- <div class="pull-right">
- <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" class="pull-left">
- {{ search_form_attrs(pageno-1) }}
- <button type="submit" class="btn btn-default" {% if pageno == 1 %}disabled{% endif %}><span class="glyphicon glyphicon-forward"></span> {{ _('previous page') }}</button>
- </form>
- </div>
- </div><!-- /#pagination -->
- <div class="clearfix"></div>
- {% else %}
- <div id="pagination">
- <div class="pull-left">
- <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" class="pull-left">
- {{ search_form_attrs(pageno-1) }}
- <button type="submit" class="btn btn-default" {% if pageno == 1 %}disabled{% endif %}><span class="glyphicon glyphicon-backward"></span> {{ _('previous page') }}</button>
- </form>
- </div>
- <div class="pull-right">
- <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" class="pull-left">
- {{ search_form_attrs(pageno+1) }}
- <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-forward"></span> {{ _('next page') }}</button>
- </form>
- </div>
- </div><!-- /#pagination -->
- <div class="clearfix"></div>
- {% endif %}
- {% endif %}
- </div><!-- /#main_results -->
-
- <div class="col-sm-4" id="sidebar_results">
- {% if number_of_results != '0' %}
- <p><small>{{ _('Number of results') }}: {{ number_of_results }}</small></p>
- {% endif %}
-
- {% if unresponsive_engines and results|length >= 1 %}
- <div class="alert alert-danger fade in" role="alert">
- <p>{{ _('Engines cannot retrieve results') }}:</p>
- {% for engine_name, error_type in unresponsive_engines %}
- {{ engine_name }} ({{ error_type }}){% if not loop.last %}, {% endif %}
- {% endfor %}
- </div>
- {% endif %}
-
- {% if infoboxes %}
- {% for infobox in infoboxes %}
- {% include 'oscar/infobox.html' %}
- {% endfor %}
- {% endif %}
-
- {% if suggestions %}
- <div class="panel panel-default">
- <div class="panel-heading">
- <h4 class="panel-title">{{ _('Suggestions') }}</h4>
- </div>
- <div class="panel-body">
- {% for suggestion in suggestions %}
- <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" role="navigation" class="form-inline pull-{% if rtl %}right{% else %}left{% endif %} suggestion_item">
- <input type="hidden" name="q" value="{{ suggestion }}">
- <button type="submit" class="btn btn-default btn-xs">{{ suggestion }}</button>
- </form>
- {% endfor %}
- </div>
- </div>
- {% endif %}
-
- <div class="panel panel-default">
- <div class="panel-heading">
- <h4 class="panel-title">{{ _('Links') }}</h4>
- </div>
- <div class="panel-body">
- <form role="form">
- <div class="form-group">
- <label for="search_url">{{ _('Search URL') }}</label>
- <input id="search_url" type="url" class="form-control select-all-on-click cursor-text" name="search_url" value="{{ search_url() }}" readonly>
- </div>
- </form>
-
- <label>{{ _('Download results') }}</label>
- <div class="clearfix"></div>
- {% for output_type in ('csv', 'json', 'rss') %}
- <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" class="form-inline pull-{% if rtl %}right{% else %}left{% endif %} result_download">
- {{ search_form_attrs(pageno) }}
- <input type="hidden" name="format" value="{{ output_type }}">
- <button type="submit" class="btn btn-default">{{ output_type }}</button>
- </form>
- {% endfor %}
- <div class="clearfix"></div>
- </div>
- </div>
- </div><!-- /#sidebar_results -->
- </div>
-{% endblock %}
+{% extends "oscar/base.html" %}
+{% macro search_form_attrs(pageno) -%}
+ {%- for category in selected_categories -%}<input type="hidden" name="category_{{ category }}" value="1"/>{%- endfor -%}
+ <input type="hidden" name="q" value="{{ q|e }}" />{{- "" -}}
+ <input type="hidden" name="pageno" value="{{ pageno }}" />{{- "" -}}
+ <input type="hidden" name="time_range" value="{{ time_range }}" />{{- "" -}}
+ <input type="hidden" name="language" value="{{ current_language }}" />{{- "" -}}
+ {% if timeout_limit %}<input type="hidden" name="timeout_limit" value="{{ timeout_limit|e }}" />{% endif -%}
+{%- endmacro %}
+{%- macro search_url() %}{{ base_url }}?q={{ q|urlencode }}{% if selected_categories %}&amp;categories={{ selected_categories|join(",") | replace(' ','+') }}{% endif %}{% if pageno > 1 %}&amp;pageno={{ pageno }}{% endif %}{% if time_range %}&amp;time_range={{ time_range }}{% endif %}{% if current_language != 'all' %}&amp;language={{ current_language }}{% endif %}{% endmacro -%}
+
+{% block title %}{{ q|e }} - {% endblock %}
+{% block meta %}{{" "}}<link rel="alternate" type="application/rss+xml" title="Searx search: {{ q|e }}" href="{{ search_url() }}&amp;format=rss">{% endblock %}
+{% block content %}
+ {% include 'oscar/search.html' %}
+
+ <div class="row">
+ <div class="col-sm-4 col-sm-push-8" id="sidebar_results">
+ {% if number_of_results != '0' -%}
+ <p><small>{{ _('Number of results') }}: {{ number_of_results }}</small></p>
+ {%- endif %}
+
+ {% if unresponsive_engines and results|length >= 1 -%}
+ <div class="alert alert-danger fade in" role="alert">
+ <p>{{ _('Engines cannot retrieve results') }}:</p>
+ {%- for engine_name, error_type in unresponsive_engines -%}
+ {{- engine_name }} ({{ error_type }}){% if not loop.last %}, {% endif %}{{- "" -}}
+ {%- endfor -%}
+ </div>
+ {%- endif %}
+
+ {% if infoboxes -%}
+ {% for infobox in infoboxes %}
+ {% include 'oscar/infobox.html' %}{{- "\n\n" -}}
+ {% endfor %}
+ {%- endif %}
+
+ {% if suggestions %}
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h4 class="panel-title">{{ _('Suggestions') }}</h4>
+ </div>
+ <div class="panel-body">
+ {% for suggestion in suggestions %}
+ <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" role="navigation" class="form-inline pull-{% if rtl %}right{% else %}left{% endif %} suggestion_item">
+ <input type="hidden" name="q" value="{{ suggestion.url }}">
+ <button type="submit" class="btn btn-default btn-xs">{{ suggestion.title }}</button>
+ </form>
+ {% endfor %}
+ </div>
+ </div>
+ {%- endif %}
+
+ <div class="panel panel-default">
+ <div class="panel-heading">{{- "" -}}
+ <h4 class="panel-title">{{ _('Links') }}</h4>{{- "" -}}
+ </div>
+ <div class="panel-body">
+ <form role="form">{{- "" -}}
+ <div class="form-group">{{- "" -}}
+ <label for="search_url">{{ _('Search URL') }}</label>{{- "" -}}
+ <input id="search_url" type="url" class="form-control select-all-on-click cursor-text" name="search_url" value="{{ search_url() }}" readonly>{{- "" -}}
+ </div>{{- "" -}}
+ </form>
+ <label>{{ _('Download results') }}</label>
+ <div class="clearfix"></div>
+ {% for output_type in ('csv', 'json', 'rss') %}
+ <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" class="form-inline pull-{% if rtl %}right{% else %}left{% endif %} result_download">
+ {{- search_form_attrs(pageno) -}}
+ <input type="hidden" name="format" value="{{ output_type }}">{{- "" -}}
+ <button type="submit" class="btn btn-default">{{ output_type }}</button>{{- "" -}}
+ </form>
+ {% endfor %}
+ <div class="clearfix"></div>
+ </div>
+ </div>
+ </div><!-- /#sidebar_results -->
+
+ <div class="col-sm-8 col-sm-pull-4" id="main_results">
+ <h1 class="sr-only">{{ _('Search results') }}</h1>
+
+ {% if corrections -%}
+ <div class="result">
+ <span class="result_header text-muted form-inline pull-left suggestion_item">{{ _('Try searching for:') }}</span>
+ {% for correction in corrections -%}
+ <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" role="navigation" class="form-inline pull-left suggestion_item">{{- "" -}}
+ <input type="hidden" name="q" value="{{ correction.url }}">{{- "" -}}
+ <button type="submit" class="btn btn-default btn-xs">{{ correction.title }}</button>{{- "" -}}
+ </form>
+ {% endfor %}
+ </div>
+ {%- endif %}
+
+ {% if answers -%}
+ {%- for answer in answers %}
+ <div class="result well">
+ <span>{{ answer }}</span>
+ </div>
+ {%- endfor %}
+ {%- endif %}
+
+ {% for result in results -%}
+ <div class="result {% if result['template'] %}result-{{ result.template|replace('.html', '') }}{% else %}result-default{% endif %}">
+ {%- set index = loop.index -%}
+ {%- if result.template -%}
+ {% include get_result_template('oscar', result['template']) %}
+ {%- else -%}
+ {% include 'oscar/result_templates/default.html' %}
+ {%- endif -%}
+ </div>
+ {% endfor %}
+
+ {% if not results and not answers -%}
+ {% include 'oscar/messages/no_results.html' %}
+ {% endif %}
+
+ <div class="clearfix"></div>
+
+ {% if paging -%}
+ {% if rtl %}
+ <div id="pagination">
+ <div class="pull-left">{{- "" -}}
+ <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" class="pull-left">
+ {{- search_form_attrs(pageno+1) -}}
+ <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-backward"></span> {{ _('next page') }}</button>{{- "" -}}
+ </form>{{- "" -}}
+ </div>
+ <div class="pull-right">{{- "" -}}
+ <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" class="pull-left">
+ {{- search_form_attrs(pageno-1) -}}
+ <button type="submit" class="btn btn-default" {% if pageno == 1 %}disabled{% endif %}><span class="glyphicon glyphicon-forward"></span> {{ _('previous page') }}</button>{{- "" -}}
+ </form>{{- "" -}}
+ </div>
+ </div><!-- /#pagination -->
+ <div class="clearfix"></div>
+ {% else %}
+ <div id="pagination">
+ <div class="pull-left">{{- "" -}}
+ <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" class="pull-left">
+ {{- search_form_attrs(pageno-1) -}}
+ <button type="submit" class="btn btn-default" {% if pageno == 1 %}disabled{% endif %}><span class="glyphicon glyphicon-backward"></span> {{ _('previous page') }}</button>{{- "" -}}
+ </form>{{- "" -}}
+ </div>
+ <div class="pull-right">{{- "" -}}
+ <form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" class="pull-left">
+ {{- search_form_attrs(pageno+1) -}}
+ <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-forward"></span> {{ _('next page') }}</button>{{- "" -}}
+ </form>{{- "" -}}
+ </div>
+ </div><!-- /#pagination -->
+ <div class="clearfix"></div>
+ {% endif %}
+ {% endif %}
+ </div><!-- /#main_results -->
+ </div>
+{% endblock %}
diff --git a/searx/templates/oscar/search.html b/searx/templates/oscar/search.html
index 59ee4688d..cad9eca89 100644
--- a/searx/templates/oscar/search.html
+++ b/searx/templates/oscar/search.html
@@ -1,24 +1,24 @@
-{% from 'oscar/macros.html' import icon %}
-<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" id="search_form" role="search">
- <div class="row">
- <div class="col-xs-12 col-md-8">
- <div class="input-group search-margin">
- <input type="search" name="q" class="form-control" id="q" placeholder="{{ _('Search for...') }}" autocomplete="off" value="{{ q }}">
- <span class="input-group-btn">
- <button type="submit" class="btn btn-default"><span class="hide_if_nojs">{{ icon('search') }}</span><span class="hidden active_if_nojs">{{ _('Start search') }}</span></button>
- </span>
- </div>
- </div>
- <div class="col-xs-6 col-md-2 search-margin">
- {% include 'oscar/time-range.html' %}
- </div>
- <div class="col-xs-6 col-md-2 search-margin">
- {% include 'oscar/languages.html' %}
- </div>
- </div>
- <div class="row">
- <div class="col-sm-12">
- {% include 'oscar/categories.html' %}
- </div>
- </div>
-</form><!-- / #search_form_full -->
+{% from 'oscar/macros.html' import icon %}
+<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" id="search_form" role="search">
+ <div class="row">
+ <div class="col-xs-12 col-md-8">
+ <div class="input-group search-margin">
+ <input type="search" name="q" class="form-control" id="q" placeholder="{{ _('Search for...') }}" aria-label="{{ _('Search for...') }}" autocomplete="off" value="{{ q }}" accesskey="s">
+ <span class="input-group-btn">
+ <button type="submit" class="btn btn-default" aria-label="{{ _('Start search') }}"><span class="hide_if_nojs">{{ icon('search') }}</span><span class="hidden active_if_nojs">{{ _('Start search') }}</span></button>
+ </span>
+ </div>
+ </div>
+ <div class="col-xs-6 col-md-2 search-margin">
+ {%- include 'oscar/time-range.html' -%}
+ </div>
+ <div class="col-xs-6 col-md-2 search-margin">
+ {%- include 'oscar/languages.html' -%}
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-sm-12">
+ {%- include 'oscar/categories.html' -%}
+ </div>
+ </div>
+</form><!-- / #search_form_full -->
diff --git a/searx/templates/oscar/search_full.html b/searx/templates/oscar/search_full.html
index 6fdae4028..656463178 100644
--- a/searx/templates/oscar/search_full.html
+++ b/searx/templates/oscar/search_full.html
@@ -1,18 +1,18 @@
-{% from 'oscar/macros.html' import icon %}
-
-<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" id="search_form" role="search">
- {% if rtl %}
- <div class="input-group">
- {% else %}
- <div class="input-group col-md-8 col-md-offset-2">
- {% endif %}
- <input type="search" name="q" class="form-control input-lg autofocus" id="q" placeholder="{{ _('Search for...') }}" autocomplete="off" value="{{ q }}">
- <span class="input-group-btn">
- <button type="submit" class="btn btn-default input-lg"><span class="hide_if_nojs">{{ icon('search') }}</span><span class="hidden active_if_nojs">{{ _('Start search') }}</span></button>
- </span>
- </div>
- <div class="col-md-8 col-md-offset-2 advanced">
- {% include 'oscar/advanced.html' %}
- </div>
-
-</form><!-- / #search_form_full -->
+{% from 'oscar/macros.html' import icon %}
+
+<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" id="search_form" role="search">
+ {% if rtl %}
+ <div class="input-group">
+ {% else %}
+ <div class="input-group col-md-8 col-md-offset-2">
+ {% endif %}
+ <input type="search" name="q" class="form-control input-lg autofocus" id="q" placeholder="{{ _('Search for...') }}" aria-label="{{ _('Search for...') }}" autocomplete="off" value="{{ q }}" accesskey="s">
+ <span class="input-group-btn">
+ <button type="submit" class="btn btn-default input-lg" aria-label="{{ _('Start search') }}"><span class="hide_if_nojs">{{ icon('search') }}</span><span class="hidden active_if_nojs">{{ _('Start search') }}</span></button>
+ </span>
+ </div>
+ <div class="col-md-8 col-md-offset-2 advanced">
+ {% include 'oscar/advanced.html' %}
+ </div>
+
+</form><!-- / #search_form_full -->
diff --git a/searx/templates/oscar/time-range.html b/searx/templates/oscar/time-range.html
index d5efe9182..fb1c0754b 100644
--- a/searx/templates/oscar/time-range.html
+++ b/searx/templates/oscar/time-range.html
@@ -1,17 +1,17 @@
-<select name="time_range" id="time-range" class="custom-select form-control">
+<select name="time_range" id="time-range" class="custom-select form-control" accesskey="t">{{- "" -}}
<option id="time-range-anytime" value="" {{ "selected" if time_range=="" or not time_range else ""}}>
- {{ _('Anytime') }}
- </option>
+ {{- _('Anytime') -}}
+ </option>{{- "" -}}
<option id="time-range-day" value="day" {{ "selected" if time_range=="day" else ""}}>
- {{ _('Last day') }}
- </option>
+ {{- _('Last day') -}}
+ </option>{{- "" -}}
<option id="time-range-week" value="week" {{ "selected" if time_range=="week" else ""}}>
- {{ _('Last week') }}
- </option>
+ {{- _('Last week') -}}
+ </option>{{- "" -}}
<option id="time-range-month" value="month" {{ "selected" if time_range=="month" else ""}}>
- {{ _('Last month') }}
- </option>
+ {{- _('Last month') -}}
+ </option>{{- "" -}}
<option id="time-range-year" value="year" {{ "selected" if time_range=="year" else ""}}>
- {{ _('Last year') }}
- </option>
+ {{- _('Last year') -}}
+ </option>{{- "" -}}
</select>
diff --git a/searx/templates/simple/base.html b/searx/templates/simple/base.html
index 734dccbe8..92597b654 100644
--- a/searx/templates/simple/base.html
+++ b/searx/templates/simple/base.html
@@ -11,29 +11,26 @@
<meta name="HandheldFriendly" content="True">
<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1">
<title>{% block title %}{% endblock %}{{ instance_name }}</title>
+ {% block meta %}{% endblock %}
{% if rtl %}
<link rel="stylesheet" href="{{ url_for('static', filename='css/searx-rtl.min.css') }}" type="text/css" media="screen" />
{% else %}
<link rel="stylesheet" href="{{ url_for('static', filename='css/searx.min.css') }}" type="text/css" media="screen" />
{% endif %}
{% block styles %}{% endblock %}
- {% block meta %}{% endblock %}
+ <!--[if gte IE 9]>-->
+ <script src="{{ url_for('static', filename='js/searx.head.min.js') }}"
+ data-method="{{ method or 'POST' }}"
+ data-autocompleter="{% if autocomplete %}true{% else %}false{% endif %}"
+ data-search-on-category-select="{{ 'true' if 'plugins/js/search_on_category_select.js' in scripts else 'false'}}"
+ data-infinite-scroll="{{ 'true' if 'plugins/js/infinite_scroll.js' in scripts else 'false' }}"
+ data-static-path="{{ url_for('static', filename='themes/simple') }}/"
+ data-no-item-found="{{ _('No item found') }}"></script>
+ <!--<![endif]-->
{% block head %}
<link title="{{ instance_name }}" type="application/opensearchdescription+xml" rel="search" href="{{ url_for('opensearch') }}"/>
{% endblock %}
<link rel="shortcut icon" href="{{ url_for('static', filename='img/favicon.png') }}" />
- <script type="text/javascript">
- var searx = {
- autocompleter: {% if autocomplete %}true{% else %}false{% endif %},
- method: "{{ method or 'POST' }}",
- touch: (("ontouchstart" in window) || window.DocumentTouch && document instanceof DocumentTouch) || false,
- staticPath: "{{ url_for('static', filename='themes/simple') }}/",
- noItemFound: "{{ _('No item found') }}",
- search_on_category_select: {{ 'true' if 'plugins/js/search_on_category_select.js' in scripts else 'false'}},
- infinite_scroll: {{ 'true' if 'plugins/js/infinite_scroll.js' in scripts else 'false' }}
- };
- document.getElementsByTagName("html")[0].className = (searx.touch)?"js touch":"js";
- </script>
</head>
<body>
<main id="main_{{ self._TemplateReference__context.name|replace("simple/", "")|replace(".html", "") }}">
@@ -60,7 +57,7 @@
</p>
</footer>
<!--[if gte IE 9]>-->
- <script src="{{ url_for('static', filename='js/searx.min.js') }}" ></script>
+ <script src="{{ url_for('static', filename='js/searx.min.js') }}"></script>
<!--<![endif]-->
</body>
</html>
diff --git a/searx/templates/simple/infobox.html b/searx/templates/simple/infobox.html
index d99806ac4..50b568919 100644
--- a/searx/templates/simple/infobox.html
+++ b/searx/templates/simple/infobox.html
@@ -36,6 +36,11 @@
{% for suggestion in topic.suggestions %}
<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}">
<input type="hidden" name="q" value="{{ suggestion }}">
+ <input type="hidden" name="time_range" value="{{ time_range }}">
+ <input type="hidden" name="language" value="{{ current_language }}">
+ <input type="hidden" name="safesearch" value="{{ safesearch }}">
+ <input type="hidden" name="theme" value="{{ theme }}">
+ {% if timeout_limit %}<input type="hidden" name="timeout_limit" value="{{ timeout_limit|e }}" >{% endif %}
<input type="submit" value="{{ suggestion }}" />
</form>
{% endfor %}
diff --git a/searx/templates/simple/result_templates/key-value.html b/searx/templates/simple/result_templates/key-value.html
new file mode 100644
index 000000000..eebaa2c85
--- /dev/null
+++ b/searx/templates/simple/result_templates/key-value.html
@@ -0,0 +1,11 @@
+<table>
+ {% for key, value in result.items() %}
+ {% if key in ['engine', 'engines', 'template', 'score', 'category', 'positions'] %}
+ {% continue %}
+ {% endif %}
+ <tr>
+ <td><b>{{ key|upper }}</b>: {{ value }}</td>
+ </tr>
+ {% endfor %}
+</table>
+<div class="engines">{% for engine in result.engines %}<span>{{ engine }}</span>{% endfor %}</div>{{- '' -}}
diff --git a/searx/templates/simple/result_templates/torrent.html b/searx/templates/simple/result_templates/torrent.html
index 3c7fd15e8..71c775bc9 100644
--- a/searx/templates/simple/result_templates/torrent.html
+++ b/searx/templates/simple/result_templates/torrent.html
@@ -6,7 +6,7 @@
{% if result.magnetlink %}<p class="altlink"> &bull; {{ result_link(result.magnetlink, icon('magnet') + _('magnet link'), "magnetlink") }}</p>{% endif %}
{% if result.torrentfile %}<p class="altlink"> &bull; {{ result_link(result.torrentfile, icon('download-alt') + _('torrent file'), "torrentfile") }}</p>{% endif %}
-{% if result.seed %}<p class="stat"> &bull; {{ icon('arrow-swap') }} {{ _('Seeder') }} <span class="badge">{{ result.seed }}</span> &bull; {{ _('Leecher') }} <span class="badge">{{ result.leech }}</span></p>{% endif %}
+{% if result.seed is defined %}<p class="stat"> &bull; {{ icon('arrow-swap') }} {{ _('Seeder') }} <span class="badge">{{ result.seed }}</span> &bull; {{ _('Leecher') }} <span class="badge">{{ result.leech }}</span></p>{% endif %}
{%- if result.filesize %}<p class="stat">{{ icon('floppy-disk') }} {{ _('Filesize') }}<span class="badge">
{%- if result.filesize < 1024 %}{{ result.filesize }} {{ _('Bytes') }}
diff --git a/searx/templates/simple/results.html b/searx/templates/simple/results.html
index 195c478db..8885abc30 100644
--- a/searx/templates/simple/results.html
+++ b/searx/templates/simple/results.html
@@ -50,11 +50,13 @@
<div class="wrapper">
{% for suggestion in suggestions %}
<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}">
- <input type="hidden" name="q" value="{{ suggestion }}">
+ <input type="hidden" name="q" value="{{ suggestion.url }}">
+ <input type="hidden" name="time_range" value="{{ time_range }}">
<input type="hidden" name="language" value="{{ current_language }}">
<input type="hidden" name="safesearch" value="{{ safesearch }}">
<input type="hidden" name="theme" value="{{ theme }}">
- <input type="submit" class="suggestion" value="&bull; {{ suggestion }}">
+ {% if timeout_limit %}<input type="hidden" name="timeout_limit" value="{{ timeout_limit|e }}" >{% endif %}
+ <input type="submit" class="suggestion" value="&bull; {{ suggestion.title }}">
</form>
{% endfor %}
</div>
@@ -63,7 +65,7 @@
<div id="search_url">
<h4 class="title">{{ _('Search URL') }} :</h4>
- <div class="selectable_url"><pre>{{ base_url }}?q={{ q|urlencode }}&amp;language={{ current_language }}&amp;time_range={{ time_range }}&amp;safesearch={{ safesearch }}{% if pageno > 1 %}&amp;pageno={{ pageno }}{% endif %}{% if selected_categories %}&amp;categories={{ selected_categories|join(",") | replace(' ','+') }}{% endif %}</pre></div>
+ <div class="selectable_url"><pre>{{ base_url }}?q={{ q|urlencode }}&amp;language={{ current_language }}&amp;time_range={{ time_range }}&amp;safesearch={{ safesearch }}{% if pageno > 1 %}&amp;pageno={{ pageno }}{% endif %}{% if selected_categories %}&amp;categories={{ selected_categories|join(",") | replace(' ','+') }}{% endif %}{% if timeout_limit %}&amp;timeout_limit={{ timeout_limit|urlencode }}{% endif %}</pre></div>
</div>
<div id="apis">
<h4 class="title">{{ _('Download results') }}</h4>
@@ -79,6 +81,7 @@
<input type="hidden" name="language" value="{{ current_language }}">
<input type="hidden" name="safesearch" value="{{ safesearch }}">
<input type="hidden" name="format" value="{{ output_type }}">
+ {% if timeout_limit %}<input type="hidden" name="timeout_limit" value="{{ timeout_limit|e }}" >{% endif %}
<input type="submit" value="{{ output_type }}">
</form>
</div>
@@ -92,12 +95,13 @@
{% for correction in corrections %}
<div class="left">
<form method="{{ method or 'POST' }}" action="{{ url_for('index') }}" role="navigation">
- <input type="hidden" name="q" value="{{ correction }}">
+ <input type="hidden" name="q" value="{{ correction.url }}">
<input type="hidden" name="time_range" value="{{ time_range }}">
<input type="hidden" name="language" value="{{ current_language }}">
<input type="hidden" name="safesearch" value="{{ safesearch }}">
<input type="hidden" name="theme" value="{{ theme }}">
- <input type="submit" value="{{ correction }}">
+ {% if timeout_limit %}<input type="hidden" name="timeout_limit" value="{{ timeout_limit }}" >{% endif %}
+ <input type="submit" value="{{ correction.title }}">
</form>
</div>
{% endfor %}
@@ -134,7 +138,8 @@
<input type="hidden" name="language" value="{{ current_language }}" >
<input type="hidden" name="safesearch" value="{{ safesearch }}" >
<input type="hidden" name="theme" value="{{ theme }}" >
- <button type="submit">{{ icon_small('chevron-left') }} {{ _('previous page') }}</button>
+ {% if timeout_limit %}<input type="hidden" name="timeout_limit" value="{{ timeout_limit|e }}" >{% endif %}
+ <button type="submit">{{ icon_small('chevron-left') }} {{ _('previous page') }}</button>
</div>
</form>
{% endif %}
@@ -149,7 +154,8 @@
<input type="hidden" name="language" value="{{ current_language }}" >
<input type="hidden" name="safesearch" value="{{ safesearch }}" >
<input type="hidden" name="theme" value="{{ theme }}" >
- <button type="submit">{{ _('next page') }} {{ icon_small('chevron-right') }}</button>
+ {% if timeout_limit %}<input type="hidden" name="timeout_limit" value="{{ timeout_limit|e }}" >{% endif %}
+ <button type="submit">{{ _('next page') }} {{ icon_small('chevron-right') }}</button>
</div>
</form>
</nav>
diff --git a/searx/templates/simple/search.html b/searx/templates/simple/search.html
index 9c4a99b68..e9023b420 100644
--- a/searx/templates/simple/search.html
+++ b/searx/templates/simple/search.html
@@ -14,4 +14,5 @@
{% include 'simple/categories.html' %}
<input type="hidden" name="safesearch" value="{{ safesearch }}" >
<input type="hidden" name="theme" value="{{ theme }}" >
+ {% if timeout_limit %}<input type="hidden" name="timeout_limit" value="{{ timeout_limit|e }}" >{% endif %}
</form>
diff --git a/searx/testing.py b/searx/testing.py
index 0d17b2a08..a3616dc12 100644
--- a/searx/testing.py
+++ b/searx/testing.py
@@ -6,7 +6,6 @@ import os
import subprocess
import traceback
-
from os.path import dirname, join, abspath
from splinter import Browser
@@ -49,6 +48,7 @@ class SearxRobotLayer():
exe = 'python'
# set robot settings path
+ os.environ['SEARX_DEBUG'] = '1'
os.environ['SEARX_SETTINGS_PATH'] = abspath(
dirname(__file__) + '/settings_robot.yml')
@@ -58,6 +58,8 @@ class SearxRobotLayer():
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT
)
+ if hasattr(self.server.stdout, 'read1'):
+ print(self.server.stdout.read1(1024).decode('utf-8'))
def tearDown(self):
os.kill(self.server.pid, 9)
@@ -69,7 +71,7 @@ class SearxRobotLayer():
def run_robot_tests(tests):
print('Running {0} tests'.format(len(tests)))
for test in tests:
- with Browser() as browser:
+ with Browser('firefox', headless=True) as browser:
test(browser)
@@ -78,6 +80,18 @@ class SearxTestCase(TestCase):
layer = SearxTestLayer
+ def setattr4test(self, obj, attr, value):
+ """
+ setattr(obj, attr, value)
+ but reset to the previous value in the cleanup.
+ """
+ previous_value = getattr(obj, attr)
+
+ def cleanup_patch():
+ setattr(obj, attr, previous_value)
+ self.addCleanup(cleanup_patch)
+ setattr(obj, attr, value)
+
if __name__ == '__main__':
import sys
diff --git a/searx/translations/ar/LC_MESSAGES/messages.mo b/searx/translations/ar/LC_MESSAGES/messages.mo
index 052e5b522..3774e5bef 100644
--- a/searx/translations/ar/LC_MESSAGES/messages.mo
+++ b/searx/translations/ar/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/ar/LC_MESSAGES/messages.po b/searx/translations/ar/LC_MESSAGES/messages.po
index 645ca0ed6..0604ac162 100644
--- a/searx/translations/ar/LC_MESSAGES/messages.po
+++ b/searx/translations/ar/LC_MESSAGES/messages.po
@@ -4,14 +4,15 @@
#
# Translators:
# ButterflyOfFire ButterflyOfFire, 2018
+# ButterflyOfFire, 2018
# ButterflyOfFire, 2017-2018
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-09-08 08:23+0000\n"
-"Last-Translator: ButterflyOfFire ButterflyOfFire\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: Noémi Ványi <sitbackandwait@gmail.com>\n"
"Language-Team: Arabic (http://www.transifex.com/asciimoo/searx/language/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -32,63 +33,63 @@ msgstr ""
msgid "unexpected crash"
msgstr "خلل غير مُتوقّع"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "ملفات"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "الرئيسية"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "موسيقى"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "شبكات التواصل الإجتماعي"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "صور"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "فيديوهات"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "علوم و تكنولوجيا"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "أخبار"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "خرائط"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "علوم"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "إنّ الإعدادات خاطئة، يرجى تعديل خياراتك"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "إعدادات غير صالحة"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "خطأ في البحث"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "قبل {minutes} ثانية"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "قبل {hours} ساعات، {minutes} دقائق"
@@ -108,29 +109,28 @@ msgstr ""
msgid "Compute {functions} of the arguments"
msgstr ""
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "المدة المستغرقة للمحرك (ثواني)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "مدة تحميل الصفحة (ثواني)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "حصيلة نتائج البحث"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr ""
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr ""
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "أخطاء"
@@ -142,8 +142,14 @@ msgstr "{title}&nbsp;(OBSOLETE)"
msgid "This entry has been superseded by"
msgstr ""
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
msgstr ""
#: searx/plugins/https_rewrite.py:32
@@ -158,16 +164,6 @@ msgstr "تمرير الصفحات بلا حدود"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "حمّل تلقائيا الصفحة التالية عن السحب إلى أسفل النتائج"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr ""
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr ""
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -330,8 +326,8 @@ msgstr "الطريقة"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -403,8 +399,8 @@ msgstr "محركات البحث المُستخدَمة حاليًا"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -419,8 +415,8 @@ msgstr "الفئة"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -438,7 +434,7 @@ msgstr "حظر"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -448,7 +444,7 @@ msgstr ""
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -458,7 +454,7 @@ msgstr ""
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -466,14 +462,14 @@ msgstr "حفظ"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "إعاد التعيين إلى الإعدادات الإفتراضية"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -644,23 +640,23 @@ msgid "General"
msgstr "الرئيسية"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "المحركات"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "الإضافات"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "المجيبون"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "كعكات الكوكيز"
@@ -711,88 +707,78 @@ msgstr "إختر الشكل الذي ستبدو عليه هذه السمة"
msgid "Style"
msgstr "الشكل"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr ""
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr ""
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "الإختصار"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "اللغة المختارة"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "الفترة"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "متوسط الوقت"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "أقصى مدّة"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr ""
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "التسمية"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "الكلمات الرمزية"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "الوصف"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "أمثلة"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr ""
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr ""
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "إسم الكوكي"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "القيمة"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr ""
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/bg/LC_MESSAGES/messages.mo b/searx/translations/bg/LC_MESSAGES/messages.mo
index f80e5afcc..0ee7802a8 100644
--- a/searx/translations/bg/LC_MESSAGES/messages.mo
+++ b/searx/translations/bg/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/bg/LC_MESSAGES/messages.po b/searx/translations/bg/LC_MESSAGES/messages.po
index 09a013ed0..63c9938f0 100644
--- a/searx/translations/bg/LC_MESSAGES/messages.po
+++ b/searx/translations/bg/LC_MESSAGES/messages.po
@@ -4,14 +4,15 @@
#
# Translators:
# ubone <van_ds_ff@mail.bg>, 2015
+# ubone <van_ds_ff@mail.bg>, 2015
# ubone <van_ds_ff@mail.bg>, 2016-2017
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2017-11-01 20:31+0000\n"
-"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: Noémi Ványi <sitbackandwait@gmail.com>\n"
"Language-Team: Bulgarian (http://www.transifex.com/asciimoo/searx/language/bg/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -32,63 +33,63 @@ msgstr ""
msgid "unexpected crash"
msgstr ""
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "файлове"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "общо"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "музика"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "социална мрежа"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "изображения"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "видео"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "IT"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "новини"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "карта"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "наука"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Неправилни настройки, моля проверете предпочитанията си."
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr ""
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "грешка при търсенето"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "преди {minutes} минута(минути)"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "преди {hours} час(ове), {minutes} минута(минути)"
@@ -108,29 +109,28 @@ msgstr ""
msgid "Compute {functions} of the arguments"
msgstr ""
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr ""
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Страницата зарежда (сек)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Брой резултати"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr ""
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr ""
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Грешки"
@@ -142,8 +142,14 @@ msgstr ""
msgid "This entry has been superseded by"
msgstr ""
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
msgstr ""
#: searx/plugins/https_rewrite.py:32
@@ -158,16 +164,6 @@ msgstr "Списък без страници."
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Автоматично зареждане на следващата страница."
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr ""
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr ""
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -330,8 +326,8 @@ msgstr "Метод"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -403,8 +399,8 @@ msgstr "Използвани търсачки в момента "
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -419,8 +415,8 @@ msgstr "Категория"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -438,7 +434,7 @@ msgstr "Забрани"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -448,7 +444,7 @@ msgstr "Тези настройки се съхраняват във вашит
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -458,7 +454,7 @@ msgstr "Тези бисквитки служат за ваше удобство.
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -466,14 +462,14 @@ msgstr "запази"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Върни първоначалните"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -644,23 +640,23 @@ msgid "General"
msgstr "Общи"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Търсачки"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Добавки"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Отговори"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Бисквитки"
@@ -711,88 +707,78 @@ msgstr "Избери стил за избрания облик"
msgid "Style"
msgstr "Стил"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr ""
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr ""
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Пряк път"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr ""
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr ""
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Средно време"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Макс. време"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr ""
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Име"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Ключови думи"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Описание"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Примери"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Това е списък на бисквитки с техните стойности, които searx съхранява на вашия компютър."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr ""
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Име на бисквитката"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Стойност"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr ""
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/bo/LC_MESSAGES/messages.mo b/searx/translations/bo/LC_MESSAGES/messages.mo
new file mode 100644
index 000000000..7941328e6
--- /dev/null
+++ b/searx/translations/bo/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/bo/LC_MESSAGES/messages.po b/searx/translations/bo/LC_MESSAGES/messages.po
new file mode 100644
index 000000000..a2eb5cbf9
--- /dev/null
+++ b/searx/translations/bo/LC_MESSAGES/messages.po
@@ -0,0 +1,998 @@
+# Translations template for PROJECT.
+# Copyright (C) 2017 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+#
+# Translators:
+# གངས་རྒྱན། <khyon_khangey@outlook.com>, 2019
+msgid ""
+msgstr ""
+"Project-Id-Version: searx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-10-08 09:02+0000\n"
+"Last-Translator: གངས་རྒྱན། <khyon_khangey@outlook.com>\n"
+"Language-Team: Tibetan (http://www.transifex.com/asciimoo/searx/language/bo/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.3.4\n"
+"Language: bo\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: searx/search.py:137 searx/search.py:182
+msgid "timeout"
+msgstr "དུས་ལས་འགོངས་ཟིན།"
+
+#: searx/search.py:144
+msgid "request exception"
+msgstr "རེ་ཞུ་ཁྱབ་ཁོངས་ལས་འགོངས་ཟིན།"
+
+#: searx/search.py:151
+msgid "unexpected crash"
+msgstr "ནོར་འཁྲུལ་ཆེན་པོ་བྱུང་ཟིན།"
+
+#: searx/webapp.py:135
+msgid "files"
+msgstr "ཡིག་ཆ།"
+
+#: searx/webapp.py:136
+msgid "general"
+msgstr "སྤྱི་བཏང་།"
+
+#: searx/webapp.py:137
+msgid "music"
+msgstr "རོལ་དབྱངས།"
+
+#: searx/webapp.py:138
+msgid "social media"
+msgstr "སྤྱི་ཚོགས་འབྲེལ་བ།"
+
+#: searx/webapp.py:139
+msgid "images"
+msgstr "པར་རིས།"
+
+#: searx/webapp.py:140
+msgid "videos"
+msgstr "བརྙན་ཟློས།"
+
+#: searx/webapp.py:141
+msgid "it"
+msgstr "ཆ་འཕྲིན་ལག་རྩལ།"
+
+#: searx/webapp.py:142
+msgid "news"
+msgstr "གསར་འགྱུར།"
+
+#: searx/webapp.py:143
+msgid "map"
+msgstr "ས་བཀྲ།"
+
+#: searx/webapp.py:144
+msgid "science"
+msgstr "ཚན་རིག་ཤེས་བྱ།"
+
+#: searx/webapp.py:398 searx/webapp.py:653
+msgid "Invalid settings, please edit your preferences"
+msgstr "ནུས་མེད་ཀྱི་སྒྲིག་འགོད།ཁྱེད་ཀྱིས་གདམ་ཀ་ལ་བཅོས་སྒྲིག་གཏོང་རོགས།"
+
+#: searx/webapp.py:410
+msgid "Invalid settings"
+msgstr "ནུས་མེད་ཀྱི་སྒྲིག་འགོད།"
+
+#: searx/webapp.py:444 searx/webapp.py:488
+msgid "search error"
+msgstr "འཚོལ་བཤེར་ལ་ནོར་འཁྲུལ་བྱུང་།"
+
+#: searx/webapp.py:525
+msgid "{minutes} minute(s) ago"
+msgstr "སྐར་མ་ {minutes} སྔོན་ལ།"
+
+#: searx/webapp.py:527
+msgid "{hours} hour(s), {minutes} minute(s) ago"
+msgstr "ཆུ་ཚོད་ {hours} དང་སྐར་མ {minutes} སྔོན་ལ།"
+
+#: searx/answerers/random/answerer.py:53
+msgid "Random value generator"
+msgstr "ངེས་མེད་གྲངས་ཀ་མཁོ་སྤྲོད།"
+
+#: searx/answerers/random/answerer.py:54
+msgid "Generate different random values"
+msgstr "ངེས་མེད་གྲངས་ཀ་ཁ་ཤས་ཐོབ་པར་བྱེད།"
+
+#: searx/answerers/statistics/answerer.py:53
+msgid "Statistics functions"
+msgstr "སྡོམ་བརྩིས་ཀྱི་བྱེད་ནུས།"
+
+#: searx/answerers/statistics/answerer.py:54
+msgid "Compute {functions} of the arguments"
+msgstr " {functions} གཞི་གྲངས་གྲངས་རྩིས།"
+
+#: searx/engines/__init__.py:194
+msgid "Engine time (sec)"
+msgstr "འཚོལ་བཤེར་དུས་ཡུན། (སྐར་ཆ།)"
+
+#: searx/engines/__init__.py:198
+msgid "Page loads (sec)"
+msgstr "ནང་འདྲེན་དུས་ཡུན། (སྐར་ཆ།)"
+
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
+#: searx/templates/simple/results.html:20
+msgid "Number of results"
+msgstr "འཚོལ་འབྲས་ཀྱི་ཁ་གྲངས།"
+
+#: searx/engines/__init__.py:206
+msgid "Scores"
+msgstr "ཐོབ་སྐར།"
+
+#: searx/engines/__init__.py:210
+msgid "Scores per result"
+msgstr "འཚོལ་འབྲས་རེ་རེ་ཡི་ཐོབ་སྐར།"
+
+#: searx/engines/__init__.py:214
+msgid "Errors"
+msgstr "ནོར་འཁྲུལ།"
+
+#: searx/engines/pdbe.py:87
+msgid "{title}&nbsp;(OBSOLETE)"
+msgstr "{title}&nbsp;(དུས་ལས་འགོངས་ཟིན།)"
+
+#: searx/engines/pdbe.py:91
+msgid "This entry has been superseded by"
+msgstr "འཚོལ་བྱང་འདི་གཞན་གྱིས་ཚབ་བྱེད་འདུག"
+
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "DOAI བསྐྱར་འབྲི།"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Avoid paywalls by redirecting to open-access versions of publications when available"
+
+#: searx/plugins/https_rewrite.py:32
+msgid "Rewrite HTTP links to HTTPS if possible"
+msgstr "HTTP དྲ་ངོས་སྦྲེལ་ཐག་རྣམས HTTPS ལ་བསྒྱུར།"
+
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr "མཐའ་མེད་པའི་འཆར་ངོས།"
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr "དྲ་ངོས་མར་འདྲུད་ནས་ཞབས་ལ་སླེབས་དུས་རང་འགུལ་སྒོས་འཕྲོ་མའི་ནང་དོན་འཆར་པར་བྱེད།"
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/simple/preferences.html:149
+msgid "Open result links on new browser tabs"
+msgstr "ཤོག་ངོས་གསར་བ་ཞིག་ནས་དྲ་ངོས་འཆར་པར་བྱེད།"
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr "Results are opened in the same window by default. This plugin overwrites the default behaviour to open links on new tabs/windows. (JavaScript required)"
+
+#: searx/plugins/search_on_category_select.py:18
+msgid "Search on category select"
+msgstr "རིགས་གདམ་གསེས་བཏང་ནས་འཚོལ་བཤེར་གཏོང་།"
+
+#: searx/plugins/search_on_category_select.py:19
+msgid ""
+"Perform search immediately if a category selected. Disable to select "
+"multiple categories. (JavaScript required)"
+msgstr "Perform search immediately if a category selected. Disable to select multiple categories. (JavaScript required)"
+
+#: searx/plugins/self_info.py:20
+msgid ""
+"Displays your IP if the query is \"ip\" and your user agent if the query "
+"contains \"user agent\"."
+msgstr "Displays your IP if the query is \"ip\" and your user agent if the query contains \"user agent\"."
+
+#: searx/plugins/tracker_url_remover.py:26
+msgid "Tracker URL remover"
+msgstr "དྲ་གནས་རྗེས་འདེད་སྤོ་འབུད།"
+
+#: searx/plugins/tracker_url_remover.py:27
+msgid "Remove trackers arguments from the returned URL"
+msgstr "Remove trackers arguments from the returned URL"
+
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr "མགྱོགས་མྱུར་མཐེབ་གཞོང་གི་སྤྱོད་སྟངས།"
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr "Navigate search results with Vim-like hotkeys (JavaScript required). Press \"h\" key on main or result page to get help."
+
+#: searx/templates/courgette/404.html:4 searx/templates/legacy/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+#: searx/templates/simple/404.html:4
+msgid "Page not found"
+msgstr "དྲ་ངོས་རྙེད་རྒྱུ་མ་བྱུང་།"
+
+#: searx/templates/courgette/404.html:6 searx/templates/legacy/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#: searx/templates/simple/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr "%(search_page)s ལ་བསྐྱོད།"
+
+#: searx/templates/courgette/404.html:6 searx/templates/legacy/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#: searx/templates/simple/404.html:6
+msgid "search page"
+msgstr "འཚོལ་བཤེར་དྲ་ངོས།"
+
+#: searx/templates/courgette/index.html:9
+#: searx/templates/courgette/index.html:13
+#: searx/templates/courgette/results.html:5
+#: searx/templates/legacy/index.html:8 searx/templates/legacy/index.html:12
+#: searx/templates/oscar/navbar.html:7
+#: searx/templates/oscar/preferences.html:3
+#: searx/templates/pix-art/index.html:8
+msgid "preferences"
+msgstr "རང་མོས་ཀྱི་སྒྲིག་འགོད།"
+
+#: searx/templates/courgette/index.html:11
+#: searx/templates/legacy/index.html:10 searx/templates/oscar/about.html:2
+#: searx/templates/oscar/navbar.html:6 searx/templates/pix-art/index.html:7
+msgid "about"
+msgstr "ངེད་ཀྱི་སྐོར།"
+
+#: searx/templates/courgette/preferences.html:5
+#: searx/templates/legacy/preferences.html:5
+#: searx/templates/oscar/preferences.html:8
+#: searx/templates/pix-art/preferences.html:5
+#: searx/templates/simple/preferences.html:26
+msgid "Preferences"
+msgstr "རང་མོས་ཀྱི་སྒྲིག་འགོད།"
+
+#: searx/templates/courgette/preferences.html:9
+#: searx/templates/legacy/preferences.html:9
+#: searx/templates/oscar/preferences.html:33
+#: searx/templates/oscar/preferences.html:35
+#: searx/templates/simple/preferences.html:34
+msgid "Default categories"
+msgstr "གཞི་བཞག་གི་རིགས།"
+
+#: searx/templates/courgette/preferences.html:13
+#: searx/templates/legacy/preferences.html:14
+#: searx/templates/oscar/preferences.html:41
+#: searx/templates/pix-art/preferences.html:9
+#: searx/templates/simple/preferences.html:39
+#: searx/templates/simple/preferences.html:163
+msgid "Search language"
+msgstr "འཚོལ་བཤེར་སྐད་རིགས།"
+
+#: searx/templates/courgette/preferences.html:16
+#: searx/templates/legacy/preferences.html:17
+#: searx/templates/oscar/languages.html:6
+#: searx/templates/pix-art/preferences.html:12
+#: searx/templates/simple/languages.html:2
+#: searx/templates/simple/preferences.html:42
+msgid "Default language"
+msgstr "སྐད་རིགས།"
+
+#: searx/templates/courgette/preferences.html:24
+#: searx/templates/legacy/preferences.html:25
+#: searx/templates/oscar/preferences.html:47
+#: searx/templates/pix-art/preferences.html:20
+#: searx/templates/simple/preferences.html:120
+msgid "Interface language"
+msgstr "མདུན་ངོས་ཀྱི་སྐད་རིགས།"
+
+#: searx/templates/courgette/preferences.html:34
+#: searx/templates/legacy/preferences.html:35
+#: searx/templates/oscar/preferences.html:57
+#: searx/templates/simple/preferences.html:51
+msgid "Autocomplete"
+msgstr "རང་ཤུགས་ཀྱིས་སྒྲུབ།"
+
+#: searx/templates/courgette/preferences.html:45
+#: searx/templates/legacy/preferences.html:46
+#: searx/templates/oscar/preferences.html:68
+#: searx/templates/simple/preferences.html:166
+msgid "Image proxy"
+msgstr "རི་མོ་མངག་བཅོལ་གྱི་ཞབས་ཞུ་སྒྲིག་ཆས།"
+
+#: searx/templates/courgette/preferences.html:48
+#: searx/templates/legacy/preferences.html:49
+#: searx/templates/oscar/preferences.html:72
+#: searx/templates/simple/preferences.html:169
+msgid "Enabled"
+msgstr "ཁ་འབྱེད་ཟིན།"
+
+#: searx/templates/courgette/preferences.html:49
+#: searx/templates/legacy/preferences.html:50
+#: searx/templates/oscar/preferences.html:73
+#: searx/templates/simple/preferences.html:170
+msgid "Disabled"
+msgstr "ཁ་རྒྱབ་ཟིན།"
+
+#: searx/templates/courgette/preferences.html:54
+#: searx/templates/legacy/preferences.html:55
+#: searx/templates/oscar/preferences.html:77
+#: searx/templates/pix-art/preferences.html:30
+#: searx/templates/simple/preferences.html:156
+msgid "Method"
+msgstr "ཐབས་ཤེས།"
+
+#: searx/templates/courgette/preferences.html:63
+#: searx/templates/legacy/preferences.html:64
+#: searx/templates/oscar/preferences.html:86
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/simple/preferences.html:63
+#: searx/templates/simple/preferences.html:90
+msgid "SafeSearch"
+msgstr "བདེ་འཇགས་འཚོལ་བཤེར།"
+
+#: searx/templates/courgette/preferences.html:66
+#: searx/templates/legacy/preferences.html:67
+#: searx/templates/oscar/preferences.html:90
+#: searx/templates/simple/preferences.html:66
+msgid "Strict"
+msgstr "ནན་ཏན།"
+
+#: searx/templates/courgette/preferences.html:67
+#: searx/templates/legacy/preferences.html:68
+#: searx/templates/oscar/preferences.html:91
+#: searx/templates/simple/preferences.html:67
+msgid "Moderate"
+msgstr "འབྲིང་ཙམ།"
+
+#: searx/templates/courgette/preferences.html:68
+#: searx/templates/legacy/preferences.html:69
+#: searx/templates/oscar/preferences.html:92
+#: searx/templates/simple/preferences.html:68
+msgid "None"
+msgstr "གང་ཡང་མེད།"
+
+#: searx/templates/courgette/preferences.html:73
+#: searx/templates/legacy/preferences.html:74
+#: searx/templates/oscar/preferences.html:96
+#: searx/templates/pix-art/preferences.html:39
+#: searx/templates/simple/preferences.html:131
+msgid "Themes"
+msgstr "རྣམ་པ།"
+
+#: searx/templates/courgette/preferences.html:83
+msgid "Color"
+msgstr "ཁ་དོག"
+
+#: searx/templates/courgette/preferences.html:86
+msgid "Blue (default)"
+msgstr "སྔོན་པོ། (གཞི་བཞག)"
+
+#: searx/templates/courgette/preferences.html:87
+msgid "Violet"
+msgstr "དམར་སྨུག"
+
+#: searx/templates/courgette/preferences.html:88
+msgid "Green"
+msgstr "ལྗང་ཁུ།"
+
+#: searx/templates/courgette/preferences.html:89
+msgid "Cyan"
+msgstr "སྔོ་སྐྱ།"
+
+#: searx/templates/courgette/preferences.html:90
+msgid "Orange"
+msgstr "ལི་ཁྲི།"
+
+#: searx/templates/courgette/preferences.html:91
+msgid "Red"
+msgstr "དམར་པོ།"
+
+#: searx/templates/courgette/preferences.html:96
+#: searx/templates/legacy/preferences.html:93
+#: searx/templates/pix-art/preferences.html:49
+#: searx/templates/simple/preferences.html:77
+msgid "Currently used search engines"
+msgstr "ཉེ་ལམ་སྤྱད་ཟིན་པའི་འཚོལ་བྱེད་སྒུལ་བྱེད།"
+
+#: searx/templates/courgette/preferences.html:100
+#: searx/templates/legacy/preferences.html:97
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
+#: searx/templates/pix-art/preferences.html:53
+#: searx/templates/simple/preferences.html:87
+msgid "Engine name"
+msgstr "སྒུལ་བྱེད་ཀྱི་མིང་།"
+
+#: searx/templates/courgette/preferences.html:101
+#: searx/templates/legacy/preferences.html:98
+msgid "Category"
+msgstr "རིགས།"
+
+#: searx/templates/courgette/preferences.html:102
+#: searx/templates/courgette/preferences.html:113
+#: searx/templates/legacy/preferences.html:99
+#: searx/templates/legacy/preferences.html:110
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
+#: searx/templates/pix-art/preferences.html:54
+#: searx/templates/pix-art/preferences.html:64
+#: searx/templates/simple/preferences.html:86
+msgid "Allow"
+msgstr "ཆོག་མཆན།"
+
+#: searx/templates/courgette/preferences.html:102
+#: searx/templates/courgette/preferences.html:114
+#: searx/templates/legacy/preferences.html:99
+#: searx/templates/legacy/preferences.html:111
+#: searx/templates/pix-art/preferences.html:54
+#: searx/templates/pix-art/preferences.html:65
+msgid "Block"
+msgstr "བཀག་སྡོམ།"
+
+#: searx/templates/courgette/preferences.html:122
+#: searx/templates/legacy/preferences.html:119
+#: searx/templates/oscar/preferences.html:285
+#: searx/templates/pix-art/preferences.html:73
+#: searx/templates/simple/preferences.html:180
+msgid ""
+"These settings are stored in your cookies, this allows us not to store this "
+"data about you."
+msgstr "These settings are stored in your cookies, this allows us not to store this data about you."
+
+#: searx/templates/courgette/preferences.html:124
+#: searx/templates/legacy/preferences.html:121
+#: searx/templates/oscar/preferences.html:287
+#: searx/templates/pix-art/preferences.html:75
+#: searx/templates/simple/preferences.html:182
+msgid ""
+"These cookies serve your sole convenience, we don't use these cookies to "
+"track you."
+msgstr "These cookies serve your sole convenience, we don't use these cookies to track you."
+
+#: searx/templates/courgette/preferences.html:127
+#: searx/templates/legacy/preferences.html:124
+#: searx/templates/oscar/preferences.html:293
+#: searx/templates/pix-art/preferences.html:78
+#: searx/templates/simple/preferences.html:185
+msgid "save"
+msgstr "གསོག་འཇོག"
+
+#: searx/templates/courgette/preferences.html:128
+#: searx/templates/legacy/preferences.html:125
+#: searx/templates/oscar/preferences.html:295
+#: searx/templates/simple/preferences.html:186
+msgid "Reset defaults"
+msgstr "གདོད་མའི་རྣམ་པ་ལ་སྒྲིག་འགོད་བྱེད།"
+
+#: searx/templates/courgette/preferences.html:129
+#: searx/templates/legacy/preferences.html:126
+#: searx/templates/oscar/preferences.html:294
+#: searx/templates/pix-art/preferences.html:79
+#: searx/templates/simple/preferences.html:187
+msgid "back"
+msgstr "ཕྱིར་ལོག"
+
+#: searx/templates/courgette/results.html:12
+#: searx/templates/legacy/results.html:13
+#: searx/templates/oscar/results.html:136
+#: searx/templates/simple/results.html:58
+msgid "Search URL"
+msgstr "འཚོལ་བཤེར་དྲ་གནས།"
+
+#: searx/templates/courgette/results.html:16
+#: searx/templates/legacy/results.html:17
+#: searx/templates/oscar/results.html:141
+#: searx/templates/simple/results.html:62
+msgid "Download results"
+msgstr "འཚོལ་འབྲས་ཕབ་ལེན།"
+
+#: searx/templates/courgette/results.html:34
+#: searx/templates/legacy/results.html:35
+#: searx/templates/simple/results.html:10
+msgid "Answers"
+msgstr "ལན།"
+
+#: searx/templates/courgette/results.html:42
+#: searx/templates/legacy/results.html:43
+#: searx/templates/oscar/results.html:116
+#: searx/templates/simple/results.html:42
+msgid "Suggestions"
+msgstr "འོས་སྦྱོས།"
+
+#: searx/templates/courgette/results.html:70
+#: searx/templates/legacy/results.html:81
+#: searx/templates/oscar/results.html:68 searx/templates/oscar/results.html:78
+#: searx/templates/simple/results.html:130
+msgid "previous page"
+msgstr "དྲ་ངོས་སྔོན་མ།"
+
+#: searx/templates/courgette/results.html:81
+#: searx/templates/legacy/results.html:92
+#: searx/templates/oscar/results.html:62 searx/templates/oscar/results.html:84
+#: searx/templates/simple/results.html:145
+msgid "next page"
+msgstr "དྲ་ངོས་གཞུག་མ།"
+
+#: searx/templates/courgette/search.html:3
+#: searx/templates/legacy/search.html:3 searx/templates/oscar/search.html:6
+#: searx/templates/oscar/search_full.html:9
+#: searx/templates/pix-art/search.html:3 searx/templates/simple/search.html:4
+msgid "Search for..."
+msgstr "འཚོལ་བཤེར་ནང་དོན།"
+
+#: searx/templates/courgette/stats.html:4 searx/templates/legacy/stats.html:4
+#: searx/templates/oscar/stats.html:5 searx/templates/pix-art/stats.html:4
+#: searx/templates/simple/stats.html:7
+msgid "Engine stats"
+msgstr "སྒུལ་བྱེད་ཀྱི་སྡོམ་རྩིས།"
+
+#: searx/templates/courgette/result_templates/images.html:4
+#: searx/templates/legacy/result_templates/images.html:4
+#: searx/templates/pix-art/result_templates/images.html:4
+msgid "original context"
+msgstr "གདོད་མའི་ནང་དོན།"
+
+#: searx/templates/courgette/result_templates/torrent.html:7
+#: searx/templates/legacy/result_templates/torrent.html:11
+#: searx/templates/oscar/result_templates/torrent.html:6
+#: searx/templates/simple/result_templates/torrent.html:9
+msgid "Seeder"
+msgstr "མཁོ་སྤྲོད་གཏོང་མཁན།"
+
+#: searx/templates/courgette/result_templates/torrent.html:7
+#: searx/templates/legacy/result_templates/torrent.html:11
+#: searx/templates/oscar/result_templates/torrent.html:6
+#: searx/templates/simple/result_templates/torrent.html:9
+msgid "Leecher"
+msgstr "དང་ལེན་བྱེད་མཁན།"
+
+#: searx/templates/courgette/result_templates/torrent.html:9
+#: searx/templates/legacy/result_templates/torrent.html:9
+#: searx/templates/oscar/macros.html:23
+#: searx/templates/simple/result_templates/torrent.html:6
+msgid "magnet link"
+msgstr "ཐོན་ཁུངས་ཀྱི་དྲ་གནས།"
+
+#: searx/templates/courgette/result_templates/torrent.html:10
+#: searx/templates/legacy/result_templates/torrent.html:10
+#: searx/templates/oscar/macros.html:24
+#: searx/templates/simple/result_templates/torrent.html:7
+msgid "torrent file"
+msgstr "ས་བོན་ཡིག་ཆ།"
+
+#: searx/templates/legacy/categories.html:8
+#: searx/templates/simple/categories.html:6
+msgid "Click on the magnifier to perform search"
+msgstr "ས་བོན་སྟེང་གི་སྦྲེལ་ཐག་ལ་རྡེབ་ནས་འཚོལ་བཤེར་གཏོང་།"
+
+#: searx/templates/legacy/preferences.html:84
+#: searx/templates/oscar/preferences.html:113
+#: searx/templates/simple/preferences.html:142
+msgid "Results on new tabs"
+msgstr "ཤོག་ངོས་གསར་བ་ནས་འཚོལ་འབྲས་འཆར།"
+
+#: searx/templates/legacy/preferences.html:87
+#: searx/templates/oscar/preferences.html:117
+#: searx/templates/simple/preferences.html:145
+msgid "On"
+msgstr "ཁ་ཕྱེས།"
+
+#: searx/templates/legacy/preferences.html:88
+#: searx/templates/oscar/preferences.html:118
+#: searx/templates/simple/preferences.html:146
+msgid "Off"
+msgstr "ཁ་རྒྱབ།"
+
+#: searx/templates/legacy/result_templates/code.html:3
+#: searx/templates/legacy/result_templates/default.html:3
+#: searx/templates/legacy/result_templates/map.html:9
+#: searx/templates/oscar/macros.html:34 searx/templates/oscar/macros.html:48
+#: searx/templates/simple/macros.html:43
+msgid "cached"
+msgstr "འདྲ་བཤུས་རྒྱབ་ཚར།"
+
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr "མཐོ་རིམ་སྒྲིག་འགོད།"
+
+#: searx/templates/oscar/base.html:62
+#: searx/templates/oscar/messages/first_time.html:4
+#: searx/templates/oscar/messages/save_settings_successfull.html:5
+#: searx/templates/oscar/messages/unknow_error.html:5
+msgid "Close"
+msgstr "ཁ་རྒྱག"
+
+#: searx/templates/oscar/base.html:64
+#: searx/templates/oscar/messages/no_results.html:4
+#: searx/templates/simple/messages/no_results.html:4
+#: searx/templates/simple/results.html:25
+msgid "Error!"
+msgstr "ནོར་འཁྲུལ་བྱུང་ཟིན།"
+
+#: searx/templates/oscar/base.html:90 searx/templates/simple/base.html:55
+msgid "Powered by"
+msgstr "བཟོ་སྐུན་པ་ནི"
+
+#: searx/templates/oscar/base.html:90 searx/templates/simple/base.html:55
+msgid "a privacy-respecting, hackable metasearch engine"
+msgstr "མི་སྒེར་ཆ་འཕྲིན་ལ་བརྩི་གསོག་ལྡན་ཞིང་འཚོལ་བྱེད་ནང་དོན་ཕུན་སུམ་པའི་འཚོལ་བཤེར་སྒུལ་བྱེད་མ་ལག"
+
+#: searx/templates/oscar/macros.html:36 searx/templates/oscar/macros.html:50
+#: searx/templates/simple/macros.html:43
+msgid "proxied"
+msgstr "མངག་བཅོལ་བྱེད་ཟིན།"
+
+#: searx/templates/oscar/macros.html:92
+msgid "supported"
+msgstr "རྒྱབ་སྐྱོར་ཐོབ་ཟིན་པ།"
+
+#: searx/templates/oscar/macros.html:96
+msgid "not supported"
+msgstr "རྒྱབ་སྐྱོར་མི་ཐོབ།"
+
+#: searx/templates/oscar/preferences.html:13
+#: searx/templates/oscar/preferences.html:22
+#: searx/templates/simple/preferences.html:32
+msgid "General"
+msgstr "སྤྱི་བཏང་།"
+
+#: searx/templates/oscar/preferences.html:14
+#: searx/templates/oscar/preferences.html:134
+#: searx/templates/simple/preferences.html:76
+msgid "Engines"
+msgstr "སྒུལ་བྱེད།"
+
+#: searx/templates/oscar/preferences.html:15
+#: searx/templates/oscar/preferences.html:207
+msgid "Plugins"
+msgstr "ལྷུ་ལག"
+
+#: searx/templates/oscar/preferences.html:16
+#: searx/templates/oscar/preferences.html:233
+msgid "Answerers"
+msgstr "ལན།"
+
+#: searx/templates/oscar/preferences.html:17
+#: searx/templates/oscar/preferences.html:260
+msgid "Cookies"
+msgstr "རྐང་རྗེས།"
+
+#: searx/templates/oscar/preferences.html:42
+#: searx/templates/simple/preferences.html:48
+msgid "What language do you prefer for search?"
+msgstr "ཁྱེད་ཀྱིས་ཆེས་སྤྱོད་བདེ་པའི་འཚོལ་བཤེར་སྐད་རིགས་གང་ཡིན་ནམ།"
+
+#: searx/templates/oscar/preferences.html:48
+#: searx/templates/simple/preferences.html:128
+msgid "Change the language of the layout"
+msgstr "སྐད་རིགས་གདམ་གསེས་ཀྱི་དྲ་ངོས་བརྗེ་བསྒྱུར།"
+
+#: searx/templates/oscar/preferences.html:58
+#: searx/templates/simple/preferences.html:60
+msgid "Find stuff as you type"
+msgstr "འཚོལ་བྱ་གཏགས་པ་ཇི་བཞིན་བཙལ།"
+
+#: searx/templates/oscar/preferences.html:69
+#: searx/templates/simple/preferences.html:173
+msgid "Proxying image results through searx"
+msgstr "རི་མོ searx བརྒྱུད་ནས་མངག་བཅོལ་བྱས་ཟིན།"
+
+#: searx/templates/oscar/preferences.html:78
+msgid ""
+"Change how forms are submited, <a "
+"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
+" rel=\"external\">learn more about request methods</a>"
+msgstr "Change how forms are submited, <a href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\" rel=\"external\">learn more about request methods</a>"
+
+#: searx/templates/oscar/preferences.html:87
+#: searx/templates/simple/preferences.html:71
+msgid "Filter content"
+msgstr "ནང་དོན་བཙག་བྱེད།"
+
+#: searx/templates/oscar/preferences.html:97
+#: searx/templates/simple/preferences.html:139
+msgid "Change searx layout"
+msgstr "དྲ་ངོས་ཀྱི་རྣམ་པ་བརྗེ་བསྒྱུར།"
+
+#: searx/templates/oscar/preferences.html:106
+#: searx/templates/oscar/preferences.html:111
+msgid "Choose style for this theme"
+msgstr "དྲ་ངོས་རྣམ་པ་འདི་ལ་སྒྲིག་འགོད་གཏོང་།"
+
+#: searx/templates/oscar/preferences.html:106
+#: searx/templates/oscar/preferences.html:111
+msgid "Style"
+msgstr "ཚུགས་ཀ"
+
+#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:163
+#: searx/templates/simple/preferences.html:88
+msgid "Shortcut"
+msgstr "མགྱོགས་མྱུར་མཐེབ་གཞོང་།"
+
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
+msgid "Selected language"
+msgstr "སྐད་རིགས་གདམ་གསེས།"
+
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/simple/preferences.html:91
+msgid "Time range"
+msgstr "དུས་ཀྱི་ཁྱབ་ཁོངས།"
+
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/simple/preferences.html:92
+msgid "Avg. time"
+msgstr "ས་སྙོམས་དུས་ཚོད།"
+
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/simple/preferences.html:93
+msgid "Max time"
+msgstr "མང་མཐའི་དུས་ཚོད།"
+
+#: searx/templates/oscar/preferences.html:236
+msgid "This is the list of searx's instant answering modules."
+msgstr "This is the list of searx's instant answering modules."
+
+#: searx/templates/oscar/preferences.html:240
+msgid "Name"
+msgstr "མིང་།"
+
+#: searx/templates/oscar/preferences.html:241
+msgid "Keywords"
+msgstr "ཐ་སྙད་གཙོ་བོ།"
+
+#: searx/templates/oscar/preferences.html:242
+msgid "Description"
+msgstr "འབྲེལ་ཡོད་ངོ་སྤྲོད།"
+
+#: searx/templates/oscar/preferences.html:243
+msgid "Examples"
+msgstr "དཔེ་བརྗོད།"
+
+#: searx/templates/oscar/preferences.html:263
+msgid ""
+"This is the list of cookies and their values searx is storing on your "
+"computer."
+msgstr "འདི་ནི searx ཡི་བརྡ་སྤྲོད་ལན་སློག་གི་གསལ་ཐོ་ཞིག་ཡིན།"
+
+#: searx/templates/oscar/preferences.html:264
+msgid "With that list, you can assess searx transparency."
+msgstr "གསལ་ཐོ་འདི་བརྒྱུད་ནས། ཁྱེད་ཀྱིས searx དྲ་ཚིགས་ཀྱི་བདེན་པ་རང་བཞིན་ལ་མཉམ་ཚོར་ལེན་ཐུབ།"
+
+#: searx/templates/oscar/preferences.html:269
+msgid "Cookie name"
+msgstr "རྗེས་འདེད་ཀྱི་ཡིག་ཆའི་མིང་།"
+
+#: searx/templates/oscar/preferences.html:270
+msgid "Value"
+msgstr "ཚད་གཞི།"
+
+#: searx/templates/oscar/preferences.html:289
+msgid "Search URL of the currently saved preferences"
+msgstr "ཉེ་ལམ་རང་མོས་སྒྲིག་འགོད་ཁྲོད་དུ་གསོག་འཇོག་བྱས་ཟིན་པའི་དྲ་གནས་འཚོལ་བཤེར།"
+
+#: searx/templates/oscar/preferences.html:289
+msgid ""
+"Note: specifying custom settings in the search URL can reduce privacy by "
+"leaking data to the clicked result sites."
+msgstr "Note: specifying custom settings in the search URL can reduce privacy by leaking data to the clicked result sites."
+
+#: searx/templates/oscar/results.html:17
+msgid "Search results"
+msgstr "འཚོལ་འབྲས།"
+
+#: searx/templates/oscar/results.html:21
+#: searx/templates/simple/results.html:84
+msgid "Try searching for:"
+msgstr "འཚོལ་བཤེར་ནང་དོན་ནི།"
+
+#: searx/templates/oscar/results.html:100
+#: searx/templates/simple/results.html:25
+msgid "Engines cannot retrieve results"
+msgstr "འཚོལ་བཤེར་སྒུལ་བྱེད་ལ་ནོར་འཁྲུལ་ཅུང་ཟད་བྱུང་།"
+
+#: searx/templates/oscar/results.html:131
+msgid "Links"
+msgstr "སྦྲེལ་ཐག"
+
+#: searx/templates/oscar/search.html:8
+#: searx/templates/oscar/search_full.html:11
+#: searx/templates/simple/search.html:5
+msgid "Start search"
+msgstr "འཚོལ་བཤེར་མགོ་རྩོམ།"
+
+#: searx/templates/oscar/stats.html:2
+msgid "stats"
+msgstr "སྡོམ་རྩིས།"
+
+#: searx/templates/oscar/time-range.html:3
+#: searx/templates/simple/time-range.html:3
+msgid "Anytime"
+msgstr "དུས་ངེས་མེད།"
+
+#: searx/templates/oscar/time-range.html:6
+#: searx/templates/simple/time-range.html:6
+msgid "Last day"
+msgstr "ཉིན་སྔོན་མ།"
+
+#: searx/templates/oscar/time-range.html:9
+#: searx/templates/simple/time-range.html:9
+msgid "Last week"
+msgstr "གཟའ་སྔོན་མ།"
+
+#: searx/templates/oscar/time-range.html:12
+#: searx/templates/simple/time-range.html:12
+msgid "Last month"
+msgstr "ཟླ་བ་སྔོན་མ།"
+
+#: searx/templates/oscar/time-range.html:15
+#: searx/templates/simple/time-range.html:15
+msgid "Last year"
+msgstr "ལོ་སྔོན་མ།"
+
+#: searx/templates/oscar/messages/first_time.html:6
+#: searx/templates/oscar/messages/no_data_available.html:3
+msgid "Heads up!"
+msgstr "མཉམ་འཇོག་བྱེད།"
+
+#: searx/templates/oscar/messages/first_time.html:7
+msgid "It look like you are using searx first time."
+msgstr "བལྟས་སོང་ན་ཁྱེད་ཀྱིས་ཐེངས་དང་པོ་ངེད་དྲ་བ་སྤྱོད་བཞིན་པ་རེད།"
+
+#: searx/templates/oscar/messages/no_cookies.html:3
+msgid "Information!"
+msgstr "ཆ་འཕྲིན།"
+
+#: searx/templates/oscar/messages/no_cookies.html:4
+msgid "currently, there are no cookies defined."
+msgstr "ཉེ་བར་དྲ་ངོས་རྗེས་འདེད་གང་ཡང་མེད།"
+
+#: searx/templates/oscar/messages/no_data_available.html:4
+msgid "There is currently no data available. "
+msgstr "ཉེ་བར་ཐོབ་རུང་བའི་ཡིག་ཆ་གང་ཡང་མེད།"
+
+#: searx/templates/oscar/messages/no_results.html:4
+#: searx/templates/simple/messages/no_results.html:4
+msgid "Engines cannot retrieve results."
+msgstr "འཙོལ་བཤེར་གཏོང་མི་ནུས། དགོངས་དག"
+
+#: searx/templates/oscar/messages/no_results.html:10
+#: searx/templates/simple/messages/no_results.html:10
+msgid "Please, try again later or find another searx instance."
+msgstr "ཏོག་ཙམ་འགོར་རྗེས་ཡང་བསྐྱར་ཚར་ལྟ་བྱོས།"
+
+#: searx/templates/oscar/messages/no_results.html:14
+#: searx/templates/simple/messages/no_results.html:14
+msgid "Sorry!"
+msgstr "དགོངས་དག"
+
+#: searx/templates/oscar/messages/no_results.html:15
+#: searx/templates/simple/messages/no_results.html:15
+msgid ""
+"we didn't find any results. Please use another query or search in more "
+"categories."
+msgstr "འཚོལ་འབྲས་གང་ཡང་མ་ཐོབ། ཁྱེད་ཀྱིས་འཚོལ་བཤེར་ཐ་སྙད་གཞན་པ་ནས་ཚོད་ལྟ་བྱེད་རོགས།"
+
+#: searx/templates/oscar/messages/save_settings_successfull.html:7
+msgid "Well done!"
+msgstr "ཡག་བྱུང་།"
+
+#: searx/templates/oscar/messages/save_settings_successfull.html:8
+msgid "Settings saved successfully."
+msgstr "སྒྲིག་འགོད་བདེ་ལེགས་ངང་གསོག་འཇོག་བྱས་ཟིན།"
+
+#: searx/templates/oscar/messages/unknow_error.html:7
+msgid "Oh snap!"
+msgstr "ཨ། བྱ་འདི།"
+
+#: searx/templates/oscar/messages/unknow_error.html:8
+msgid "Something went wrong."
+msgstr "ནོར་འཁྲུལ་ཆ་གེ་མོ་ཞིག་བྱུང་ཟིན།"
+
+#: searx/templates/oscar/result_templates/default.html:7
+#: searx/templates/simple/result_templates/default.html:6
+msgid "show media"
+msgstr "སྨྱན་གཟུགས་འཆར་པར་བྱེད།"
+
+#: searx/templates/oscar/result_templates/default.html:7
+#: searx/templates/simple/result_templates/default.html:6
+msgid "hide media"
+msgstr "སྨྱན་གཟུགས་སྦས་པར་བྱེད།"
+
+#: searx/templates/oscar/result_templates/images.html:30
+msgid "Get image"
+msgstr "པར་རིས་ཕབ་ལེན།"
+
+#: searx/templates/oscar/result_templates/images.html:33
+msgid "View source"
+msgstr "ཡོངས་ཁུངས་ལ་ལྟ།"
+
+#: searx/templates/oscar/result_templates/map.html:7
+#: searx/templates/simple/result_templates/map.html:7
+msgid "show map"
+msgstr "ས་བཀྲ་འཆར།"
+
+#: searx/templates/oscar/result_templates/map.html:7
+#: searx/templates/simple/result_templates/map.html:7
+msgid "hide map"
+msgstr "ས་བཀྲ་སྦས།"
+
+#: searx/templates/oscar/result_templates/map.html:11
+#: searx/templates/simple/result_templates/map.html:11
+msgid "show details"
+msgstr "ངོ་སྤྲོད་འཆར།"
+
+#: searx/templates/oscar/result_templates/map.html:11
+#: searx/templates/simple/result_templates/map.html:11
+msgid "hide details"
+msgstr "ངོ་སྤྲོད་སྦས།"
+
+#: searx/templates/oscar/result_templates/torrent.html:7
+#: searx/templates/simple/result_templates/torrent.html:11
+msgid "Filesize"
+msgstr "ཡིག་ཆའི་ཆེ་ཆུང་།"
+
+#: searx/templates/oscar/result_templates/torrent.html:9
+#: searx/templates/simple/result_templates/torrent.html:12
+msgid "Bytes"
+msgstr "གྲངས་གནས།"
+
+#: searx/templates/oscar/result_templates/torrent.html:10
+#: searx/templates/simple/result_templates/torrent.html:13
+msgid "kiB"
+msgstr "kB"
+
+#: searx/templates/oscar/result_templates/torrent.html:11
+#: searx/templates/simple/result_templates/torrent.html:14
+msgid "MiB"
+msgstr "MB"
+
+#: searx/templates/oscar/result_templates/torrent.html:12
+#: searx/templates/simple/result_templates/torrent.html:15
+msgid "GiB"
+msgstr "GB"
+
+#: searx/templates/oscar/result_templates/torrent.html:13
+#: searx/templates/simple/result_templates/torrent.html:16
+msgid "TiB"
+msgstr "TB"
+
+#: searx/templates/oscar/result_templates/torrent.html:15
+#: searx/templates/simple/result_templates/torrent.html:20
+msgid "Number of Files"
+msgstr "ཡིག་ཆའི་ཁ་གྲངས།"
+
+#: searx/templates/oscar/result_templates/videos.html:7
+#: searx/templates/simple/result_templates/videos.html:6
+msgid "show video"
+msgstr "བརྙན་ཟློས་འཆར།"
+
+#: searx/templates/oscar/result_templates/videos.html:7
+#: searx/templates/simple/result_templates/videos.html:6
+msgid "hide video"
+msgstr "རྙན་ཟློས་སྦས།"
+
+#: searx/templates/pix-art/results.html:28
+msgid "Load more..."
+msgstr "གང་བྱུང་དྲ་ཚིགས་འཆར་པར་བྱེད།"
+
+#: searx/templates/simple/base.html:31
+msgid "No item found"
+msgstr "རྣམ་གྲངས་གང་ཡང་རྙེད་རྒྱུ་མ་བྱུང་།"
+
+#: searx/templates/simple/preferences.html:89
+msgid "Supports selected language"
+msgstr "རྒྱབ་སྐྱོར་ཐོབ་པའི་སྐད་རིགས་གདམ་གསེས།"
+
+#: searx/templates/simple/preferences.html:118
+msgid "User interface"
+msgstr "མདུན་ངོས།"
+
+#: searx/templates/simple/preferences.html:154
+msgid "Privacy"
+msgstr "མི་སྒེར་གསང་དོན།"
diff --git a/searx/translations/ca/LC_MESSAGES/messages.mo b/searx/translations/ca/LC_MESSAGES/messages.mo
index 2ec3e0503..43b3d6d47 100644
--- a/searx/translations/ca/LC_MESSAGES/messages.mo
+++ b/searx/translations/ca/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/ca/LC_MESSAGES/messages.po b/searx/translations/ca/LC_MESSAGES/messages.po
index 460091cd7..44d466654 100644
--- a/searx/translations/ca/LC_MESSAGES/messages.po
+++ b/searx/translations/ca/LC_MESSAGES/messages.po
@@ -4,14 +4,15 @@
#
# Translators:
# Calbasi <joan@calbasi.net>, 2018
+# Ecron <ecron_89@hotmail.com>, 2019
# jmontane, 2018
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-12-15 15:10+0000\n"
-"Last-Translator: jmontane\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-10-17 13:46+0000\n"
+"Last-Translator: Ecron <ecron_89@hotmail.com>\n"
"Language-Team: Catalan (http://www.transifex.com/asciimoo/searx/language/ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -32,63 +33,63 @@ msgstr "Excepció en la petició"
msgid "unexpected crash"
msgstr "Fallada no esperada"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "fitxers"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "general"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "música"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "xarxes socials"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "imatges"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "vídeos"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "informàtica"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "notícies"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "mapa"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "ciència"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "La configuració no és vàlida, editeu-la"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "La configuració no és vàlida"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "error en la cerca"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "fa {minutes} minuts"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "fa {hours} hores i {minutes} minuts"
@@ -108,29 +109,28 @@ msgstr "Funcions estadístiques"
msgid "Compute {functions} of the arguments"
msgstr "Calcula {functions} dels arguments"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Temps del motor (segons)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Càrrega de la pàgina (segons)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Nombre de resultats"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Valoració"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Valoració segons el resultat"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Errors"
@@ -142,9 +142,15 @@ msgstr "{title}&nbsp;(OBSOLET)"
msgid "This entry has been superseded by"
msgstr "Aquesta entrada ha estat substituïda per"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "No hi ha resum disponible per a aquesta publicació."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "Reescriptura DOAI"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Evita els llocs de pagaments redirigint a versions d'accés obert de les publicacions si és possible"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -158,16 +164,6 @@ msgstr "Desplaçament infinit"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Carrega automàticament la pàgina següent en desplaçar-se al final de la pàgina actual"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Reescriu l'Open Access DOI"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Evita els llocs de pagaments redirigint a versions d'accés obert de les publicacions si és possible"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -330,8 +326,8 @@ msgstr "Mètode"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -403,8 +399,8 @@ msgstr "Motors de cerca usats actualment"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -419,8 +415,8 @@ msgstr "Categoria"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -438,7 +434,7 @@ msgstr "Bloca"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -448,7 +444,7 @@ msgstr "Aquesta configuració es desa en les galetes. Això ens permet no emmaga
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -458,7 +454,7 @@ msgstr "Aquestes galetes només són per a la vostra conveniència. No les usem
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -466,14 +462,14 @@ msgstr "desa"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Restaura els valors predeterminats"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -644,23 +640,23 @@ msgid "General"
msgstr "General"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Motorrs"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Connectat"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Resposter"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Galetes"
@@ -711,88 +707,78 @@ msgstr "Trieu un estil per a aquest tema"
msgid "Style"
msgstr "Estil"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Solucionador de l'Open Access DOI"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Redirigeix cap a versions d'accés obert de les publicacions si són disponibles (cal un connector)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Drecera"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Llengua seleccionada"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Interval de temps"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Temps amitjanat"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Temps màxim"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Aquest és el llistat dels mòduls de resposta ràpida del searx."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Nom"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Paraules clau"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Descripció"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Exemples"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Aquest és el llistat de les galetes, i els seu valor, que el searx té desats en el vostre equip."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Amb aquest llistat, podeu avaluar la transparència del searx."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Nom de la galeta"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Valor"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "URL de cerca de les preferències desades actualment"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/cs/LC_MESSAGES/messages.mo b/searx/translations/cs/LC_MESSAGES/messages.mo
index eded7150a..55d402429 100644
--- a/searx/translations/cs/LC_MESSAGES/messages.mo
+++ b/searx/translations/cs/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/cs/LC_MESSAGES/messages.po b/searx/translations/cs/LC_MESSAGES/messages.po
index 8d3ce3c3e..a14212359 100644
--- a/searx/translations/cs/LC_MESSAGES/messages.po
+++ b/searx/translations/cs/LC_MESSAGES/messages.po
@@ -4,14 +4,15 @@
#
# Translators:
# Clon <fillip1@seznam.cz>, 2017
+# Clon <fillip1@seznam.cz>, 2017
# Václav Zouzalík <Vaclav.Zouzalik@seznam.cz>, 2018
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-12-18 12:03+0000\n"
-"Last-Translator: Václav Zouzalík <Vaclav.Zouzalik@seznam.cz>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: Noémi Ványi <sitbackandwait@gmail.com>\n"
"Language-Team: Czech (http://www.transifex.com/asciimoo/searx/language/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -32,63 +33,63 @@ msgstr ""
msgid "unexpected crash"
msgstr ""
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "soubory"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "obecné"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "hudba"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "sociální media"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "obrázky"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "videa"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "IT"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "zprávy"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "mapa"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "věda"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Neplatné nastavení, upravte svoje předvolby"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Neplatné nastavení"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "chyba vyhledávání"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "před {minutes} minutamy"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "před {hours} hodinami, {minutes} minutami"
@@ -108,29 +109,28 @@ msgstr "Statistické funkce"
msgid "Compute {functions} of the arguments"
msgstr "Vypočítá {functions} daného argumentu"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Strojový čas (s)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Načítání stránky (s)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Počet výsledků"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr ""
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr ""
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Chyby"
@@ -142,10 +142,16 @@ msgstr "{title}&nbsp;(ZASTARALÉ)"
msgid "This entry has been superseded by"
msgstr "Tato položka byla nahrazena"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
msgstr ""
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Předejít placené sekce přesměrováním na verze s otevřený přístupem pokud je to možné"
+
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
msgstr "Pokud je to možné přepsat HTTP linky na HTTPS"
@@ -158,16 +164,6 @@ msgstr "Nekonečné rolování"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Automaticky načíst další stránku při dorolování na konec současné"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr ""
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Předejít placené sekce přesměrováním na verze s otevřený přístupem pokud je to možné"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -330,8 +326,8 @@ msgstr "Metoda"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -403,8 +399,8 @@ msgstr "Nyní používaný vyhledávač"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -419,8 +415,8 @@ msgstr "Kategorie"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -438,7 +434,7 @@ msgstr "Blokovat"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -448,7 +444,7 @@ msgstr "Tato nastavení jsou uložena ve vašem cookies, to nám umožňuje tako
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -458,7 +454,7 @@ msgstr "Tato cookie slouží výhradně vašemu pohodlí, neužíváme je pro va
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -466,14 +462,14 @@ msgstr "uložit"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Obnovit základní"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -644,23 +640,23 @@ msgid "General"
msgstr "Obecné"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Vyhledávače"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Zásuvné moduly"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Odpovědi"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cookies"
@@ -711,88 +707,78 @@ msgstr "Vybrat styl tohoto motivu"
msgid "Style"
msgstr "Styl"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr ""
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr ""
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Zkratka"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Zvolený jazyk"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Čásový interval"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Prům. čas"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Max. čas"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Toto je seznam modulů okamžité odpovědi searxu."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Jméno"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Klíčová slova"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Popis"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Příklady"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Toto je seznam cookies a jejich hodnot které searx ukládá ve vašem počítači."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "S tímto seznamem můžete posoudit průhlednost searxu"
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Název cookie"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Hodnota"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr ""
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/cy/LC_MESSAGES/messages.mo b/searx/translations/cy/LC_MESSAGES/messages.mo
index 066d268e0..238ecce80 100644
--- a/searx/translations/cy/LC_MESSAGES/messages.mo
+++ b/searx/translations/cy/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/cy/LC_MESSAGES/messages.po b/searx/translations/cy/LC_MESSAGES/messages.po
index 3344c6d1d..04d8a21d1 100644
--- a/searx/translations/cy/LC_MESSAGES/messages.po
+++ b/searx/translations/cy/LC_MESSAGES/messages.po
@@ -3,14 +3,14 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
-# Aled Powell <aled@aledpowell.cymru>, 2019
+# Cymrodor <aled@aledpowell.cymru>, 2019
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2019-01-05 13:50+0000\n"
-"Last-Translator: Aled Powell <aled@aledpowell.cymru>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: Noémi Ványi <sitbackandwait@gmail.com>\n"
"Language-Team: Welsh (http://www.transifex.com/asciimoo/searx/language/cy/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -31,63 +31,63 @@ msgstr ""
msgid "unexpected crash"
msgstr ""
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "ffeiliau"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "cyffredinol"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "cerddoriaeth"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "cyfryngau cymdeithasol"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "delweddau"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "fideos"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "Technoleg"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "newyddion"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "map"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "gwyddoniaeth"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Gosodiadau annilys. Addasa dy ddewisiadau."
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Gosodiadau annilys"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "gwall chwilio"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} munud yn ôl"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} awr, {minutes} munud yn ôl"
@@ -107,29 +107,28 @@ msgstr ""
msgid "Compute {functions} of the arguments"
msgstr ""
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr ""
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr ""
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Nifer o ganlyniadau"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Sgoriau"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr ""
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Gwallau"
@@ -141,8 +140,14 @@ msgstr ""
msgid "This entry has been superseded by"
msgstr ""
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
msgstr ""
#: searx/plugins/https_rewrite.py:32
@@ -157,16 +162,6 @@ msgstr ""
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr ""
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr ""
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr ""
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -329,8 +324,8 @@ msgstr "Dull"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -402,8 +397,8 @@ msgstr ""
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -418,8 +413,8 @@ msgstr "Categori"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -437,7 +432,7 @@ msgstr "Rhwystro"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -447,7 +442,7 @@ msgstr ""
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -457,7 +452,7 @@ msgstr ""
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -465,14 +460,14 @@ msgstr "cadw"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Ailosod rhagosodiadau"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -643,23 +638,23 @@ msgid "General"
msgstr "Cyffredin"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Peiriannau"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Ategolion"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Atebwyr"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cwcis"
@@ -710,88 +705,78 @@ msgstr "Dewis arddull ar gyfer y thema hon"
msgid "Style"
msgstr "Arddull"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr ""
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr ""
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Llwybr Byr"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Iaith a ddewiswyd"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Cyfnod amser"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr ""
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr ""
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr ""
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Enw"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Allweddeiriau"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Disgrifiad"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Enghreifftiau"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Dyma restr y cwcis, a'u gwerthoedd, mae searX yn eu cadw ar eich dyfais."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr ""
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Enw cwci"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Gwerth"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr ""
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/da/LC_MESSAGES/messages.mo b/searx/translations/da/LC_MESSAGES/messages.mo
index 8813c0779..a3cfb17da 100644
--- a/searx/translations/da/LC_MESSAGES/messages.mo
+++ b/searx/translations/da/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/da/LC_MESSAGES/messages.po b/searx/translations/da/LC_MESSAGES/messages.po
index f235ccdf5..848b986f4 100644
--- a/searx/translations/da/LC_MESSAGES/messages.po
+++ b/searx/translations/da/LC_MESSAGES/messages.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-02-22 01:48+0000\n"
-"Last-Translator: Mikkel Kirkgaard Nielsen <memb_transifex@mikini.dk>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: Morten Krogh Andersen <spam1@krogh.net>\n"
"Language-Team: Danish (http://www.transifex.com/asciimoo/searx/language/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -32,63 +32,63 @@ msgstr "forespørgsels-undtagelse"
msgid "unexpected crash"
msgstr "uventet nedlukning"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "filer"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "generelt"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "musik"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "sociale medier"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "billeder"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "videoer"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "it"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "nyheder"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "kort"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "videnskab"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Ugyldige indstillinger, redigér venligst dine valg"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Ugyldig indstilling"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "søgefejl"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "for {minutes} minut(ter) siden"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "for {hours} time(r) og {minutes} minut(ter) siden"
@@ -108,29 +108,28 @@ msgstr "Statistiske funktioner"
msgid "Compute {functions} of the arguments"
msgstr "Beregn {functions} af parametrene"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Søgemaskine-tid (sek)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Sideindlæsninger (sek)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Antal resultater"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Vægtninger"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Vægtninger pr. resultat"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Fejl"
@@ -142,9 +141,15 @@ msgstr "{title}&nbsp;(OVERFLØDIG)"
msgid "This entry has been superseded by"
msgstr "Denne værdi er blevet overskrevet af"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Intet sammendrag er tilgængelig for denne publikation."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "Omskriv DOAI"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Undgå betalingsmure ved at viderestille til en åbent tilgængelig version, hvis en sådan findes"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -158,16 +163,6 @@ msgstr "Uendelig scrolling"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Indlæs automatisk næste side, når der scrolles til bunden af den nuværende side"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Open Access DOI-omskrivning"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Undgå betalingsmure ved at viderestille til en åbent tilgængelig version, hvis en sådan findes"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -330,8 +325,8 @@ msgstr "Metode"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -403,8 +398,8 @@ msgstr "Pt. anvendte søgemaskiner"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -419,8 +414,8 @@ msgstr "Kategori"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -438,7 +433,7 @@ msgstr "Blokér"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -448,7 +443,7 @@ msgstr "Disse indstillnger gemmes cookies på din enhed. Dette gør, at vi ikke
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -458,7 +453,7 @@ msgstr "Disse cookies er kun til dine data. Vi benytter ikke disse til at spore
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -466,14 +461,14 @@ msgstr "gem"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Nustil til standard"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -644,23 +639,23 @@ msgid "General"
msgstr "Generelt"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Søgemaskiner"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Plugins"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Svarere"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cookies"
@@ -711,88 +706,78 @@ msgstr "Vælg stil for dette tema"
msgid "Style"
msgstr "Stil"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Open Access DOI-forløser"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Omdiriger til open-access-udgaver af publikationer hvis tilgængelig (plugin påkrævet)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Genvej"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Valgt sprog"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Tidsinterval"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Gns. tid"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Maks-tid"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Dette er listen over searx's installationens svar-moduler"
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Navn"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Nøgleord"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Beskrivelse"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Eksempler"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Dette er listen over de cookies og værdier searx gemmer på din computer"
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Med denne liste, kan du bekræfte gennemsigtigheden af searx"
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Cookie-navn"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Værdi"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "Søge-URL for den nuværende gemte indstilling"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/de/LC_MESSAGES/messages.mo b/searx/translations/de/LC_MESSAGES/messages.mo
index a525fbf1e..79ad35beb 100644
--- a/searx/translations/de/LC_MESSAGES/messages.mo
+++ b/searx/translations/de/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/de/LC_MESSAGES/messages.po b/searx/translations/de/LC_MESSAGES/messages.po
index 64f253ebd..6aa03b18f 100644
--- a/searx/translations/de/LC_MESSAGES/messages.po
+++ b/searx/translations/de/LC_MESSAGES/messages.po
@@ -8,7 +8,9 @@
# Thomas Pointhuber, 2014-2015
# Ettore Atalan <atalanttore@googlemail.com>, 2016
# Jona Abdinghoff <jona.abdinghoff@gmail.com>, 2016
+# Marc Abonce Seguin, 2019
# Mario Siegmann <mario_siegmann@web.de>, 2017
+# Bamstam, 2019
# Max <theshirinzu@gmail.com>, 2015
# pointhi, 2014
# rike, 2014
@@ -21,9 +23,9 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-12-28 11:02+0000\n"
-"Last-Translator: S R <acc-transifex@rie.hm>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-12-11 07:07+0000\n"
+"Last-Translator: Marc Abonce Seguin\n"
"Language-Team: German (http://www.transifex.com/asciimoo/searx/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -44,69 +46,69 @@ msgstr "Abbruch der Anfrage"
msgid "unexpected crash"
msgstr "Unerwarteter Absturz"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "Dateien"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "Allgemein"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "Musik"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "Soziale Medien"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "Bilder"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "Videos"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "IT"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "Neuigkeiten"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "Karte"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "Wissenschaft"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Ungültige Einstellungen. Bitte diese überprüfen"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Ungültige Einstellungen"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "Suchfehler"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "vor {minutes} Minute(n)"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "vor {hours} Stunde(n), {minutes} Minute(n)"
#: searx/answerers/random/answerer.py:53
msgid "Random value generator"
-msgstr "Zufallszahlengenerator"
+msgstr "Zufallswertgenerator"
#: searx/answerers/random/answerer.py:54
msgid "Generate different random values"
@@ -120,29 +122,28 @@ msgstr "Statistikfuntionen"
msgid "Compute {functions} of the arguments"
msgstr "{functions} der Argumente berechnen"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Suchmaschinen Zeit (sek)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Ladezeit (sek)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Trefferanzahl"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Punkte"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Punkte pro Treffer"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Fehler"
@@ -154,9 +155,15 @@ msgstr "{title}&nbsp;(OBSOLET)"
msgid "This entry has been superseded by"
msgstr "Dieser Eintrag wurde überschrieben von"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Keine Zusammenfassung für die Veröffentlichung verfügbar."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "DOAI umschreiben"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Bezahlbeschränkungen durch die Weiterleitung zu der verfügbaren Open-Access-Version vermeiden"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -170,16 +177,6 @@ msgstr "Unendliches Scrollen"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Lädt automatisch die nächste Seite, wenn das Ende der aktuellen Seite erreicht wurde"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Open-Access-DOI umschreiben"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Bezahlbeschränkungen durch die Weiterleitung zu der verfügbaren Open-Access-Version vermeiden"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -224,7 +221,7 @@ msgstr "An Vim angelehnte Tastenkombinationen"
msgid ""
"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
"\"h\" key on main or result page to get help."
-msgstr "Navigiere in der Ergebnisseite mit Vim ähnlichen Tastaturkombinationen (es wird JavaScript benötigt).\nDrücke \"h\" auf der Start- bzw. Ergebnisseite, um ein Hifefenster anzuzeigen"
+msgstr "In der Ergebnisseite mit Vim-ähnlichen Tastaturkombinationen navigieren (es wird JavaScript benötigt).\nAuf der Start- bzw. Ergebnisseite \"h\" drücken, um ein Hilfe-Fenster anzuzeigen."
#: searx/templates/courgette/404.html:4 searx/templates/legacy/404.html:4
#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
@@ -342,8 +339,8 @@ msgstr "Methode"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -415,8 +412,8 @@ msgstr "Aktuell benutzte Suchmaschinen"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -431,8 +428,8 @@ msgstr "Kategorie"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -450,7 +447,7 @@ msgstr "Blockieren"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -460,7 +457,7 @@ msgstr "Diese Informationen werden in Cookies auf Ihrem Rechner gespeichert, dam
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -470,7 +467,7 @@ msgstr "Diese Cookies dienen einzig Ihrem Komfort. Wir verwenden sie nicht, um S
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -478,14 +475,14 @@ msgstr "Speichern"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Zurücksetzen"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -656,23 +653,23 @@ msgid "General"
msgstr "Allgemein"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Suchmaschinen"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Erweiterungen"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Antworten"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cookies"
@@ -723,88 +720,78 @@ msgstr "Stil für dieses Thema auswählen"
msgid "Style"
msgstr "Aussehen"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Open Access DOI resolver"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Weiterleitung zu frei zugänglichen Versionen von Veröffentlichungen, wenn verfügbar (Plugin benötigt)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Abkürzung"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Ausgewählte Sprache"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Zeitbereich"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "mittlere Zeit"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "max. Zeit"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Dies ist die Liste der in searx verfügbaren Module für Sofortantworten "
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Name"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Schlüsselwörter"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Beschreibung"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Beispiele"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Die nachfolgende Liste zeigt alle Cookies, die searx auf deinem Computer speichert."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Mit dieser Liste können Sie die Transparenz von searx einschätzen"
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Cookie-Name"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Wert"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "Such-URL für die aktuell gespeicherten Einstellungen"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
@@ -856,7 +843,7 @@ msgstr "Letzte Woche"
#: searx/templates/oscar/time-range.html:12
#: searx/templates/simple/time-range.html:12
msgid "Last month"
-msgstr "Letzten Monat"
+msgstr "Letzter Monat"
#: searx/templates/oscar/time-range.html:15
#: searx/templates/simple/time-range.html:15
diff --git a/searx/translations/el_GR/LC_MESSAGES/messages.mo b/searx/translations/el_GR/LC_MESSAGES/messages.mo
index 2bc6a57a3..62d32b580 100644
--- a/searx/translations/el_GR/LC_MESSAGES/messages.mo
+++ b/searx/translations/el_GR/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/el_GR/LC_MESSAGES/messages.po b/searx/translations/el_GR/LC_MESSAGES/messages.po
index 073f2f61e..c93f81ae8 100644
--- a/searx/translations/el_GR/LC_MESSAGES/messages.po
+++ b/searx/translations/el_GR/LC_MESSAGES/messages.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-01-17 10:03+0000\n"
-"Last-Translator: xinomilo <dimitris@stinpriza.org>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: Noémi Ványi <sitbackandwait@gmail.com>\n"
"Language-Team: Greek (Greece) (http://www.transifex.com/asciimoo/searx/language/el_GR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -32,63 +32,63 @@ msgstr ""
msgid "unexpected crash"
msgstr ""
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "αρχεία"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "γενικά"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "μουσική"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "κοινωνικά δίκτυα"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "εικόνες"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr ""
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr ""
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "νέα"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "χάρτης"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "επιστήμη"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr ""
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr ""
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "λάθος αναζήτησης"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} λεπτά πριν"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr ""
@@ -108,29 +108,28 @@ msgstr ""
msgid "Compute {functions} of the arguments"
msgstr ""
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Χρόνος μηχανής (δευτ)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Φόρτωση σελίδας (δευτ)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Αριθμός αποτελεσμάτων"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr ""
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr ""
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Λάθη"
@@ -142,8 +141,14 @@ msgstr ""
msgid "This entry has been superseded by"
msgstr ""
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
msgstr ""
#: searx/plugins/https_rewrite.py:32
@@ -158,16 +163,6 @@ msgstr ""
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr ""
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr ""
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr ""
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -330,8 +325,8 @@ msgstr "Μέθοδος"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -403,8 +398,8 @@ msgstr "Μηχανές αναζήτησης που χρησιμοποιούντ
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -419,8 +414,8 @@ msgstr "Κατηγορία"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -438,7 +433,7 @@ msgstr "Αποκλεισμός"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -448,7 +443,7 @@ msgstr ""
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -458,7 +453,7 @@ msgstr ""
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -466,14 +461,14 @@ msgstr "αποθήκευση"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Επαναφορά προεπιλογών"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -644,23 +639,23 @@ msgid "General"
msgstr "Γενικά"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Μηχανές"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Πρόσθετα"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr ""
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr ""
@@ -711,88 +706,78 @@ msgstr ""
msgid "Style"
msgstr ""
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr ""
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr ""
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Συντόμευση"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Επιλεγμένη γλώσσα"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr ""
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr ""
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr ""
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr ""
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Όνομα"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Λέξεις κλειδιά"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Περιγραφή"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Παραδείγματα"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr ""
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr ""
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr ""
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Τιμή"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr ""
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/en/LC_MESSAGES/messages.mo b/searx/translations/en/LC_MESSAGES/messages.mo
index 0c270c06d..cff555694 100644
--- a/searx/translations/en/LC_MESSAGES/messages.mo
+++ b/searx/translations/en/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/eo/LC_MESSAGES/messages.mo b/searx/translations/eo/LC_MESSAGES/messages.mo
index cfad4d49e..c693ac69f 100644
--- a/searx/translations/eo/LC_MESSAGES/messages.mo
+++ b/searx/translations/eo/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/eo/LC_MESSAGES/messages.po b/searx/translations/eo/LC_MESSAGES/messages.po
index cd7ffe80e..1f06ed5b2 100644
--- a/searx/translations/eo/LC_MESSAGES/messages.po
+++ b/searx/translations/eo/LC_MESSAGES/messages.po
@@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-11-22 08:33+0000\n"
-"Last-Translator: Václav Zouzalík <Vaclav.Zouzalik@seznam.cz>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: pizzaiolo\n"
"Language-Team: Esperanto (http://www.transifex.com/asciimoo/searx/language/eo/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -34,63 +34,63 @@ msgstr "escepto de peto"
msgid "unexpected crash"
msgstr "neatendita paneo"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "dosieroj"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "ĝenerala"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "muziko"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "sociaj retoj"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "bildoj"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "videoj"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "komputiko"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "novaĵoj"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "mapo"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "scienco"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Nevalidaj agordoj, bonvolu redakti viajn agordojn"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Nevalidaj agordoj"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "serĉa eraro"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "antaŭ {minutes} minuto(j)"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "antaŭ {hours} horo(j), {minutes} minuto(j)"
@@ -110,29 +110,28 @@ msgstr "Statistikaj funkcioj"
msgid "Compute {functions} of the arguments"
msgstr "Kalkulas {functions} el la argumentoj"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Motora tempo (s)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Paĝŝarĝo (sekundoj)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Nombro da rezultoj"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Poentaroj"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Poentaroj por unu rezulto"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Eraroj"
@@ -144,9 +143,15 @@ msgstr "{title}&nbsp;(MALNOVA)"
msgid "This entry has been superseded by"
msgstr "Tiu ĉi enigo estis anstataŭigita per"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Neniu resumo atingeblas por tiu ĉi eldonaĵo."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "DOAI-reverko"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Eviti pagomurojn per direkto al malfermaliraj versioj de eldonaĵoj, se eblas"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -160,16 +165,6 @@ msgstr "Senfina rulumado"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Aŭtomate ŝarĝi sekvan paĝon rulumante al la subo de la nuna paĝo"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Malfermalira COI-ŝanĝo"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Eviti pagomurojn per direkto al malfermaliraj versioj de eldonaĵoj, se eblas"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -332,8 +327,8 @@ msgstr "Metodo"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -405,8 +400,8 @@ msgstr " Aktuale uzataj serĉiloj"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -421,8 +416,8 @@ msgstr "Kategorio"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -440,7 +435,7 @@ msgstr "Bloki"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -450,7 +445,7 @@ msgstr "Tiuj ĉi agordoj estas konservitaj en viaj kuketoj, kio ebligas al ni ne
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -460,7 +455,7 @@ msgstr "Tiuj kuketoj estas nur por via plaĉo, ni ne uzas ilin por spuri vin."
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -468,14 +463,14 @@ msgstr "konservi"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Reagordi al defaŭlto"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -646,23 +641,23 @@ msgid "General"
msgstr "Ĝenerala"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Motoroj"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Aldonaĵoj"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Respondiloj"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Kuketoj"
@@ -713,88 +708,78 @@ msgstr "Elekti stilon por ĉi tiu temo"
msgid "Style"
msgstr "Stilo"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Malfermalira COI-solvilo"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Direkti al malfermaliraj versioj de eldonaĵoj, se eblas (aldonaĵo necesas)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Fulmoklavo"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Elekti lingvon"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Tempa intervalo"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Mezkvanta tempo"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Maksimuma tempo"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Tio ĉi estas listo de tuje respondantaj moduloj de Searx."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Nomo"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Ŝlosilvortoj"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Priskribo"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Ekzemploj"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Ĉi tio estas listo de kuketoj kaj iliaj valoroj, kiujn searx konservas en via komputilo."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Kun tiu listo, vi povas kontroli la travideblecon de searx."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Nomo de kuketo"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Valoro"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "Serĉo-URL kun aktuale konservitaj agordoj"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/es/LC_MESSAGES/messages.mo b/searx/translations/es/LC_MESSAGES/messages.mo
index 358cce8cb..c95556350 100644
--- a/searx/translations/es/LC_MESSAGES/messages.mo
+++ b/searx/translations/es/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/es/LC_MESSAGES/messages.po b/searx/translations/es/LC_MESSAGES/messages.po
index 4c276303f..ef67c8393 100644
--- a/searx/translations/es/LC_MESSAGES/messages.po
+++ b/searx/translations/es/LC_MESSAGES/messages.po
@@ -11,16 +11,16 @@
# juanda097 <juanda097@protonmail.ch>, 2017
# Marc Abonce Seguin, 2016
# Marc Abonce Seguin, 2018
-# Oscar <ocf@openmailbox.org>, 2015
+# O <b204fbaf817497f9ea35edbcc051de81_265921>, 2015
# rivera valdez <riveravaldezmail@gmail.com>, 2016
# wefwefew ewfewfewf <nnnedmz0d@moakt.ws>, 2016
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-02-16 05:29+0000\n"
-"Last-Translator: Marc Abonce Seguin\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: Carmen Fernández B.\n"
"Language-Team: Spanish (http://www.transifex.com/asciimoo/searx/language/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -41,63 +41,63 @@ msgstr "solicitud de excepción"
msgid "unexpected crash"
msgstr "choque inesperado"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "Archivos"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "General"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "Música"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "Medios sociales"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "Imágenes"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "Vídeos"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "Informática"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "Noticias"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "Mapa"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "Ciencia"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Parámetros incorrectos, por favor, cambia tus preferencias"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Ajustes no válidos"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "error en la búsqueda"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "hace {minutes} minuto(s)"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "hace {hours} hora(s) y {minutes} minuto(s)"
@@ -117,29 +117,28 @@ msgstr "Funciones de estadística"
msgid "Compute {functions} of the arguments"
msgstr "Computar {functions} de parámetros"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Motor de tiempo (seg)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Tiempo de carga (segundos)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Número de resultados"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Puntuaciones"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Puntuaciones por resultado"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Errores"
@@ -151,9 +150,15 @@ msgstr "{title}&nbsp;(OBSOLETO)"
msgid "This entry has been superseded by"
msgstr "Esta entrada la ha sustituido"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "No hay resúmenes disponibles para esta publicación."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "Cambiar a DOAI"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Evitar barreras de pago redireccionando a las versiones de acceso libre de las publicaciones cuando estén disponibles"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -167,16 +172,6 @@ msgstr "Deslizamiento infinito"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Cargar automáticamente la siguiente página al deslizarse hasta el final de la página actual"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr ""
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Evitar barreras de pago redireccionando a las versiones de acceso libre de las publicaciones cuando estén disponibles"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -339,8 +334,8 @@ msgstr "Método"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -412,8 +407,8 @@ msgstr "Motores de búsqueda actualmente en uso"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -428,8 +423,8 @@ msgstr "Categoría"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -447,7 +442,7 @@ msgstr "Bloquear"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -457,7 +452,7 @@ msgstr "Esta configuración se guarda en sus cookies, lo que nos permite no alma
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -467,7 +462,7 @@ msgstr "Estas cookies son para su propia comodidad, no las utilizamos para rastr
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -475,14 +470,14 @@ msgstr "Guardar"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Restablecer configuración por defecto"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -653,23 +648,23 @@ msgid "General"
msgstr "General"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Motores"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Plugins"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Respondedores"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cookies"
@@ -720,88 +715,78 @@ msgstr "Elige un estilo para este tema"
msgid "Style"
msgstr "Estilo"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr ""
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Redireccionar a versiones de acceso abierto de las publicaciones cuando estén disponibles (se requiere plugin)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Atajo"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Idioma elegido"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Rango de tiempo"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Tiempo promedio"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Tiempo máximo"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Esta es la lista de los módulos de respuesta inmediata de searx."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Nombre"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Plabras clave"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Descripción"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Ejemplos"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Esta es la lista de cookies y sus valores que searx está almacenando en tu ordenador."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Con esa lista puedes valorar la transparencia de searx."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Nombre de la cookie"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Valor"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "Buscar URL de las preferencias guardadas actualmente"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/et/LC_MESSAGES/messages.mo b/searx/translations/et/LC_MESSAGES/messages.mo
new file mode 100644
index 000000000..e0818bc78
--- /dev/null
+++ b/searx/translations/et/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/et/LC_MESSAGES/messages.po b/searx/translations/et/LC_MESSAGES/messages.po
new file mode 100644
index 000000000..580307ed1
--- /dev/null
+++ b/searx/translations/et/LC_MESSAGES/messages.po
@@ -0,0 +1,998 @@
+# Translations template for PROJECT.
+# Copyright (C) 2017 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+#
+# Translators:
+# Madis Otenurm, 2019
+msgid ""
+msgstr ""
+"Project-Id-Version: searx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-04-20 20:39+0000\n"
+"Last-Translator: Madis Otenurm\n"
+"Language-Team: Estonian (http://www.transifex.com/asciimoo/searx/language/et/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.3.4\n"
+"Language: et\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: searx/search.py:137 searx/search.py:182
+msgid "timeout"
+msgstr "ajalõpp"
+
+#: searx/search.py:144
+msgid "request exception"
+msgstr "taotluse viga"
+
+#: searx/search.py:151
+msgid "unexpected crash"
+msgstr "ootamatu krahh"
+
+#: searx/webapp.py:135
+msgid "files"
+msgstr "failid"
+
+#: searx/webapp.py:136
+msgid "general"
+msgstr "üldine"
+
+#: searx/webapp.py:137
+msgid "music"
+msgstr "muusika"
+
+#: searx/webapp.py:138
+msgid "social media"
+msgstr "sotsiaalmeedia"
+
+#: searx/webapp.py:139
+msgid "images"
+msgstr "pildid"
+
+#: searx/webapp.py:140
+msgid "videos"
+msgstr "videod"
+
+#: searx/webapp.py:141
+msgid "it"
+msgstr "infotehnoloogia"
+
+#: searx/webapp.py:142
+msgid "news"
+msgstr "uudised"
+
+#: searx/webapp.py:143
+msgid "map"
+msgstr "kaardid"
+
+#: searx/webapp.py:144
+msgid "science"
+msgstr "teadus"
+
+#: searx/webapp.py:398 searx/webapp.py:653
+msgid "Invalid settings, please edit your preferences"
+msgstr "Sobimatud seaded, palun muuda oma eelistusi"
+
+#: searx/webapp.py:410
+msgid "Invalid settings"
+msgstr "Sobimatud seaded"
+
+#: searx/webapp.py:444 searx/webapp.py:488
+msgid "search error"
+msgstr "otsingu viga"
+
+#: searx/webapp.py:525
+msgid "{minutes} minute(s) ago"
+msgstr "{minutes} minut(it) tagasi"
+
+#: searx/webapp.py:527
+msgid "{hours} hour(s), {minutes} minute(s) ago"
+msgstr "{hours} tund(i), {minutes} minut(it) tagasi"
+
+#: searx/answerers/random/answerer.py:53
+msgid "Random value generator"
+msgstr "Juhusliku väärtuse generaator"
+
+#: searx/answerers/random/answerer.py:54
+msgid "Generate different random values"
+msgstr "Genereeri erinevaid juhuslikke väärtusi"
+
+#: searx/answerers/statistics/answerer.py:53
+msgid "Statistics functions"
+msgstr "Statistikafunktsioonid"
+
+#: searx/answerers/statistics/answerer.py:54
+msgid "Compute {functions} of the arguments"
+msgstr "Arvuta argumentide {functions}"
+
+#: searx/engines/__init__.py:194
+msgid "Engine time (sec)"
+msgstr "Mootori aeg (s)"
+
+#: searx/engines/__init__.py:198
+msgid "Page loads (sec)"
+msgstr "Lehe laadimisi (s)"
+
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
+#: searx/templates/simple/results.html:20
+msgid "Number of results"
+msgstr "Tulemuste arv"
+
+#: searx/engines/__init__.py:206
+msgid "Scores"
+msgstr "Skoorid"
+
+#: searx/engines/__init__.py:210
+msgid "Scores per result"
+msgstr "Skoorid tulemuste kohta"
+
+#: searx/engines/__init__.py:214
+msgid "Errors"
+msgstr "Vead"
+
+#: searx/engines/pdbe.py:87
+msgid "{title}&nbsp;(OBSOLETE)"
+msgstr "{title}&nbsp;(VANANENUD)"
+
+#: searx/engines/pdbe.py:91
+msgid "This entry has been superseded by"
+msgstr "See üksus on asendatud:"
+
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "DOAI taaskirjutamine"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Väldi maksumüüre, suunates võimalusel väljaannete avatud ligipääsuga versioonidele"
+
+#: searx/plugins/https_rewrite.py:32
+msgid "Rewrite HTTP links to HTTPS if possible"
+msgstr "Kirjuta võimalusel HTTP lingid HTTPSiks"
+
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr "Lõpmatu kerimine"
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr "Laadi lehe lõppu kerimisel järgmine leht automaatselt"
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/simple/preferences.html:149
+msgid "Open result links on new browser tabs"
+msgstr "Ava tulemuste lingid uutel brauserikaartidel"
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr "Tulemused avatakse vaikimisi samas aknas. See plugin kirjutab vaikimisi käitumise üle, et avada lingid uutel kaartidel/akendel. (JavaScript nõutud)"
+
+#: searx/plugins/search_on_category_select.py:18
+msgid "Search on category select"
+msgstr "Otsi kategooria valimisel"
+
+#: searx/plugins/search_on_category_select.py:19
+msgid ""
+"Perform search immediately if a category selected. Disable to select "
+"multiple categories. (JavaScript required)"
+msgstr "Teosta otsing koheselt, kui kategooria on valitud. Keela mitme kategooria valimiseks. (Nõuab JavaScripti)"
+
+#: searx/plugins/self_info.py:20
+msgid ""
+"Displays your IP if the query is \"ip\" and your user agent if the query "
+"contains \"user agent\"."
+msgstr "Kuvab sinu IP'd, kui päringuks on \"ip\" ning kasutajaagenti, kui päringuks on \"user agent\"."
+
+#: searx/plugins/tracker_url_remover.py:26
+msgid "Tracker URL remover"
+msgstr "Jälitajate eemaldus URList"
+
+#: searx/plugins/tracker_url_remover.py:27
+msgid "Remove trackers arguments from the returned URL"
+msgstr "Eemaldab jälitavad argumendid tagastatud URList"
+
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr "Vim-sarnased kiirklahvid"
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr "Navigeeri otsingutulemusi Vim-i sarnaste kiirklahvidega (nõuab JavaScripti). Abi saamiseks vajuta avalehel või tulemuste lehel klahvi \"h\"."
+
+#: searx/templates/courgette/404.html:4 searx/templates/legacy/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+#: searx/templates/simple/404.html:4
+msgid "Page not found"
+msgstr "Lehte ei leitud"
+
+#: searx/templates/courgette/404.html:6 searx/templates/legacy/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#: searx/templates/simple/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr "Mine %(search_page)s."
+
+#: searx/templates/courgette/404.html:6 searx/templates/legacy/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#: searx/templates/simple/404.html:6
+msgid "search page"
+msgstr "otsinguleht"
+
+#: searx/templates/courgette/index.html:9
+#: searx/templates/courgette/index.html:13
+#: searx/templates/courgette/results.html:5
+#: searx/templates/legacy/index.html:8 searx/templates/legacy/index.html:12
+#: searx/templates/oscar/navbar.html:7
+#: searx/templates/oscar/preferences.html:3
+#: searx/templates/pix-art/index.html:8
+msgid "preferences"
+msgstr "eelistused"
+
+#: searx/templates/courgette/index.html:11
+#: searx/templates/legacy/index.html:10 searx/templates/oscar/about.html:2
+#: searx/templates/oscar/navbar.html:6 searx/templates/pix-art/index.html:7
+msgid "about"
+msgstr "teave"
+
+#: searx/templates/courgette/preferences.html:5
+#: searx/templates/legacy/preferences.html:5
+#: searx/templates/oscar/preferences.html:8
+#: searx/templates/pix-art/preferences.html:5
+#: searx/templates/simple/preferences.html:26
+msgid "Preferences"
+msgstr "Eelistused"
+
+#: searx/templates/courgette/preferences.html:9
+#: searx/templates/legacy/preferences.html:9
+#: searx/templates/oscar/preferences.html:33
+#: searx/templates/oscar/preferences.html:35
+#: searx/templates/simple/preferences.html:34
+msgid "Default categories"
+msgstr "Vaikimisi kategooriad"
+
+#: searx/templates/courgette/preferences.html:13
+#: searx/templates/legacy/preferences.html:14
+#: searx/templates/oscar/preferences.html:41
+#: searx/templates/pix-art/preferences.html:9
+#: searx/templates/simple/preferences.html:39
+#: searx/templates/simple/preferences.html:163
+msgid "Search language"
+msgstr "Otsingukeel"
+
+#: searx/templates/courgette/preferences.html:16
+#: searx/templates/legacy/preferences.html:17
+#: searx/templates/oscar/languages.html:6
+#: searx/templates/pix-art/preferences.html:12
+#: searx/templates/simple/languages.html:2
+#: searx/templates/simple/preferences.html:42
+msgid "Default language"
+msgstr "Vaikimisi keel"
+
+#: searx/templates/courgette/preferences.html:24
+#: searx/templates/legacy/preferences.html:25
+#: searx/templates/oscar/preferences.html:47
+#: searx/templates/pix-art/preferences.html:20
+#: searx/templates/simple/preferences.html:120
+msgid "Interface language"
+msgstr "Liidese keel"
+
+#: searx/templates/courgette/preferences.html:34
+#: searx/templates/legacy/preferences.html:35
+#: searx/templates/oscar/preferences.html:57
+#: searx/templates/simple/preferences.html:51
+msgid "Autocomplete"
+msgstr "Automaattäide"
+
+#: searx/templates/courgette/preferences.html:45
+#: searx/templates/legacy/preferences.html:46
+#: searx/templates/oscar/preferences.html:68
+#: searx/templates/simple/preferences.html:166
+msgid "Image proxy"
+msgstr "Pildiproksi"
+
+#: searx/templates/courgette/preferences.html:48
+#: searx/templates/legacy/preferences.html:49
+#: searx/templates/oscar/preferences.html:72
+#: searx/templates/simple/preferences.html:169
+msgid "Enabled"
+msgstr "Lubatud"
+
+#: searx/templates/courgette/preferences.html:49
+#: searx/templates/legacy/preferences.html:50
+#: searx/templates/oscar/preferences.html:73
+#: searx/templates/simple/preferences.html:170
+msgid "Disabled"
+msgstr "Keelatud"
+
+#: searx/templates/courgette/preferences.html:54
+#: searx/templates/legacy/preferences.html:55
+#: searx/templates/oscar/preferences.html:77
+#: searx/templates/pix-art/preferences.html:30
+#: searx/templates/simple/preferences.html:156
+msgid "Method"
+msgstr "Meetod"
+
+#: searx/templates/courgette/preferences.html:63
+#: searx/templates/legacy/preferences.html:64
+#: searx/templates/oscar/preferences.html:86
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/simple/preferences.html:63
+#: searx/templates/simple/preferences.html:90
+msgid "SafeSearch"
+msgstr "SafeSearch"
+
+#: searx/templates/courgette/preferences.html:66
+#: searx/templates/legacy/preferences.html:67
+#: searx/templates/oscar/preferences.html:90
+#: searx/templates/simple/preferences.html:66
+msgid "Strict"
+msgstr "Range"
+
+#: searx/templates/courgette/preferences.html:67
+#: searx/templates/legacy/preferences.html:68
+#: searx/templates/oscar/preferences.html:91
+#: searx/templates/simple/preferences.html:67
+msgid "Moderate"
+msgstr "Mõõdukas"
+
+#: searx/templates/courgette/preferences.html:68
+#: searx/templates/legacy/preferences.html:69
+#: searx/templates/oscar/preferences.html:92
+#: searx/templates/simple/preferences.html:68
+msgid "None"
+msgstr "Puudub"
+
+#: searx/templates/courgette/preferences.html:73
+#: searx/templates/legacy/preferences.html:74
+#: searx/templates/oscar/preferences.html:96
+#: searx/templates/pix-art/preferences.html:39
+#: searx/templates/simple/preferences.html:131
+msgid "Themes"
+msgstr "Teemad"
+
+#: searx/templates/courgette/preferences.html:83
+msgid "Color"
+msgstr "Värv"
+
+#: searx/templates/courgette/preferences.html:86
+msgid "Blue (default)"
+msgstr "Sinine (vaikimisi)"
+
+#: searx/templates/courgette/preferences.html:87
+msgid "Violet"
+msgstr "Violetne"
+
+#: searx/templates/courgette/preferences.html:88
+msgid "Green"
+msgstr "Roheline"
+
+#: searx/templates/courgette/preferences.html:89
+msgid "Cyan"
+msgstr "Erksinine"
+
+#: searx/templates/courgette/preferences.html:90
+msgid "Orange"
+msgstr "Oranž"
+
+#: searx/templates/courgette/preferences.html:91
+msgid "Red"
+msgstr "Punane"
+
+#: searx/templates/courgette/preferences.html:96
+#: searx/templates/legacy/preferences.html:93
+#: searx/templates/pix-art/preferences.html:49
+#: searx/templates/simple/preferences.html:77
+msgid "Currently used search engines"
+msgstr "Hetkel kasutatud otsingumootorid"
+
+#: searx/templates/courgette/preferences.html:100
+#: searx/templates/legacy/preferences.html:97
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
+#: searx/templates/pix-art/preferences.html:53
+#: searx/templates/simple/preferences.html:87
+msgid "Engine name"
+msgstr "Mootori nimi"
+
+#: searx/templates/courgette/preferences.html:101
+#: searx/templates/legacy/preferences.html:98
+msgid "Category"
+msgstr "Kategooria"
+
+#: searx/templates/courgette/preferences.html:102
+#: searx/templates/courgette/preferences.html:113
+#: searx/templates/legacy/preferences.html:99
+#: searx/templates/legacy/preferences.html:110
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
+#: searx/templates/pix-art/preferences.html:54
+#: searx/templates/pix-art/preferences.html:64
+#: searx/templates/simple/preferences.html:86
+msgid "Allow"
+msgstr "Luba"
+
+#: searx/templates/courgette/preferences.html:102
+#: searx/templates/courgette/preferences.html:114
+#: searx/templates/legacy/preferences.html:99
+#: searx/templates/legacy/preferences.html:111
+#: searx/templates/pix-art/preferences.html:54
+#: searx/templates/pix-art/preferences.html:65
+msgid "Block"
+msgstr "Keela"
+
+#: searx/templates/courgette/preferences.html:122
+#: searx/templates/legacy/preferences.html:119
+#: searx/templates/oscar/preferences.html:285
+#: searx/templates/pix-art/preferences.html:73
+#: searx/templates/simple/preferences.html:180
+msgid ""
+"These settings are stored in your cookies, this allows us not to store this "
+"data about you."
+msgstr "Need seaded salvestatakse sinu küpsistes, see lubab meil sinu kohta andmeid mitte salvestada."
+
+#: searx/templates/courgette/preferences.html:124
+#: searx/templates/legacy/preferences.html:121
+#: searx/templates/oscar/preferences.html:287
+#: searx/templates/pix-art/preferences.html:75
+#: searx/templates/simple/preferences.html:182
+msgid ""
+"These cookies serve your sole convenience, we don't use these cookies to "
+"track you."
+msgstr "Need küpsised on vaid mugavuse tarbeks, me ei kasuta neid sinu jälitamiseks."
+
+#: searx/templates/courgette/preferences.html:127
+#: searx/templates/legacy/preferences.html:124
+#: searx/templates/oscar/preferences.html:293
+#: searx/templates/pix-art/preferences.html:78
+#: searx/templates/simple/preferences.html:185
+msgid "save"
+msgstr "salvesta"
+
+#: searx/templates/courgette/preferences.html:128
+#: searx/templates/legacy/preferences.html:125
+#: searx/templates/oscar/preferences.html:295
+#: searx/templates/simple/preferences.html:186
+msgid "Reset defaults"
+msgstr "Lähtesta vaikeseaded"
+
+#: searx/templates/courgette/preferences.html:129
+#: searx/templates/legacy/preferences.html:126
+#: searx/templates/oscar/preferences.html:294
+#: searx/templates/pix-art/preferences.html:79
+#: searx/templates/simple/preferences.html:187
+msgid "back"
+msgstr "tagasi"
+
+#: searx/templates/courgette/results.html:12
+#: searx/templates/legacy/results.html:13
+#: searx/templates/oscar/results.html:136
+#: searx/templates/simple/results.html:58
+msgid "Search URL"
+msgstr "Otsingu URL"
+
+#: searx/templates/courgette/results.html:16
+#: searx/templates/legacy/results.html:17
+#: searx/templates/oscar/results.html:141
+#: searx/templates/simple/results.html:62
+msgid "Download results"
+msgstr "Laadi tulemused alla"
+
+#: searx/templates/courgette/results.html:34
+#: searx/templates/legacy/results.html:35
+#: searx/templates/simple/results.html:10
+msgid "Answers"
+msgstr "Vastused"
+
+#: searx/templates/courgette/results.html:42
+#: searx/templates/legacy/results.html:43
+#: searx/templates/oscar/results.html:116
+#: searx/templates/simple/results.html:42
+msgid "Suggestions"
+msgstr "Soovitused"
+
+#: searx/templates/courgette/results.html:70
+#: searx/templates/legacy/results.html:81
+#: searx/templates/oscar/results.html:68 searx/templates/oscar/results.html:78
+#: searx/templates/simple/results.html:130
+msgid "previous page"
+msgstr "eelmine leht"
+
+#: searx/templates/courgette/results.html:81
+#: searx/templates/legacy/results.html:92
+#: searx/templates/oscar/results.html:62 searx/templates/oscar/results.html:84
+#: searx/templates/simple/results.html:145
+msgid "next page"
+msgstr "järgmine leht"
+
+#: searx/templates/courgette/search.html:3
+#: searx/templates/legacy/search.html:3 searx/templates/oscar/search.html:6
+#: searx/templates/oscar/search_full.html:9
+#: searx/templates/pix-art/search.html:3 searx/templates/simple/search.html:4
+msgid "Search for..."
+msgstr "Otsi..."
+
+#: searx/templates/courgette/stats.html:4 searx/templates/legacy/stats.html:4
+#: searx/templates/oscar/stats.html:5 searx/templates/pix-art/stats.html:4
+#: searx/templates/simple/stats.html:7
+msgid "Engine stats"
+msgstr "Mootori statistika"
+
+#: searx/templates/courgette/result_templates/images.html:4
+#: searx/templates/legacy/result_templates/images.html:4
+#: searx/templates/pix-art/result_templates/images.html:4
+msgid "original context"
+msgstr "originaalne kontekst"
+
+#: searx/templates/courgette/result_templates/torrent.html:7
+#: searx/templates/legacy/result_templates/torrent.html:11
+#: searx/templates/oscar/result_templates/torrent.html:6
+#: searx/templates/simple/result_templates/torrent.html:9
+msgid "Seeder"
+msgstr "Seemendaja"
+
+#: searx/templates/courgette/result_templates/torrent.html:7
+#: searx/templates/legacy/result_templates/torrent.html:11
+#: searx/templates/oscar/result_templates/torrent.html:6
+#: searx/templates/simple/result_templates/torrent.html:9
+msgid "Leecher"
+msgstr "Kaanija"
+
+#: searx/templates/courgette/result_templates/torrent.html:9
+#: searx/templates/legacy/result_templates/torrent.html:9
+#: searx/templates/oscar/macros.html:23
+#: searx/templates/simple/result_templates/torrent.html:6
+msgid "magnet link"
+msgstr "magnetlink"
+
+#: searx/templates/courgette/result_templates/torrent.html:10
+#: searx/templates/legacy/result_templates/torrent.html:10
+#: searx/templates/oscar/macros.html:24
+#: searx/templates/simple/result_templates/torrent.html:7
+msgid "torrent file"
+msgstr "torrentifail"
+
+#: searx/templates/legacy/categories.html:8
+#: searx/templates/simple/categories.html:6
+msgid "Click on the magnifier to perform search"
+msgstr "Klõpsa luubile otsingu teostamiseks"
+
+#: searx/templates/legacy/preferences.html:84
+#: searx/templates/oscar/preferences.html:113
+#: searx/templates/simple/preferences.html:142
+msgid "Results on new tabs"
+msgstr "Tulemused uutel kaartidel"
+
+#: searx/templates/legacy/preferences.html:87
+#: searx/templates/oscar/preferences.html:117
+#: searx/templates/simple/preferences.html:145
+msgid "On"
+msgstr "Sees"
+
+#: searx/templates/legacy/preferences.html:88
+#: searx/templates/oscar/preferences.html:118
+#: searx/templates/simple/preferences.html:146
+msgid "Off"
+msgstr "Väljas"
+
+#: searx/templates/legacy/result_templates/code.html:3
+#: searx/templates/legacy/result_templates/default.html:3
+#: searx/templates/legacy/result_templates/map.html:9
+#: searx/templates/oscar/macros.html:34 searx/templates/oscar/macros.html:48
+#: searx/templates/simple/macros.html:43
+msgid "cached"
+msgstr "vahemälus"
+
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr "Täpsemad seaded"
+
+#: searx/templates/oscar/base.html:62
+#: searx/templates/oscar/messages/first_time.html:4
+#: searx/templates/oscar/messages/save_settings_successfull.html:5
+#: searx/templates/oscar/messages/unknow_error.html:5
+msgid "Close"
+msgstr "Sulge"
+
+#: searx/templates/oscar/base.html:64
+#: searx/templates/oscar/messages/no_results.html:4
+#: searx/templates/simple/messages/no_results.html:4
+#: searx/templates/simple/results.html:25
+msgid "Error!"
+msgstr "Viga!"
+
+#: searx/templates/oscar/base.html:90 searx/templates/simple/base.html:55
+msgid "Powered by"
+msgstr "Põhineb"
+
+#: searx/templates/oscar/base.html:90 searx/templates/simple/base.html:55
+msgid "a privacy-respecting, hackable metasearch engine"
+msgstr "privaatsust austaval, häkitaval metaotsingu mootoril"
+
+#: searx/templates/oscar/macros.html:36 searx/templates/oscar/macros.html:50
+#: searx/templates/simple/macros.html:43
+msgid "proxied"
+msgstr "proksitud"
+
+#: searx/templates/oscar/macros.html:92
+msgid "supported"
+msgstr "toetatud"
+
+#: searx/templates/oscar/macros.html:96
+msgid "not supported"
+msgstr "mittetoetatud"
+
+#: searx/templates/oscar/preferences.html:13
+#: searx/templates/oscar/preferences.html:22
+#: searx/templates/simple/preferences.html:32
+msgid "General"
+msgstr "Üldine"
+
+#: searx/templates/oscar/preferences.html:14
+#: searx/templates/oscar/preferences.html:134
+#: searx/templates/simple/preferences.html:76
+msgid "Engines"
+msgstr "Mootorid"
+
+#: searx/templates/oscar/preferences.html:15
+#: searx/templates/oscar/preferences.html:207
+msgid "Plugins"
+msgstr "Pluginad"
+
+#: searx/templates/oscar/preferences.html:16
+#: searx/templates/oscar/preferences.html:233
+msgid "Answerers"
+msgstr "Vastajad"
+
+#: searx/templates/oscar/preferences.html:17
+#: searx/templates/oscar/preferences.html:260
+msgid "Cookies"
+msgstr "Küpsised"
+
+#: searx/templates/oscar/preferences.html:42
+#: searx/templates/simple/preferences.html:48
+msgid "What language do you prefer for search?"
+msgstr "Mis keelt sa otsinguks eelistad?"
+
+#: searx/templates/oscar/preferences.html:48
+#: searx/templates/simple/preferences.html:128
+msgid "Change the language of the layout"
+msgstr "Muuda paigutuse keelt"
+
+#: searx/templates/oscar/preferences.html:58
+#: searx/templates/simple/preferences.html:60
+msgid "Find stuff as you type"
+msgstr "Otsi asju kirjutamise ajal"
+
+#: searx/templates/oscar/preferences.html:69
+#: searx/templates/simple/preferences.html:173
+msgid "Proxying image results through searx"
+msgstr "Proksin pilditulemusi läbi searx-i"
+
+#: searx/templates/oscar/preferences.html:78
+msgid ""
+"Change how forms are submited, <a "
+"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
+" rel=\"external\">learn more about request methods</a>"
+msgstr "Muuda viisi, kuidas väljad edastatakse, <a href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\" rel=\"external\">loe taotlusmeetodite kohta lisaks</a>"
+
+#: searx/templates/oscar/preferences.html:87
+#: searx/templates/simple/preferences.html:71
+msgid "Filter content"
+msgstr "Filtreeri sisu"
+
+#: searx/templates/oscar/preferences.html:97
+#: searx/templates/simple/preferences.html:139
+msgid "Change searx layout"
+msgstr "Muuda searx-i paigutust"
+
+#: searx/templates/oscar/preferences.html:106
+#: searx/templates/oscar/preferences.html:111
+msgid "Choose style for this theme"
+msgstr "Vali sellele teemale stii"
+
+#: searx/templates/oscar/preferences.html:106
+#: searx/templates/oscar/preferences.html:111
+msgid "Style"
+msgstr "Stii"
+
+#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:163
+#: searx/templates/simple/preferences.html:88
+msgid "Shortcut"
+msgstr "Otsetee"
+
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
+msgid "Selected language"
+msgstr "Valitud keel"
+
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/simple/preferences.html:91
+msgid "Time range"
+msgstr "Ajavahemik"
+
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/simple/preferences.html:92
+msgid "Avg. time"
+msgstr "Keskmine aeg"
+
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/simple/preferences.html:93
+msgid "Max time"
+msgstr "Maksimaalne aeg"
+
+#: searx/templates/oscar/preferences.html:236
+msgid "This is the list of searx's instant answering modules."
+msgstr "See on searx-i koheste vastajate moodulite nimekiri."
+
+#: searx/templates/oscar/preferences.html:240
+msgid "Name"
+msgstr "Nimi"
+
+#: searx/templates/oscar/preferences.html:241
+msgid "Keywords"
+msgstr "Märksõnad"
+
+#: searx/templates/oscar/preferences.html:242
+msgid "Description"
+msgstr "Kirjeldus"
+
+#: searx/templates/oscar/preferences.html:243
+msgid "Examples"
+msgstr "Näited"
+
+#: searx/templates/oscar/preferences.html:263
+msgid ""
+"This is the list of cookies and their values searx is storing on your "
+"computer."
+msgstr "See on küpsiste ja nende väärtuste nimekiri, mida searx hoiab sinu arvutis."
+
+#: searx/templates/oscar/preferences.html:264
+msgid "With that list, you can assess searx transparency."
+msgstr "Selle nimekirjaga saad sa hinnata searx-i läbipaistvust."
+
+#: searx/templates/oscar/preferences.html:269
+msgid "Cookie name"
+msgstr "Küpsise nimi"
+
+#: searx/templates/oscar/preferences.html:270
+msgid "Value"
+msgstr "Väärtus"
+
+#: searx/templates/oscar/preferences.html:289
+msgid "Search URL of the currently saved preferences"
+msgstr "Otsingu URL hetkel salvestatud eelistuste kohta"
+
+#: searx/templates/oscar/preferences.html:289
+msgid ""
+"Note: specifying custom settings in the search URL can reduce privacy by "
+"leaking data to the clicked result sites."
+msgstr "Märkus: täpsemate seadete määramine otsingu URLis võib vähendada privaatsust, lekitades andmed klõpsatud tulemuste saitidele."
+
+#: searx/templates/oscar/results.html:17
+msgid "Search results"
+msgstr "Otsingutulemused"
+
+#: searx/templates/oscar/results.html:21
+#: searx/templates/simple/results.html:84
+msgid "Try searching for:"
+msgstr "Proovi otsida:"
+
+#: searx/templates/oscar/results.html:100
+#: searx/templates/simple/results.html:25
+msgid "Engines cannot retrieve results"
+msgstr "Mootorid ei saa tulemusi tagastada"
+
+#: searx/templates/oscar/results.html:131
+msgid "Links"
+msgstr "Lingid"
+
+#: searx/templates/oscar/search.html:8
+#: searx/templates/oscar/search_full.html:11
+#: searx/templates/simple/search.html:5
+msgid "Start search"
+msgstr "Alusta otsingut"
+
+#: searx/templates/oscar/stats.html:2
+msgid "stats"
+msgstr "statistika"
+
+#: searx/templates/oscar/time-range.html:3
+#: searx/templates/simple/time-range.html:3
+msgid "Anytime"
+msgstr "Igal ajal"
+
+#: searx/templates/oscar/time-range.html:6
+#: searx/templates/simple/time-range.html:6
+msgid "Last day"
+msgstr "Viimane päev"
+
+#: searx/templates/oscar/time-range.html:9
+#: searx/templates/simple/time-range.html:9
+msgid "Last week"
+msgstr "Viimane nädal"
+
+#: searx/templates/oscar/time-range.html:12
+#: searx/templates/simple/time-range.html:12
+msgid "Last month"
+msgstr "Viimane kuu"
+
+#: searx/templates/oscar/time-range.html:15
+#: searx/templates/simple/time-range.html:15
+msgid "Last year"
+msgstr "Viimane aasta"
+
+#: searx/templates/oscar/messages/first_time.html:6
+#: searx/templates/oscar/messages/no_data_available.html:3
+msgid "Heads up!"
+msgstr "Tähelepanu!"
+
+#: searx/templates/oscar/messages/first_time.html:7
+msgid "It look like you are using searx first time."
+msgstr "Tundub, et kasutad searx-i esimest korda."
+
+#: searx/templates/oscar/messages/no_cookies.html:3
+msgid "Information!"
+msgstr "Teave!"
+
+#: searx/templates/oscar/messages/no_cookies.html:4
+msgid "currently, there are no cookies defined."
+msgstr "hetkel pole ühtegi küpsist määratud."
+
+#: searx/templates/oscar/messages/no_data_available.html:4
+msgid "There is currently no data available. "
+msgstr "Hetkel andmed puuduvad."
+
+#: searx/templates/oscar/messages/no_results.html:4
+#: searx/templates/simple/messages/no_results.html:4
+msgid "Engines cannot retrieve results."
+msgstr "Mootorid ei saa tulemusi tagastada."
+
+#: searx/templates/oscar/messages/no_results.html:10
+#: searx/templates/simple/messages/no_results.html:10
+msgid "Please, try again later or find another searx instance."
+msgstr "Palun proovi hiljem uuesti või leia teine searx-i eksemplar."
+
+#: searx/templates/oscar/messages/no_results.html:14
+#: searx/templates/simple/messages/no_results.html:14
+msgid "Sorry!"
+msgstr "Vabandust!"
+
+#: searx/templates/oscar/messages/no_results.html:15
+#: searx/templates/simple/messages/no_results.html:15
+msgid ""
+"we didn't find any results. Please use another query or search in more "
+"categories."
+msgstr "me ei leidnud ühtegi tulemust. Palun kasuta teist päringut või otsi rohkematest kategooriatest."
+
+#: searx/templates/oscar/messages/save_settings_successfull.html:7
+msgid "Well done!"
+msgstr "Hästi tehtud!"
+
+#: searx/templates/oscar/messages/save_settings_successfull.html:8
+msgid "Settings saved successfully."
+msgstr "Seaded edukalt salvestatud."
+
+#: searx/templates/oscar/messages/unknow_error.html:7
+msgid "Oh snap!"
+msgstr "Oh kurja!"
+
+#: searx/templates/oscar/messages/unknow_error.html:8
+msgid "Something went wrong."
+msgstr "Midagi läks valesti."
+
+#: searx/templates/oscar/result_templates/default.html:7
+#: searx/templates/simple/result_templates/default.html:6
+msgid "show media"
+msgstr "kuva meedia"
+
+#: searx/templates/oscar/result_templates/default.html:7
+#: searx/templates/simple/result_templates/default.html:6
+msgid "hide media"
+msgstr "peida meedia"
+
+#: searx/templates/oscar/result_templates/images.html:30
+msgid "Get image"
+msgstr "Hangi pilt"
+
+#: searx/templates/oscar/result_templates/images.html:33
+msgid "View source"
+msgstr "Vaata allikat"
+
+#: searx/templates/oscar/result_templates/map.html:7
+#: searx/templates/simple/result_templates/map.html:7
+msgid "show map"
+msgstr "kuva kaart"
+
+#: searx/templates/oscar/result_templates/map.html:7
+#: searx/templates/simple/result_templates/map.html:7
+msgid "hide map"
+msgstr "peida kaart"
+
+#: searx/templates/oscar/result_templates/map.html:11
+#: searx/templates/simple/result_templates/map.html:11
+msgid "show details"
+msgstr "kuva andmeid"
+
+#: searx/templates/oscar/result_templates/map.html:11
+#: searx/templates/simple/result_templates/map.html:11
+msgid "hide details"
+msgstr "peida andmed"
+
+#: searx/templates/oscar/result_templates/torrent.html:7
+#: searx/templates/simple/result_templates/torrent.html:11
+msgid "Filesize"
+msgstr "Failisuurus"
+
+#: searx/templates/oscar/result_templates/torrent.html:9
+#: searx/templates/simple/result_templates/torrent.html:12
+msgid "Bytes"
+msgstr "Baite"
+
+#: searx/templates/oscar/result_templates/torrent.html:10
+#: searx/templates/simple/result_templates/torrent.html:13
+msgid "kiB"
+msgstr "kiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:11
+#: searx/templates/simple/result_templates/torrent.html:14
+msgid "MiB"
+msgstr "MiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:12
+#: searx/templates/simple/result_templates/torrent.html:15
+msgid "GiB"
+msgstr "GiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:13
+#: searx/templates/simple/result_templates/torrent.html:16
+msgid "TiB"
+msgstr "TiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:15
+#: searx/templates/simple/result_templates/torrent.html:20
+msgid "Number of Files"
+msgstr "Failide arv"
+
+#: searx/templates/oscar/result_templates/videos.html:7
+#: searx/templates/simple/result_templates/videos.html:6
+msgid "show video"
+msgstr "kuva video"
+
+#: searx/templates/oscar/result_templates/videos.html:7
+#: searx/templates/simple/result_templates/videos.html:6
+msgid "hide video"
+msgstr "peida video"
+
+#: searx/templates/pix-art/results.html:28
+msgid "Load more..."
+msgstr "Laadi juurde..."
+
+#: searx/templates/simple/base.html:31
+msgid "No item found"
+msgstr "Üksust ei leitud"
+
+#: searx/templates/simple/preferences.html:89
+msgid "Supports selected language"
+msgstr "Toetab valitud keelt"
+
+#: searx/templates/simple/preferences.html:118
+msgid "User interface"
+msgstr "Kasutajaliides"
+
+#: searx/templates/simple/preferences.html:154
+msgid "Privacy"
+msgstr "Privaatsus"
diff --git a/searx/translations/eu/LC_MESSAGES/messages.mo b/searx/translations/eu/LC_MESSAGES/messages.mo
index db58fdc84..0c66d026c 100644
--- a/searx/translations/eu/LC_MESSAGES/messages.mo
+++ b/searx/translations/eu/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/eu/LC_MESSAGES/messages.po b/searx/translations/eu/LC_MESSAGES/messages.po
index b6fa194e1..c47634dfd 100644
--- a/searx/translations/eu/LC_MESSAGES/messages.po
+++ b/searx/translations/eu/LC_MESSAGES/messages.po
@@ -3,16 +3,16 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
-# beriain <beriain@bitmessage.ch>, 2018
-# beriain <beriain@bitmessage.ch>, 2018
+# beriain, 2018
+# beriain, 2018-2019
# Txopi <txopi@ikusimakusi.eus>, 2016
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-11-06 16:39+0000\n"
-"Last-Translator: beriain <beriain@bitmessage.ch>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-26 15:18+0000\n"
+"Last-Translator: beriain\n"
"Language-Team: Basque (http://www.transifex.com/asciimoo/searx/language/eu/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -33,63 +33,63 @@ msgstr "salbuespena eskaeran"
msgid "unexpected crash"
msgstr "ustekabeko gelditzea"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "fitxategiak"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "orokorra"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "musika"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
-msgstr "multimedia soziala"
+msgstr "media soziala"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "irudiak"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "bideoak"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
-msgstr "it"
+msgstr "informatika"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "berriak"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "mapa"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "zientzia"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Ezarpen ez baliodunak, mesedez editatu zure hobespenak"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Ezarpen ez baliodunak"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "bilaketa akatsa"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "duela {minutes} minutu"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "duela {hours} ordu eta {minutes} minutu"
@@ -109,29 +109,28 @@ msgstr "Funtzio estatistikoak"
msgid "Compute {functions} of the arguments"
msgstr "Parametroen {functions} zenbatu"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Bilatzailearen denbora (seg)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Orri kargak (seg)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Emaitza kopurua"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Balorazioak"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Balorazioak emaitza bakoitzeko"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Erroreak"
@@ -143,9 +142,15 @@ msgstr "{title}&nbsp;(ZAHARKITUA)"
msgid "This entry has been superseded by"
msgstr "Sarrera hau hurrengoarekin ordezkatu da"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Ez dago abstrakturik eskuragarri argitalpen honetarako."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "DOAI berridazketa"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Ordainketa hormak sahiestu argitalpenen sartze-askeko bertsioetara berbidaliz ahal denean"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -159,16 +164,6 @@ msgstr "Korritze amaigabea"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Hurrengo orria automatikoki kargatu uneko orriaren behekaldera mugitzerakoan"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Berridatzi Open Access DOI"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Ordainketa hormak sahiestu argitalpenen sartze-askeko bertsioetara berbidaliz ahal denean"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -331,8 +326,8 @@ msgstr "Metodoa"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -404,8 +399,8 @@ msgstr "Erabiliak izaten ari diren bilatzaileak"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -420,8 +415,8 @@ msgstr "Kategoria"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -439,17 +434,17 @@ msgstr "Blokeatu"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
"These settings are stored in your cookies, this allows us not to store this "
"data about you."
-msgstr "Ezarpen hauek zure cookietan gurdetzen dira, honek zuri buruzko informaziorik ez gordetzea baimentzen digu."
+msgstr "Ezarpen hauek zure cookietan gordetzen dira, honek zuri buruzko informaziorik ez gordetzea baimentzen digu."
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -459,7 +454,7 @@ msgstr "Cookie hauek zure onurarako besterik ez dira, ez ditugu zure jarraipenik
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -467,14 +462,14 @@ msgstr "gorde"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Berrezarri lehenetsiak"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -645,23 +640,23 @@ msgid "General"
msgstr "Orokorra"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Bilatzaileak"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Pluginak"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Erantzun emaileak"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cookieak"
@@ -683,7 +678,7 @@ msgstr "Gauzak aurkitu idatzi bitartean"
#: searx/templates/oscar/preferences.html:69
#: searx/templates/simple/preferences.html:173
msgid "Proxying image results through searx"
-msgstr "Irudien emaitzak searx bitartez proxyatu"
+msgstr "Irudien emaitzak searx proxyaren bidez pasatu"
#: searx/templates/oscar/preferences.html:78
msgid ""
@@ -712,88 +707,78 @@ msgstr "Gai honetarako estiloa hautatu"
msgid "Style"
msgstr "Estiloa"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Open Access DOI ebatzi"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Argitalpenen sartze-askeko bertsioetara berbidali ahal denean (plugina behar du)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Lasterbidea"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Hautatutako hizkuntza"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Denbora tartea"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr " Batezbesteko denbora"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Gehienezko denbora"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Hau da searxen berehalako erantzunen moduluen zerrenda."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Izena"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Gako-hitzak"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Deskripzioa"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Adibideak"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Hau searxek zure ordenagailuan gordetzen ari den cookien eta haien balioen zerrenda bat da."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Zerrenda horrekin, searxen gardentasuna balioztatu dezakezu."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Cookiearen izena"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Balioa"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "Une honetan gordetako hobespenen bilaketa URLa"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/fa_IR/LC_MESSAGES/messages.mo b/searx/translations/fa_IR/LC_MESSAGES/messages.mo
index 4ef71416b..a2f503386 100644
--- a/searx/translations/fa_IR/LC_MESSAGES/messages.mo
+++ b/searx/translations/fa_IR/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/fa_IR/LC_MESSAGES/messages.po b/searx/translations/fa_IR/LC_MESSAGES/messages.po
index 0e568e1db..6689dafe7 100644
--- a/searx/translations/fa_IR/LC_MESSAGES/messages.po
+++ b/searx/translations/fa_IR/LC_MESSAGES/messages.po
@@ -4,15 +4,17 @@
#
# Translators:
# Aurora, 2018
+# Aurora, 2018
+# Jim <inactive+Jim11@transifex.com>, 2017
# Jim <inactive+Jim11@transifex.com>, 2017
-# Mostafa Ahangarha <ahangarha@gmail.com>, 2018
+# Mostafa Ahangarha <ahangarha@riseup.net>, 2018
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-04-16 16:41+0000\n"
-"Last-Translator: Aurora\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: Noémi Ványi <sitbackandwait@gmail.com>\n"
"Language-Team: Persian (Iran) (http://www.transifex.com/asciimoo/searx/language/fa_IR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -33,63 +35,63 @@ msgstr "خطا در درخواست"
msgid "unexpected crash"
msgstr "ایست ناگهانی"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "فایل ها<br>"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "فراگیر"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "موسیقی"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "رسانه اجتماعی"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "تصاویر<br>"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "ویدیو ها<br>"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "فناوری اطلاعات"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "اخبار"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "نقشه"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "دانش<br>"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "تنظیمات نادرست است، لطفا اولویت‌های جستجو را تغییر دهید"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "تنظیمات اشتباه"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "خطای جستجو"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} دقیقه پیش"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} ساعت و {minutes} دقیقه پیش"
@@ -109,29 +111,28 @@ msgstr "توابع آماری"
msgid "Compute {functions} of the arguments"
msgstr "پردازش {عملکرد های} نشانوند ها<br>"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "زمان موتور(ثانیه)<br>"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "زمان بارگذاری صفحه (ثانیه)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "تعداد نتایج"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "امتیازات<br>"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "امتیازات بر نتیجه<br>"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "خطاها"
@@ -143,9 +144,15 @@ msgstr "{title}&nbsp;(OBSOLETE)"
msgid "This entry has been superseded by"
msgstr "این ورودی معلق شده است توسط"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "هیچ چکید ای برای این نشریه در دسترس نیست.<br>"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "امتناع از منابع غیر رایگان با تغییر مسیر به نسخه ی رایگان نشریات اگر در دسترس باشد<br>"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -159,16 +166,6 @@ msgstr "پایین رفتن بی‌پایان"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "بارگذاری خودکار صفحه بعد در صورت پیمایش تا پایین صفحه کنونی"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "بازنویسی Open Access DOI<br>"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "امتناع از منابع غیر رایگان با تغییر مسیر به نسخه ی رایگان نشریات اگر در دسترس باشد<br>"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -331,8 +328,8 @@ msgstr "روش<br>"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -404,8 +401,8 @@ msgstr "موتورهای جستجوی در حال استفاده"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -420,8 +417,8 @@ msgstr "دسته"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -439,7 +436,7 @@ msgstr "انسداد<br>"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -449,7 +446,7 @@ msgstr "این تنظیمات در کوکی های شما ذخیره شده ان
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -459,7 +456,7 @@ msgstr "این کوکی ها برای راحتی شماست، ما از این
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -467,14 +464,14 @@ msgstr "ذخیره"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "بازنشانی پیشفرض ها<br>"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -645,23 +642,23 @@ msgid "General"
msgstr "کلی<br>"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "موتور ها<br>"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "افزونه ها"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "پاسخگو ها<br>"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "کوکی ها<br>"
@@ -712,88 +709,78 @@ msgstr "سبک این پوسته را انتخاب کنید"
msgid "Style"
msgstr "سبک"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "حل کننده ی Open Access DOI<br>"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "هدایت به نسخه رایگان نشریات اگر در دسترس باشد(نیازمند به افزونه)<br>"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "میانبر<br>"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "زبان انتخابی<br>"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "بازه ی زمانی<br>"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "زمان میانگین"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "حداکثر زمان"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "این، فهرست ماژول‌های پاسخ بلادرنگ searx است."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "نام"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "کلیدواژه ها<br>"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "شرح<br>"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "مثال ها<br>"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "این، لیست کوکی‌ها و مقادیری است که searx روی دستگاه شما ذخیره می‌کند."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "با آن لیست، می‌توانید شفافیت searx را ارزیابی کنید."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "نام کوکی<br>"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "مقدار<br>"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "آدرس جستجو بر اساس تنظیمات ذخیره شده<br>"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/fi/LC_MESSAGES/messages.mo b/searx/translations/fi/LC_MESSAGES/messages.mo
index b3905ca2f..90cd78d9e 100644
--- a/searx/translations/fi/LC_MESSAGES/messages.mo
+++ b/searx/translations/fi/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/fi/LC_MESSAGES/messages.po b/searx/translations/fi/LC_MESSAGES/messages.po
index dbec358d4..57b3e4316 100644
--- a/searx/translations/fi/LC_MESSAGES/messages.po
+++ b/searx/translations/fi/LC_MESSAGES/messages.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2017-11-13 07:36+0000\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
"Last-Translator: Jiri Grönroos <jiri.gronroos@iki.fi>\n"
"Language-Team: Finnish (http://www.transifex.com/asciimoo/searx/language/fi/)\n"
"MIME-Version: 1.0\n"
@@ -31,63 +31,63 @@ msgstr "pyyntöpoikkeus"
msgid "unexpected crash"
msgstr "odottamaton kaatuminen"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "tiedostot"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "yleiset"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "musiikki"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "sosiaalinen media"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "kuvat"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "videot"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "it"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "uutiset"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "kartta"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "tiede"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Virheelliset asetukset, muokkaa siis asetuksia"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Virheelliset asetukset"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "hakuvirhe"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} min sitten"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} t, {minutes} min sitten"
@@ -107,29 +107,28 @@ msgstr "Tilastolliset funktiot"
msgid "Compute {functions} of the arguments"
msgstr "Laske argumenttien {functions}"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Hakukoneen aika (s)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Sivun lataus (s)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Tulosten määrä"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Pisteet"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Pisteet per tulos"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Virheet"
@@ -141,9 +140,15 @@ msgstr "{title}&nbsp;(VANHENTUNUT)"
msgid "This entry has been superseded by"
msgstr "Tämän kohdan on korvannut"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Tästä julkaisusta ei ole yhteenvetoa."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "DOAI-uudelleenkirjoitus"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Vältä maksumuureja ohjaamalla julkaisujen avoimiin versioihin jos mahdollista"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -157,16 +162,6 @@ msgstr "Loputon vieritys"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Lataa automaattisesti seuraava sivu, kun nykyisen sivun loppu saavutetaan"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Open Access DOI -uudelleenkirjoitus"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Vältä maksumuureja ohjaamalla julkaisujen avoimiin versioihin jos mahdollista"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -329,8 +324,8 @@ msgstr "Tapa"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -402,8 +397,8 @@ msgstr "Nyt käytetyt hakukoneet"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -418,8 +413,8 @@ msgstr "Luokka"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -437,7 +432,7 @@ msgstr "Estä"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -447,7 +442,7 @@ msgstr "Nämä asetukset tallennetaan evästeisiisi. Näin Searxin ei tarvitse t
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -457,7 +452,7 @@ msgstr "Kyseiset evästeet palvelevat ainoastaan sinua, eikä niitä käytetä s
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -465,14 +460,14 @@ msgstr "Tallenna"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Palauta oletukset"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -643,23 +638,23 @@ msgid "General"
msgstr "Yleiset"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Hakukoneet"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Lisäosat"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Vastaajat"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Evästeet"
@@ -710,88 +705,78 @@ msgstr "Valitse tyyli tälle teemalle"
msgid "Style"
msgstr "Tyyli"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Open Access DOI -selvitin"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Uudelleenohjaa julkaisujen open-access-versioihin kun mahdollista (vaatii liitännäisen)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Oikoreitti"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Valittu kieli"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Aikaväli"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Keskimääräinen\naika"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Enimmäisaika"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Tämä on luettelo searxin vastaajamoduuleista."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Nimi"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Avainsanat"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Kuvaus"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Esimerkit"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Ohessa on lista evästeistä ja niiden arvoista, joita searx tallentaa tietokoneellesi."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Tämän luettelon avulla voit arvioida searxin läpinäkyvyyden."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Evästeen nimi"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Arvo"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "Nykyisten asetusten hakuosoite"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/fil/LC_MESSAGES/messages.mo b/searx/translations/fil/LC_MESSAGES/messages.mo
index f1b4e75c7..95851f77b 100644
--- a/searx/translations/fil/LC_MESSAGES/messages.mo
+++ b/searx/translations/fil/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/fil/LC_MESSAGES/messages.po b/searx/translations/fil/LC_MESSAGES/messages.po
index 460061968..ca50d5827 100644
--- a/searx/translations/fil/LC_MESSAGES/messages.po
+++ b/searx/translations/fil/LC_MESSAGES/messages.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-02-18 04:45+0000\n"
-"Last-Translator: gr01d\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: Noémi Ványi <sitbackandwait@gmail.com>\n"
"Language-Team: Filipino (http://www.transifex.com/asciimoo/searx/language/fil/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -32,63 +32,63 @@ msgstr "request exception"
msgid "unexpected crash"
msgstr "hindi inaasahan na crash"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "file"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "pangkalahatan"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "musika"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "social media"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "larawan"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "bidyo"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "it"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "balita"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "mapa"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "agham"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Maling settings, paki ayos ang preferences"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Maling settings"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "nagkaproblema sa paghahanap"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} na minuto ang nakalipas"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} oras at {minutes} na minto ang nakalipas"
@@ -108,29 +108,28 @@ msgstr "Estatistika ng mga tungkulin"
msgid "Compute {functions} of the arguments"
msgstr "Tuusin ang {functions} ng pangangatuwiran"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Oras ng engine (segundo)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Oras ng pagkarga ng pahina (segundo)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Bilang ng resulta"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Iskor"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Iskor ng bawat resulta"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Kamalian"
@@ -142,9 +141,15 @@ msgstr "{title}&nbsp;(LUMA)"
msgid "This entry has been superseded by"
msgstr "Ang tala na ito ay ipinagpaliban ng"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Walang nakita na abstract para sa pahahayag na ito."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Iwasan ang paywall sa pag-redirect sa open-access na bersyon ng pahahayagan kapagmakukuha"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -158,16 +163,6 @@ msgstr "Walang hanggan na pag-scroll"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Awtomatiko na ikarga ang sumunod na pahina kapag nakarating na sa dulo ng kasalukuyang pahina"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Open Access DOI rewrite"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Iwasan ang paywall sa pag-redirect sa open-access na bersyon ng pahahayagan kapagmakukuha"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -330,8 +325,8 @@ msgstr "Paraan"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -403,8 +398,8 @@ msgstr "Ang ginagamit natin na search engines"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -419,8 +414,8 @@ msgstr "Uri"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -438,7 +433,7 @@ msgstr "Harangan"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -448,7 +443,7 @@ msgstr "Ang settings ay nakalagay sa cookies upang hindi kami makakuha ng datos
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -458,7 +453,7 @@ msgstr "Hindi namin ginagamit ang cookies para i-track ka, ito ay para maging ma
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -466,14 +461,14 @@ msgstr "i-save"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "I-reset ang defaults"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -644,23 +639,23 @@ msgid "General"
msgstr "Pangkalahatan"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Engines"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Plugins"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Mga pangsagot"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cookies"
@@ -711,88 +706,78 @@ msgstr "Pumili ng estilo para sa tema na ito"
msgid "Style"
msgstr "Estilo"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Open Access DOI resolver"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Redirect to open-access versions of publications when available (plugin required)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Shortcut"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Piniling wika"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Agwat ng oras"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Gitnang oras"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Ang max na oras"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Ito ang listahan ng instant answering modules ni searx."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Pangalan"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Mga keyword"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Paglalarawan"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Mga halimbawa"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Ito ang listahan ng cookies at ang kanilang value na inilagay ni searx sa iyon kompyuter."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Dahil sa listahan na iyon, maaari mong makita ang pagiging transparent ni searx."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Pangalan ng cookie"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Value"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "Search URL ng kasalukuyan na naka-save sa preferences"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/fr/LC_MESSAGES/messages.mo b/searx/translations/fr/LC_MESSAGES/messages.mo
index 7fd3ee891..51d1006e9 100644
--- a/searx/translations/fr/LC_MESSAGES/messages.mo
+++ b/searx/translations/fr/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/fr/LC_MESSAGES/messages.po b/searx/translations/fr/LC_MESSAGES/messages.po
index 4c076ddbf..4d57cad74 100644
--- a/searx/translations/fr/LC_MESSAGES/messages.po
+++ b/searx/translations/fr/LC_MESSAGES/messages.po
@@ -7,6 +7,7 @@
# Benjamin Sonntag <benjamin@sonntag.fr>, 2014
# Cqoicebordel <david.barouh@wanadoo.fr>, 2014
# Cqoicebordel <david.barouh@wanadoo.fr>, 2014-2017
+# Étienne Deparis <etienne@depar.is>, 2019
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014
# Noémi Ványi <sitbackandwait@gmail.com>, 2017
# rike, 2014
@@ -15,9 +16,9 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-04-03 08:18+0000\n"
-"Last-Translator: Alexandre Flament <alex@al-f.net>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 18:27+0000\n"
+"Last-Translator: Noémi Ványi <sitbackandwait@gmail.com>\n"
"Language-Team: French (http://www.transifex.com/asciimoo/searx/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -38,63 +39,63 @@ msgstr "erreur de requête"
msgid "unexpected crash"
msgstr "crash inattendu"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "fichiers"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "général"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "musique"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "réseaux sociaux"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "images"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "vidéos"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "informatique"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "actualités"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "carte"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "science"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Paramètres non valides, veuillez éditer vos préférences"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Paramètres non valides"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "erreur de recherche"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "il y a {minutes} minute(s)"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "il y a {hours} heure(s), {minutes} minute(s)"
@@ -114,29 +115,28 @@ msgstr "Fonctions statistiques"
msgid "Compute {functions} of the arguments"
msgstr "Calcule les {functions} des arguments"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Temps du moteur (sec)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Chargement de la page (sec)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Nombre de résultats"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Score"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Score par résultat"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Erreur"
@@ -148,9 +148,15 @@ msgstr "{titre}&nbsp;(OBSOLETE)"
msgid "This entry has been superseded by"
msgstr "Cet item a été remplacé par"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Pas de résumé disponible pour cette publication."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "Utiliser DOAI"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Contourne les verrous payants de certaines publications scientifiques en redirigeant vers la version ouverte de ces papiers si elle est disponible."
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -164,16 +170,6 @@ msgstr "Défilement infini"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Charge automatiquement la page suivante quand vous arriver en bas de la page"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Utiliser Open Access DOI"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Contourne les verrous payants de certaines publications scientifiques en redirigeant vers la version ouverte de ces papiers si elle est disponible."
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -336,8 +332,8 @@ msgstr "Méthode"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -409,8 +405,8 @@ msgstr "Moteurs de recherche actuellement utilisés"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -425,8 +421,8 @@ msgstr "Catégorie"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -444,7 +440,7 @@ msgstr "Bloquer"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -454,7 +450,7 @@ msgstr "Ces paramètres sont stockés dans vos cookies ; ceci nous permet de ne
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -464,7 +460,7 @@ msgstr "Ces cookies existent pour votre confort d'utilisation, nous ne les utili
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -472,14 +468,14 @@ msgstr "enregistrer"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Remettre les valeurs par défaut"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -650,23 +646,23 @@ msgid "General"
msgstr "Général"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Moteurs"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Plugins"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Réponses instantanées"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cookies"
@@ -717,88 +713,78 @@ msgstr "Choisir un style pour ce thème"
msgid "Style"
msgstr "Style"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Résolveur Open Access DOI"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Rediriger vers les versions des articles en libre accès lorsqu'elles sont disponibles (nécessite un plugin)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Raccourcis"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Langue choisie"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Espace temporel"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Temps moy."
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Temps max"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Voici la liste des module de searx produisant une réponse instantanée."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Nom"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Mots clés"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Description"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Exemples"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "C'est une liste de cookies et de leurs valeurs que searx enregistre sur votre ordinateur."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Avec cette liste, vous pouvez juger de la transparence de searx."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Nom du cookie"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Valeur"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "Adresse de recherche des réglages actuels"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/gl/LC_MESSAGES/messages.mo b/searx/translations/gl/LC_MESSAGES/messages.mo
index 30d7b0dd6..e8724634e 100644
--- a/searx/translations/gl/LC_MESSAGES/messages.mo
+++ b/searx/translations/gl/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/gl/LC_MESSAGES/messages.po b/searx/translations/gl/LC_MESSAGES/messages.po
index 3e1e2230f..4634ed1b1 100644
--- a/searx/translations/gl/LC_MESSAGES/messages.po
+++ b/searx/translations/gl/LC_MESSAGES/messages.po
@@ -3,13 +3,13 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
-# Xosé M. Lamas <correo@xmgz.eu>, 2018
+# Xosé M. Lamas <correo@xmgz.eu>, 2018-2019
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-04-20 11:00+0000\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-26 06:08+0000\n"
"Last-Translator: Xosé M. Lamas <correo@xmgz.eu>\n"
"Language-Team: Galician (http://www.transifex.com/asciimoo/searx/language/gl/)\n"
"MIME-Version: 1.0\n"
@@ -31,63 +31,63 @@ msgstr "excepción na petición"
msgid "unexpected crash"
msgstr "fallo non agardado"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "ficheiros"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "xeral"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "música"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "Medios sociais"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "imaxes"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "vídeos"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "TIC"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "novas"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "mapa"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "ciencia"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Axustes non válidos, por favor edite a configuración"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Axustes non válidos"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "fallo na busca"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "hai {minutes} minuto(s)"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "hai {hours} hora(s), {minutes} minuto(s)"
@@ -107,29 +107,28 @@ msgstr "Funcións de estatística"
msgid "Compute {functions} of the arguments"
msgstr "Calcule {functions} dos argumentos"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Tempo de busca (sec)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Cargou en (seg)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Número de resultados"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Puntuacións"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Puntuacións por resultado"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Fallos"
@@ -141,9 +140,15 @@ msgstr "{title}&nbsp;(OBSOLETO)"
msgid "This entry has been superseded by"
msgstr "Esta entrada foi proporcionada por"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Non hai dispoñible un extracto para esta publicación."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "Reescritura DOAI"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Evitar muros de pago redirecciionando a versións públicas das publicacións cando estén dispoñibles"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -157,16 +162,6 @@ msgstr "Desplazamento infinito"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Cargar automáticamente a seguinte páxina ao desplazarse ao fondo da páxina actual"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Reescritura Open Access DOI"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Evitar muros de pago redirecciionando a versións públicas das publicacións cando estén dispoñibles"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -329,8 +324,8 @@ msgstr "Método"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -402,8 +397,8 @@ msgstr "Motores de busca utilizados actualmente"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -418,8 +413,8 @@ msgstr "Categoría"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -437,7 +432,7 @@ msgstr "Bloquear"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -447,7 +442,7 @@ msgstr "Estos axustes gárdanse en testemuños, esto permítenos non ter que gar
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -457,7 +452,7 @@ msgstr "Estos testemuños son para a súa conveniencia, non utilizamos estos tes
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -465,14 +460,14 @@ msgstr "gardar"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Restablecer"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -643,23 +638,23 @@ msgid "General"
msgstr "Xeral"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Motores"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Engadidos"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Respostas"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Testemuños"
@@ -710,88 +705,78 @@ msgstr "Escolla o estilo para este decorado"
msgid "Style"
msgstr "Estilo"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Resolutor Open Access DOI"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Redireccionar a versións abertas das publicacións cando estén dispoñibles (require o engadido)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Atallo"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Idioma seleccionado"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Rango temporal"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Tempo medio"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Tempo máx."
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Este é o listado dos módulos de respostas instantáneas de searx"
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Nome"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Palabras chave"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Descrición"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Exemplos"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Este é o listados dos testemuños e os seus valores que searx almacena na súa computadora."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Con esta lista vostede pode comprobar a transparencia de searx."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Nome do testemuño"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Valor"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "URL de busca dos axustes gardados actualmente."
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/he/LC_MESSAGES/messages.mo b/searx/translations/he/LC_MESSAGES/messages.mo
index c03402500..3f7f8b4b1 100644
--- a/searx/translations/he/LC_MESSAGES/messages.mo
+++ b/searx/translations/he/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/he/LC_MESSAGES/messages.po b/searx/translations/he/LC_MESSAGES/messages.po
index a7d0bcc32..c2e851d1d 100644
--- a/searx/translations/he/LC_MESSAGES/messages.po
+++ b/searx/translations/he/LC_MESSAGES/messages.po
@@ -4,7 +4,7 @@
#
# Translators:
# GenghisKhan <genghiskhan@gmx.ca>, 2015
-# GenghisKhan <genghiskhan@gmx.ca>, 2015-2017
+# GenghisKhan <genghiskhan@gmx.ca>, 2015-2017,2019
# pointhi, 2014
# rike, 2014
# stf <stefan.marsiske@gmail.com>, 2014
@@ -12,20 +12,20 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2017-11-01 20:31+0000\n"
-"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-03-17 10:52+0000\n"
+"Last-Translator: GenghisKhan <genghiskhan@gmx.ca>\n"
"Language-Team: Hebrew (http://www.transifex.com/asciimoo/searx/language/he/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.3.4\n"
"Language: he\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n"
#: searx/search.py:137 searx/search.py:182
msgid "timeout"
-msgstr ""
+msgstr "פקיעת זמן"
#: searx/search.py:144
msgid "request exception"
@@ -35,63 +35,63 @@ msgstr ""
msgid "unexpected crash"
msgstr ""
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "קבצים"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "כללי"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "מוזיקה"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "מדיה חברתית"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "תמונות"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "סרטונים"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "IT"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "חדשות"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "מפות"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "מדע"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "הגדרות שגויות, אנא ערוך את ההעדפות שלך"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
-msgstr ""
+msgstr "הגדרה לא חוקית"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "שגיאת חיפוש"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "לפני {minutes} דקות"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "לפני {hours} שעות, {minutes} דקות"
@@ -109,31 +109,30 @@ msgstr "פונקציות סטטיסטיקה"
#: searx/answerers/statistics/answerer.py:54
msgid "Compute {functions} of the arguments"
-msgstr ""
+msgstr "מחשב {functions} מתוך הארגומנטים"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "זמן מנוע (שניות)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "עומס עמוד (שניות)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "מספר תוצאות"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "דירוג"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "דירוג לכל תוצאה"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "שגיאות"
@@ -145,9 +144,15 @@ msgstr ""
msgid "This entry has been superseded by"
msgstr "רשומה זו הוחלפה על ידי"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr ""
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "שכתוב DOAI"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "הימנעות מקירות-תשלום (paywalls) על ידי הכוונה מחודשת לגרסאות כניסה-חופשית של כתבי-עת כאשר זמינות"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -161,16 +166,6 @@ msgstr "גלילה אינסופית"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "טען אוטומטית עמוד הלאה כאשר גוללים לתחתית של עמוד נוכחי"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr ""
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "הימנעות מקירות-תשלום (paywalls) על ידי הכוונה מחודשת לגרסאות כניסה-חופשית של כתבי-עת כאשר זמינות"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -333,8 +328,8 @@ msgstr "שיטה"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -406,8 +401,8 @@ msgstr "מנועי חיפוש בשימוש עתה"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -422,8 +417,8 @@ msgstr "קטגוריה"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -441,7 +436,7 @@ msgstr "חסום"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -451,7 +446,7 @@ msgstr "הגדרות אלו מאוחסנות בתוך העוגיות שלך, א
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -461,7 +456,7 @@ msgstr "עוגיות אלו משרתות את נוחותך הבלעדית, אנ
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -469,14 +464,14 @@ msgstr "שמור"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "אפס ברירות מחדל"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -634,11 +629,11 @@ msgstr "דרך פרוקסי"
#: searx/templates/oscar/macros.html:92
msgid "supported"
-msgstr ""
+msgstr "נתמך"
#: searx/templates/oscar/macros.html:96
msgid "not supported"
-msgstr ""
+msgstr "לא נתמך"
#: searx/templates/oscar/preferences.html:13
#: searx/templates/oscar/preferences.html:22
@@ -647,23 +642,23 @@ msgid "General"
msgstr "כללי"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "מנועים"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "תוספים"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "תשובות"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "עוגיות"
@@ -714,88 +709,78 @@ msgstr "בחירת סגנון עבור עיצוב זה"
msgid "Style"
msgstr "סגנון"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr ""
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr ""
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "קיצור דרך"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
-msgstr ""
+msgstr "שפה נבחרת"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "טווח זמן"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "זמן ממוצע"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "זמן מירבי"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr ""
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "שם"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "מילות מפתח"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "תיאור"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "דוגמאות"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "זוהי רשימה של עוגיות וערכיהן אשר searx מאחסנת על המחשב שלך."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "בעזרת רשימה זו, באפשרותך לגשת אל searx transparency."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "שם עוגייה"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "ערך"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
-msgstr ""
+msgstr "כתובת חיפוש של ההעדפות השמורות כעת"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
@@ -808,12 +793,12 @@ msgstr "תוצאות חיפוש"
#: searx/templates/oscar/results.html:21
#: searx/templates/simple/results.html:84
msgid "Try searching for:"
-msgstr ""
+msgstr "נסו לחפש:"
#: searx/templates/oscar/results.html:100
#: searx/templates/simple/results.html:25
msgid "Engines cannot retrieve results"
-msgstr ""
+msgstr "מנועים לא מסוגלים לאחזר תוצאות"
#: searx/templates/oscar/results.html:131
msgid "Links"
@@ -878,12 +863,12 @@ msgstr "אין כעת מידע זמין. "
#: searx/templates/oscar/messages/no_results.html:4
#: searx/templates/simple/messages/no_results.html:4
msgid "Engines cannot retrieve results."
-msgstr ""
+msgstr "מנועים לא מסוגלים לאחזר תוצאות."
#: searx/templates/oscar/messages/no_results.html:10
#: searx/templates/simple/messages/no_results.html:10
msgid "Please, try again later or find another searx instance."
-msgstr ""
+msgstr "בבקשה, נסו מאוחר יותר. לחלופין, ניתן להיעזר בשירות searx אחר."
#: searx/templates/oscar/messages/no_results.html:14
#: searx/templates/simple/messages/no_results.html:14
@@ -1002,16 +987,16 @@ msgstr "טען עוד..."
#: searx/templates/simple/base.html:31
msgid "No item found"
-msgstr ""
+msgstr "לא נמצא פריט"
#: searx/templates/simple/preferences.html:89
msgid "Supports selected language"
-msgstr ""
+msgstr "תומך בשפה נבחרת"
#: searx/templates/simple/preferences.html:118
msgid "User interface"
-msgstr ""
+msgstr "ממשק משתמש"
#: searx/templates/simple/preferences.html:154
msgid "Privacy"
-msgstr ""
+msgstr "פרטיות"
diff --git a/searx/translations/hr/LC_MESSAGES/messages.mo b/searx/translations/hr/LC_MESSAGES/messages.mo
index 9e232a151..47541917b 100644
--- a/searx/translations/hr/LC_MESSAGES/messages.mo
+++ b/searx/translations/hr/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/hr/LC_MESSAGES/messages.po b/searx/translations/hr/LC_MESSAGES/messages.po
index 104876cd6..94c5c7459 100644
--- a/searx/translations/hr/LC_MESSAGES/messages.po
+++ b/searx/translations/hr/LC_MESSAGES/messages.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2017-11-10 18:43+0000\n"
-"Last-Translator: Dino Dugandžija <ddugandz@tutanota.com>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: Noémi Ványi <sitbackandwait@gmail.com>\n"
"Language-Team: Croatian (http://www.transifex.com/asciimoo/searx/language/hr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -31,63 +31,63 @@ msgstr "zatraži iznimku"
msgid "unexpected crash"
msgstr "neočekivani pad"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "datoteke"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "općenito"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "glazba"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "društveni mediji"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "slike"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "video zapisi"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "it"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "vijesti"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "karta"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "znanost"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Nevažeće postavke, uredite svoje postavke"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Nevažeće postavke"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "greška u pretraživanju"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} minutu(minute, minuta) prije"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} sat(sata, sati), {minutes} minutu(minute, minuta) prije"
@@ -107,29 +107,28 @@ msgstr "Funkcije statistike"
msgid "Compute {functions} of the arguments"
msgstr "Izračunajte {functions} argumenata"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Vrijeme pretraživanja (sek)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Učitavanje stranice (sek)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Broj rezultata"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Pogodci"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Pogodci po rezultatu"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Greške"
@@ -141,9 +140,15 @@ msgstr "{title}&nbsp;(ZASTARJELO)"
msgid "This entry has been superseded by"
msgstr "Ovaj je unos zamijenio"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Nijedan sažetak nije dostupan za ovu objavu."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Izbjegnite plaćanje u slučaju dostupnosti besplatne objave"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -157,16 +162,6 @@ msgstr "Beskonačno pomicanje"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Automatski učitajte sljedeću stranicu kada se pomaknete do dna trenutne stranice"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Otvoreni pristup DOI prijepisa"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Izbjegnite plaćanje u slučaju dostupnosti besplatne objave"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -329,8 +324,8 @@ msgstr "Metoda"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -402,8 +397,8 @@ msgstr "Trenutno korištene tražilice"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -418,8 +413,8 @@ msgstr "Kategorija"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -437,7 +432,7 @@ msgstr "Blokiraj"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -447,7 +442,7 @@ msgstr "Ove postavke su pohranjene u Vašim kolačićima, što omogućuje da ne
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -457,7 +452,7 @@ msgstr "Ovi kolačići služe Vašoj pogodnosti, ne upotrebljavamo te kolačiće
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -465,14 +460,14 @@ msgstr "spremi"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Vraćanje zadanih postavki"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -643,23 +638,23 @@ msgid "General"
msgstr "Općenito"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Tražilice"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Dodaci"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Davatelji odgovora"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Kolačići"
@@ -710,88 +705,78 @@ msgstr "Odaberite stil za ovu temu"
msgid "Style"
msgstr "Stil"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Otvoreni pristup DOI rješenja"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Preusmjeri na verzije izdanja otvorenog pristupa kada je isto dostupno (potreban je dodatak)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Prečac"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Odabrani jezik"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Vremenski raspon"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Prosječno vrijeme"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Maksimalno vrijeme"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Ovo je popis searx modula za odgovore"
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Naziv"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Ključne riječi"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Opis"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Primjeri"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Ovo je popis kolačića i njihovih vrijednosti koje pohranjuju na Vašem računalu."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "S tim popisom možete procijeniti transparentnost pretraživanja."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Naziv kolačića"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Vrijednost"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "Pretraži URL adresu trenutno spremljenih postavki"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/hu/LC_MESSAGES/messages.mo b/searx/translations/hu/LC_MESSAGES/messages.mo
index 392dc99df..c8fbd03a0 100644
--- a/searx/translations/hu/LC_MESSAGES/messages.mo
+++ b/searx/translations/hu/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/hu/LC_MESSAGES/messages.po b/searx/translations/hu/LC_MESSAGES/messages.po
index 58383cd26..8a29dcf65 100644
--- a/searx/translations/hu/LC_MESSAGES/messages.po
+++ b/searx/translations/hu/LC_MESSAGES/messages.po
@@ -11,8 +11,8 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2017-11-03 11:14+0000\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
"Language-Team: Hungarian (http://www.transifex.com/asciimoo/searx/language/hu/)\n"
"MIME-Version: 1.0\n"
@@ -34,63 +34,63 @@ msgstr "kérés hiba"
msgid "unexpected crash"
msgstr "nem várt hiba"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "fájlok"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "általános"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "zene"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "közösségi média"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "képek"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "videók"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "it"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "hírek"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "térkép"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "tudomány"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Érvénytelen beállítások"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "érvénytelen beállítások"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "keresési hiba"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} perce"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} óra, {minutes} perce"
@@ -110,29 +110,28 @@ msgstr "Statisztikai függvények"
msgid "Compute {functions} of the arguments"
msgstr "{functions} függvények alkalmazása az argumentumokon"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Keresési idő (másodperc)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Válaszidők (sec)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Találatok száma"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Pontszámok"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Pontszámok találatonként"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Hibák"
@@ -144,9 +143,15 @@ msgstr "{title}&nbsp;(ELAVULT)"
msgid "This entry has been superseded by"
msgstr "Ezt a bejegyzést törölte:"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Nem elérhető absztrakt a publikációhoz."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "Szabad publikációs oldalak"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Publikácós linkeknél szabad forrás használat, amennyiben lehetséges"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -160,16 +165,6 @@ msgstr "Végtelenített találatok"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "További találatok automatikus betöltése"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Szabad DOI használat"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Publikácós linkeknél szabad forrás használat, amennyiben lehetséges"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -332,8 +327,8 @@ msgstr "Method"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -405,8 +400,8 @@ msgstr "Jelenleg használt keresők"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -421,8 +416,8 @@ msgstr "Kategória"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -440,7 +435,7 @@ msgstr "Tiltás"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -450,7 +445,7 @@ msgstr "Ezek a beállítások csak a böngésző cookie-jaiban tárolódnak."
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -460,7 +455,7 @@ msgstr "Ezek a cookie-k csak kényelmi funkciókat látnak el, nem használjuk a
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -468,14 +463,14 @@ msgstr "mentés"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Alapbeállítások visszaállítása"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -646,23 +641,23 @@ msgid "General"
msgstr "Általános"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Keresőmotorok"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Pluginek"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Válaszok"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Sütik"
@@ -713,88 +708,78 @@ msgstr "Válassz megjelenést ehhez a témához"
msgid "Style"
msgstr "Megjelenés"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Szabad DOI feloldó"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Átirányítás a publikáció szabadon elérhető változatára (plugin szükséges)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Rövidítés"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Kiválasztott nyelv"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Idő szűrés"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Átlag idő"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Maximális idő"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Az alábbi lista tartalmazza searx instant válaszoló moduljait."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Név"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Kulcsszavak"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Leírás"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Példák"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Searx által használt sütik listája."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Ez a lista a kereső transzparenciáját hivatott megmutatni."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Süti név"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Érték"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "Keresési URL a beállítások alapján"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/ia/LC_MESSAGES/messages.mo b/searx/translations/ia/LC_MESSAGES/messages.mo
new file mode 100644
index 000000000..bc33d9b46
--- /dev/null
+++ b/searx/translations/ia/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/ia/LC_MESSAGES/messages.po b/searx/translations/ia/LC_MESSAGES/messages.po
new file mode 100644
index 000000000..7c59968bc
--- /dev/null
+++ b/searx/translations/ia/LC_MESSAGES/messages.po
@@ -0,0 +1,998 @@
+# Translations template for PROJECT.
+# Copyright (C) 2017 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+#
+# Translators:
+# Guimarães Mello <matheus.mello@disroot.org>, 2017,2019
+msgid ""
+msgstr ""
+"Project-Id-Version: searx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-09-30 14:07+0000\n"
+"Last-Translator: Guimarães Mello <matheus.mello@disroot.org>\n"
+"Language-Team: Interlingua (http://www.transifex.com/asciimoo/searx/language/ia/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.3.4\n"
+"Language: ia\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: searx/search.py:137 searx/search.py:182
+msgid "timeout"
+msgstr "tempore finite"
+
+#: searx/search.py:144
+msgid "request exception"
+msgstr "requesta un exception"
+
+#: searx/search.py:151
+msgid "unexpected crash"
+msgstr "crash impreviste"
+
+#: searx/webapp.py:135
+msgid "files"
+msgstr "files"
+
+#: searx/webapp.py:136
+msgid "general"
+msgstr "general"
+
+#: searx/webapp.py:137
+msgid "music"
+msgstr "musica"
+
+#: searx/webapp.py:138
+msgid "social media"
+msgstr "medios social"
+
+#: searx/webapp.py:139
+msgid "images"
+msgstr "imagines"
+
+#: searx/webapp.py:140
+msgid "videos"
+msgstr "videos"
+
+#: searx/webapp.py:141
+msgid "it"
+msgstr "software"
+
+#: searx/webapp.py:142
+msgid "news"
+msgstr "novas"
+
+#: searx/webapp.py:143
+msgid "map"
+msgstr "mappa"
+
+#: searx/webapp.py:144
+msgid "science"
+msgstr "scientia"
+
+#: searx/webapp.py:398 searx/webapp.py:653
+msgid "Invalid settings, please edit your preferences"
+msgstr "Configurationes non valide, per favor, modifica tu preferentias."
+
+#: searx/webapp.py:410
+msgid "Invalid settings"
+msgstr "Configurationes invalide"
+
+#: searx/webapp.py:444 searx/webapp.py:488
+msgid "search error"
+msgstr "error in recerca"
+
+#: searx/webapp.py:525
+msgid "{minutes} minute(s) ago"
+msgstr "{minutes} minuta(s) retro"
+
+#: searx/webapp.py:527
+msgid "{hours} hour(s), {minutes} minute(s) ago"
+msgstr "{hours} hora(s), {minutes} minuta(s) retro"
+
+#: searx/answerers/random/answerer.py:53
+msgid "Random value generator"
+msgstr "Generator de valores aleatori"
+
+#: searx/answerers/random/answerer.py:54
+msgid "Generate different random values"
+msgstr "Generar differente valores aleatori"
+
+#: searx/answerers/statistics/answerer.py:53
+msgid "Statistics functions"
+msgstr "Functiones statistic"
+
+#: searx/answerers/statistics/answerer.py:54
+msgid "Compute {functions} of the arguments"
+msgstr "Computa {functions} del argumentos"
+
+#: searx/engines/__init__.py:194
+msgid "Engine time (sec)"
+msgstr "Tempore de motor (secundas)"
+
+#: searx/engines/__init__.py:198
+msgid "Page loads (sec)"
+msgstr "Cargas de pagina (secundas)"
+
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
+#: searx/templates/simple/results.html:20
+msgid "Number of results"
+msgstr "Numero de resultatos"
+
+#: searx/engines/__init__.py:206
+msgid "Scores"
+msgstr "Punctos"
+
+#: searx/engines/__init__.py:210
+msgid "Scores per result"
+msgstr "Punctos per resultato"
+
+#: searx/engines/__init__.py:214
+msgid "Errors"
+msgstr "Errores"
+
+#: searx/engines/pdbe.py:87
+msgid "{title}&nbsp;(OBSOLETE)"
+msgstr "{title}&nbsp;(OBSOLETE)"
+
+#: searx/engines/pdbe.py:91
+msgid "This entry has been superseded by"
+msgstr "Iste entrata esseva substituite per"
+
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "rescriber DOAI "
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Evita paywalls per redirectionar a versiones de publicationes in accesso aperte, quando disponibile"
+
+#: searx/plugins/https_rewrite.py:32
+msgid "Rewrite HTTP links to HTTPS if possible"
+msgstr "Rescriber ligamines HTTP a HTTPS si possibile"
+
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr "Rolamento infinite"
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr "Automaticamente cargar le proxime pagina quando arrivar al fundo del pagina actual"
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/simple/preferences.html:149
+msgid "Open result links on new browser tabs"
+msgstr "Aperir le resultatos sur nove schedas del navigator"
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr "Resultatos es aperite in le mesme fenestra per predefinition. Iste extension superscribe le comportamento predefinite pro aperir ligamines in nove schedas/fenestras. (JavaScript es necessari)"
+
+#: searx/plugins/search_on_category_select.py:18
+msgid "Search on category select"
+msgstr "Recercar in le categoria selectionate"
+
+#: searx/plugins/search_on_category_select.py:19
+msgid ""
+"Perform search immediately if a category selected. Disable to select "
+"multiple categories. (JavaScript required)"
+msgstr "Exequer le recerca immediatemente si un categoria es selectionate. Disactiva lo pro selectionar multiple categorias. (JavaScript es necessari)"
+
+#: searx/plugins/self_info.py:20
+msgid ""
+"Displays your IP if the query is \"ip\" and your user agent if the query "
+"contains \"user agent\"."
+msgstr "Monstra tu IP si le consulta es \"ip\"; e monstra tu agente de usator si le consulta contine \"user agent\"."
+
+#: searx/plugins/tracker_url_remover.py:26
+msgid "Tracker URL remover"
+msgstr "Remover tracker del URL"
+
+#: searx/plugins/tracker_url_remover.py:27
+msgid "Remove trackers arguments from the returned URL"
+msgstr "Remover argumentos del tracker ab le URL retornate"
+
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr "Vias breve de claviero tal como in Vim"
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr "Navigar in le resultatos de recerca per vias breve de claviero à la Vim (JavaScript es necessari). Pulsa le clave \"h\" super le pagina del resultato pro obtener adjuta."
+
+#: searx/templates/courgette/404.html:4 searx/templates/legacy/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+#: searx/templates/simple/404.html:4
+msgid "Page not found"
+msgstr "Pagina non trovate"
+
+#: searx/templates/courgette/404.html:6 searx/templates/legacy/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#: searx/templates/simple/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr "Ir al %(search_page)s."
+
+#: searx/templates/courgette/404.html:6 searx/templates/legacy/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#: searx/templates/simple/404.html:6
+msgid "search page"
+msgstr "pagina de recerca"
+
+#: searx/templates/courgette/index.html:9
+#: searx/templates/courgette/index.html:13
+#: searx/templates/courgette/results.html:5
+#: searx/templates/legacy/index.html:8 searx/templates/legacy/index.html:12
+#: searx/templates/oscar/navbar.html:7
+#: searx/templates/oscar/preferences.html:3
+#: searx/templates/pix-art/index.html:8
+msgid "preferences"
+msgstr "preferentias"
+
+#: searx/templates/courgette/index.html:11
+#: searx/templates/legacy/index.html:10 searx/templates/oscar/about.html:2
+#: searx/templates/oscar/navbar.html:6 searx/templates/pix-art/index.html:7
+msgid "about"
+msgstr "a proposito"
+
+#: searx/templates/courgette/preferences.html:5
+#: searx/templates/legacy/preferences.html:5
+#: searx/templates/oscar/preferences.html:8
+#: searx/templates/pix-art/preferences.html:5
+#: searx/templates/simple/preferences.html:26
+msgid "Preferences"
+msgstr "Preferentias"
+
+#: searx/templates/courgette/preferences.html:9
+#: searx/templates/legacy/preferences.html:9
+#: searx/templates/oscar/preferences.html:33
+#: searx/templates/oscar/preferences.html:35
+#: searx/templates/simple/preferences.html:34
+msgid "Default categories"
+msgstr "categorias predefinite"
+
+#: searx/templates/courgette/preferences.html:13
+#: searx/templates/legacy/preferences.html:14
+#: searx/templates/oscar/preferences.html:41
+#: searx/templates/pix-art/preferences.html:9
+#: searx/templates/simple/preferences.html:39
+#: searx/templates/simple/preferences.html:163
+msgid "Search language"
+msgstr "Lingua pro le recerca"
+
+#: searx/templates/courgette/preferences.html:16
+#: searx/templates/legacy/preferences.html:17
+#: searx/templates/oscar/languages.html:6
+#: searx/templates/pix-art/preferences.html:12
+#: searx/templates/simple/languages.html:2
+#: searx/templates/simple/preferences.html:42
+msgid "Default language"
+msgstr "Lingua predefinite"
+
+#: searx/templates/courgette/preferences.html:24
+#: searx/templates/legacy/preferences.html:25
+#: searx/templates/oscar/preferences.html:47
+#: searx/templates/pix-art/preferences.html:20
+#: searx/templates/simple/preferences.html:120
+msgid "Interface language"
+msgstr "Lingua del interfacie"
+
+#: searx/templates/courgette/preferences.html:34
+#: searx/templates/legacy/preferences.html:35
+#: searx/templates/oscar/preferences.html:57
+#: searx/templates/simple/preferences.html:51
+msgid "Autocomplete"
+msgstr "Autocompletar"
+
+#: searx/templates/courgette/preferences.html:45
+#: searx/templates/legacy/preferences.html:46
+#: searx/templates/oscar/preferences.html:68
+#: searx/templates/simple/preferences.html:166
+msgid "Image proxy"
+msgstr "Proxy pro imagines"
+
+#: searx/templates/courgette/preferences.html:48
+#: searx/templates/legacy/preferences.html:49
+#: searx/templates/oscar/preferences.html:72
+#: searx/templates/simple/preferences.html:169
+msgid "Enabled"
+msgstr "Activate"
+
+#: searx/templates/courgette/preferences.html:49
+#: searx/templates/legacy/preferences.html:50
+#: searx/templates/oscar/preferences.html:73
+#: searx/templates/simple/preferences.html:170
+msgid "Disabled"
+msgstr "Disactivate"
+
+#: searx/templates/courgette/preferences.html:54
+#: searx/templates/legacy/preferences.html:55
+#: searx/templates/oscar/preferences.html:77
+#: searx/templates/pix-art/preferences.html:30
+#: searx/templates/simple/preferences.html:156
+msgid "Method"
+msgstr "Methodo"
+
+#: searx/templates/courgette/preferences.html:63
+#: searx/templates/legacy/preferences.html:64
+#: searx/templates/oscar/preferences.html:86
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/simple/preferences.html:63
+#: searx/templates/simple/preferences.html:90
+msgid "SafeSearch"
+msgstr "Filtro de contento potentialmente offensive"
+
+#: searx/templates/courgette/preferences.html:66
+#: searx/templates/legacy/preferences.html:67
+#: searx/templates/oscar/preferences.html:90
+#: searx/templates/simple/preferences.html:66
+msgid "Strict"
+msgstr "Rigorose"
+
+#: searx/templates/courgette/preferences.html:67
+#: searx/templates/legacy/preferences.html:68
+#: searx/templates/oscar/preferences.html:91
+#: searx/templates/simple/preferences.html:67
+msgid "Moderate"
+msgstr "Moderate"
+
+#: searx/templates/courgette/preferences.html:68
+#: searx/templates/legacy/preferences.html:69
+#: searx/templates/oscar/preferences.html:92
+#: searx/templates/simple/preferences.html:68
+msgid "None"
+msgstr "Nulle"
+
+#: searx/templates/courgette/preferences.html:73
+#: searx/templates/legacy/preferences.html:74
+#: searx/templates/oscar/preferences.html:96
+#: searx/templates/pix-art/preferences.html:39
+#: searx/templates/simple/preferences.html:131
+msgid "Themes"
+msgstr "Themas"
+
+#: searx/templates/courgette/preferences.html:83
+msgid "Color"
+msgstr "Color"
+
+#: searx/templates/courgette/preferences.html:86
+msgid "Blue (default)"
+msgstr "Blau (standard)"
+
+#: searx/templates/courgette/preferences.html:87
+msgid "Violet"
+msgstr "Violette"
+
+#: searx/templates/courgette/preferences.html:88
+msgid "Green"
+msgstr "Verde"
+
+#: searx/templates/courgette/preferences.html:89
+msgid "Cyan"
+msgstr "Cyano"
+
+#: searx/templates/courgette/preferences.html:90
+msgid "Orange"
+msgstr "Orange"
+
+#: searx/templates/courgette/preferences.html:91
+msgid "Red"
+msgstr "Rubie"
+
+#: searx/templates/courgette/preferences.html:96
+#: searx/templates/legacy/preferences.html:93
+#: searx/templates/pix-art/preferences.html:49
+#: searx/templates/simple/preferences.html:77
+msgid "Currently used search engines"
+msgstr "Motores de recerca actualmente usate"
+
+#: searx/templates/courgette/preferences.html:100
+#: searx/templates/legacy/preferences.html:97
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
+#: searx/templates/pix-art/preferences.html:53
+#: searx/templates/simple/preferences.html:87
+msgid "Engine name"
+msgstr "Nomine del motor"
+
+#: searx/templates/courgette/preferences.html:101
+#: searx/templates/legacy/preferences.html:98
+msgid "Category"
+msgstr "Categoria"
+
+#: searx/templates/courgette/preferences.html:102
+#: searx/templates/courgette/preferences.html:113
+#: searx/templates/legacy/preferences.html:99
+#: searx/templates/legacy/preferences.html:110
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
+#: searx/templates/pix-art/preferences.html:54
+#: searx/templates/pix-art/preferences.html:64
+#: searx/templates/simple/preferences.html:86
+msgid "Allow"
+msgstr "Permitter"
+
+#: searx/templates/courgette/preferences.html:102
+#: searx/templates/courgette/preferences.html:114
+#: searx/templates/legacy/preferences.html:99
+#: searx/templates/legacy/preferences.html:111
+#: searx/templates/pix-art/preferences.html:54
+#: searx/templates/pix-art/preferences.html:65
+msgid "Block"
+msgstr "Blocar"
+
+#: searx/templates/courgette/preferences.html:122
+#: searx/templates/legacy/preferences.html:119
+#: searx/templates/oscar/preferences.html:285
+#: searx/templates/pix-art/preferences.html:73
+#: searx/templates/simple/preferences.html:180
+msgid ""
+"These settings are stored in your cookies, this allows us not to store this "
+"data about you."
+msgstr "Iste preferentias es salvate in tu cookies, le qual permitte nos non salvar iste datos super vos."
+
+#: searx/templates/courgette/preferences.html:124
+#: searx/templates/legacy/preferences.html:121
+#: searx/templates/oscar/preferences.html:287
+#: searx/templates/pix-art/preferences.html:75
+#: searx/templates/simple/preferences.html:182
+msgid ""
+"These cookies serve your sole convenience, we don't use these cookies to "
+"track you."
+msgstr "Iste cookies servi solmente a tu convenientia, nos non usa iste cookies pro traciar te."
+
+#: searx/templates/courgette/preferences.html:127
+#: searx/templates/legacy/preferences.html:124
+#: searx/templates/oscar/preferences.html:293
+#: searx/templates/pix-art/preferences.html:78
+#: searx/templates/simple/preferences.html:185
+msgid "save"
+msgstr "salveguardar"
+
+#: searx/templates/courgette/preferences.html:128
+#: searx/templates/legacy/preferences.html:125
+#: searx/templates/oscar/preferences.html:295
+#: searx/templates/simple/preferences.html:186
+msgid "Reset defaults"
+msgstr "Restablir configurationes"
+
+#: searx/templates/courgette/preferences.html:129
+#: searx/templates/legacy/preferences.html:126
+#: searx/templates/oscar/preferences.html:294
+#: searx/templates/pix-art/preferences.html:79
+#: searx/templates/simple/preferences.html:187
+msgid "back"
+msgstr "retroceder"
+
+#: searx/templates/courgette/results.html:12
+#: searx/templates/legacy/results.html:13
+#: searx/templates/oscar/results.html:136
+#: searx/templates/simple/results.html:58
+msgid "Search URL"
+msgstr "Recercar URL"
+
+#: searx/templates/courgette/results.html:16
+#: searx/templates/legacy/results.html:17
+#: searx/templates/oscar/results.html:141
+#: searx/templates/simple/results.html:62
+msgid "Download results"
+msgstr "Discargar resultatos"
+
+#: searx/templates/courgette/results.html:34
+#: searx/templates/legacy/results.html:35
+#: searx/templates/simple/results.html:10
+msgid "Answers"
+msgstr "Replicas"
+
+#: searx/templates/courgette/results.html:42
+#: searx/templates/legacy/results.html:43
+#: searx/templates/oscar/results.html:116
+#: searx/templates/simple/results.html:42
+msgid "Suggestions"
+msgstr "Suggestiones"
+
+#: searx/templates/courgette/results.html:70
+#: searx/templates/legacy/results.html:81
+#: searx/templates/oscar/results.html:68 searx/templates/oscar/results.html:78
+#: searx/templates/simple/results.html:130
+msgid "previous page"
+msgstr "pagina previe"
+
+#: searx/templates/courgette/results.html:81
+#: searx/templates/legacy/results.html:92
+#: searx/templates/oscar/results.html:62 searx/templates/oscar/results.html:84
+#: searx/templates/simple/results.html:145
+msgid "next page"
+msgstr "pagina sequente"
+
+#: searx/templates/courgette/search.html:3
+#: searx/templates/legacy/search.html:3 searx/templates/oscar/search.html:6
+#: searx/templates/oscar/search_full.html:9
+#: searx/templates/pix-art/search.html:3 searx/templates/simple/search.html:4
+msgid "Search for..."
+msgstr "Recercar re..."
+
+#: searx/templates/courgette/stats.html:4 searx/templates/legacy/stats.html:4
+#: searx/templates/oscar/stats.html:5 searx/templates/pix-art/stats.html:4
+#: searx/templates/simple/stats.html:7
+msgid "Engine stats"
+msgstr "Statisticas de motores"
+
+#: searx/templates/courgette/result_templates/images.html:4
+#: searx/templates/legacy/result_templates/images.html:4
+#: searx/templates/pix-art/result_templates/images.html:4
+msgid "original context"
+msgstr "contexto original"
+
+#: searx/templates/courgette/result_templates/torrent.html:7
+#: searx/templates/legacy/result_templates/torrent.html:11
+#: searx/templates/oscar/result_templates/torrent.html:6
+#: searx/templates/simple/result_templates/torrent.html:9
+msgid "Seeder"
+msgstr "Seeder"
+
+#: searx/templates/courgette/result_templates/torrent.html:7
+#: searx/templates/legacy/result_templates/torrent.html:11
+#: searx/templates/oscar/result_templates/torrent.html:6
+#: searx/templates/simple/result_templates/torrent.html:9
+msgid "Leecher"
+msgstr "Leecher"
+
+#: searx/templates/courgette/result_templates/torrent.html:9
+#: searx/templates/legacy/result_templates/torrent.html:9
+#: searx/templates/oscar/macros.html:23
+#: searx/templates/simple/result_templates/torrent.html:6
+msgid "magnet link"
+msgstr "ligamine magnetic"
+
+#: searx/templates/courgette/result_templates/torrent.html:10
+#: searx/templates/legacy/result_templates/torrent.html:10
+#: searx/templates/oscar/macros.html:24
+#: searx/templates/simple/result_templates/torrent.html:7
+msgid "torrent file"
+msgstr "file torrente"
+
+#: searx/templates/legacy/categories.html:8
+#: searx/templates/simple/categories.html:6
+msgid "Click on the magnifier to perform search"
+msgstr "Clicca sur le lupa pro exequer le recerca"
+
+#: searx/templates/legacy/preferences.html:84
+#: searx/templates/oscar/preferences.html:113
+#: searx/templates/simple/preferences.html:142
+msgid "Results on new tabs"
+msgstr "Resultatos sur nove schedas"
+
+#: searx/templates/legacy/preferences.html:87
+#: searx/templates/oscar/preferences.html:117
+#: searx/templates/simple/preferences.html:145
+msgid "On"
+msgstr "Activate"
+
+#: searx/templates/legacy/preferences.html:88
+#: searx/templates/oscar/preferences.html:118
+#: searx/templates/simple/preferences.html:146
+msgid "Off"
+msgstr "Disactivate"
+
+#: searx/templates/legacy/result_templates/code.html:3
+#: searx/templates/legacy/result_templates/default.html:3
+#: searx/templates/legacy/result_templates/map.html:9
+#: searx/templates/oscar/macros.html:34 searx/templates/oscar/macros.html:48
+#: searx/templates/simple/macros.html:43
+msgid "cached"
+msgstr "in cache"
+
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr "Configurationes avantiate"
+
+#: searx/templates/oscar/base.html:62
+#: searx/templates/oscar/messages/first_time.html:4
+#: searx/templates/oscar/messages/save_settings_successfull.html:5
+#: searx/templates/oscar/messages/unknow_error.html:5
+msgid "Close"
+msgstr "Clauder"
+
+#: searx/templates/oscar/base.html:64
+#: searx/templates/oscar/messages/no_results.html:4
+#: searx/templates/simple/messages/no_results.html:4
+#: searx/templates/simple/results.html:25
+msgid "Error!"
+msgstr "Error!"
+
+#: searx/templates/oscar/base.html:90 searx/templates/simple/base.html:55
+msgid "Powered by"
+msgstr "Actionate per"
+
+#: searx/templates/oscar/base.html:90 searx/templates/simple/base.html:55
+msgid "a privacy-respecting, hackable metasearch engine"
+msgstr "un motor de meta-recerca, capabile de reprogrammation e respectuose al confidentialitate"
+
+#: searx/templates/oscar/macros.html:36 searx/templates/oscar/macros.html:50
+#: searx/templates/simple/macros.html:43
+msgid "proxied"
+msgstr "per proxy"
+
+#: searx/templates/oscar/macros.html:92
+msgid "supported"
+msgstr "supportate"
+
+#: searx/templates/oscar/macros.html:96
+msgid "not supported"
+msgstr "non supportate"
+
+#: searx/templates/oscar/preferences.html:13
+#: searx/templates/oscar/preferences.html:22
+#: searx/templates/simple/preferences.html:32
+msgid "General"
+msgstr "General"
+
+#: searx/templates/oscar/preferences.html:14
+#: searx/templates/oscar/preferences.html:134
+#: searx/templates/simple/preferences.html:76
+msgid "Engines"
+msgstr "Motores"
+
+#: searx/templates/oscar/preferences.html:15
+#: searx/templates/oscar/preferences.html:207
+msgid "Plugins"
+msgstr "Extensiones"
+
+#: searx/templates/oscar/preferences.html:16
+#: searx/templates/oscar/preferences.html:233
+msgid "Answerers"
+msgstr "Modulos de Responsa"
+
+#: searx/templates/oscar/preferences.html:17
+#: searx/templates/oscar/preferences.html:260
+msgid "Cookies"
+msgstr "Cookies"
+
+#: searx/templates/oscar/preferences.html:42
+#: searx/templates/simple/preferences.html:48
+msgid "What language do you prefer for search?"
+msgstr "Qual lingua tu prefere pro recercar? "
+
+#: searx/templates/oscar/preferences.html:48
+#: searx/templates/simple/preferences.html:128
+msgid "Change the language of the layout"
+msgstr "Cambia le lingua del interfacie"
+
+#: searx/templates/oscar/preferences.html:58
+#: searx/templates/simple/preferences.html:60
+msgid "Find stuff as you type"
+msgstr "Trova cosas durante que tu scribe"
+
+#: searx/templates/oscar/preferences.html:69
+#: searx/templates/simple/preferences.html:173
+msgid "Proxying image results through searx"
+msgstr "Usar proxy pro obtener resultatos de imagines per searx"
+
+#: searx/templates/oscar/preferences.html:78
+msgid ""
+"Change how forms are submited, <a "
+"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
+" rel=\"external\">learn more about request methods</a>"
+msgstr "Cambiar como le formularios es submittite. <a href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\" rel=\"external\"> apprende plus re methodos de requesta </a>"
+
+#: searx/templates/oscar/preferences.html:87
+#: searx/templates/simple/preferences.html:71
+msgid "Filter content"
+msgstr "Filtrar contento"
+
+#: searx/templates/oscar/preferences.html:97
+#: searx/templates/simple/preferences.html:139
+msgid "Change searx layout"
+msgstr "Cambiar le interfacie de searx"
+
+#: searx/templates/oscar/preferences.html:106
+#: searx/templates/oscar/preferences.html:111
+msgid "Choose style for this theme"
+msgstr "Selectiona un stilo pro iste thema"
+
+#: searx/templates/oscar/preferences.html:106
+#: searx/templates/oscar/preferences.html:111
+msgid "Style"
+msgstr "Stilo"
+
+#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:163
+#: searx/templates/simple/preferences.html:88
+msgid "Shortcut"
+msgstr "Via breve"
+
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
+msgid "Selected language"
+msgstr "Lingua selectionate"
+
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/simple/preferences.html:91
+msgid "Time range"
+msgstr "Intervallo de tempore"
+
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/simple/preferences.html:92
+msgid "Avg. time"
+msgstr "Tempore medie"
+
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/simple/preferences.html:93
+msgid "Max time"
+msgstr "Tempore maxime"
+
+#: searx/templates/oscar/preferences.html:236
+msgid "This is the list of searx's instant answering modules."
+msgstr "Isto es le lista del modulos de responsa instantanee de searx."
+
+#: searx/templates/oscar/preferences.html:240
+msgid "Name"
+msgstr "Nomine"
+
+#: searx/templates/oscar/preferences.html:241
+msgid "Keywords"
+msgstr "Parolas clave"
+
+#: searx/templates/oscar/preferences.html:242
+msgid "Description"
+msgstr "Description"
+
+#: searx/templates/oscar/preferences.html:243
+msgid "Examples"
+msgstr "Exemplos"
+
+#: searx/templates/oscar/preferences.html:263
+msgid ""
+"This is the list of cookies and their values searx is storing on your "
+"computer."
+msgstr "Isto es le lista de cookies e lor valores que searx salva in tu computator."
+
+#: searx/templates/oscar/preferences.html:264
+msgid "With that list, you can assess searx transparency."
+msgstr "Per iste lista, tu pote evalutar le transparentia de searx."
+
+#: searx/templates/oscar/preferences.html:269
+msgid "Cookie name"
+msgstr "Nomine de cookie"
+
+#: searx/templates/oscar/preferences.html:270
+msgid "Value"
+msgstr "Valor"
+
+#: searx/templates/oscar/preferences.html:289
+msgid "Search URL of the currently saved preferences"
+msgstr "URL de Recerca del preferentias actualmente salvate"
+
+#: searx/templates/oscar/preferences.html:289
+msgid ""
+"Note: specifying custom settings in the search URL can reduce privacy by "
+"leaking data to the clicked result sites."
+msgstr "Nota: specificar configurationes personalisate in le URL de Recerca pote reducer le confidentialitate per lassar escappar datos al sitos cliccate in le resultatos."
+
+#: searx/templates/oscar/results.html:17
+msgid "Search results"
+msgstr "Resultatos de recerca"
+
+#: searx/templates/oscar/results.html:21
+#: searx/templates/simple/results.html:84
+msgid "Try searching for:"
+msgstr "Essaya recercar pro:"
+
+#: searx/templates/oscar/results.html:100
+#: searx/templates/simple/results.html:25
+msgid "Engines cannot retrieve results"
+msgstr "Le motores non poteva obtener resultatos"
+
+#: searx/templates/oscar/results.html:131
+msgid "Links"
+msgstr "Ligamines"
+
+#: searx/templates/oscar/search.html:8
+#: searx/templates/oscar/search_full.html:11
+#: searx/templates/simple/search.html:5
+msgid "Start search"
+msgstr "Initiar recerca"
+
+#: searx/templates/oscar/stats.html:2
+msgid "stats"
+msgstr "statisticas"
+
+#: searx/templates/oscar/time-range.html:3
+#: searx/templates/simple/time-range.html:3
+msgid "Anytime"
+msgstr "Aliquando"
+
+#: searx/templates/oscar/time-range.html:6
+#: searx/templates/simple/time-range.html:6
+msgid "Last day"
+msgstr "Le die passate"
+
+#: searx/templates/oscar/time-range.html:9
+#: searx/templates/simple/time-range.html:9
+msgid "Last week"
+msgstr "Le septimana passate"
+
+#: searx/templates/oscar/time-range.html:12
+#: searx/templates/simple/time-range.html:12
+msgid "Last month"
+msgstr "Le mense passate"
+
+#: searx/templates/oscar/time-range.html:15
+#: searx/templates/simple/time-range.html:15
+msgid "Last year"
+msgstr "Le anno passate"
+
+#: searx/templates/oscar/messages/first_time.html:6
+#: searx/templates/oscar/messages/no_data_available.html:3
+msgid "Heads up!"
+msgstr "Attention!"
+
+#: searx/templates/oscar/messages/first_time.html:7
+msgid "It look like you are using searx first time."
+msgstr "Il pare que tu usa searx pro le prime vice."
+
+#: searx/templates/oscar/messages/no_cookies.html:3
+msgid "Information!"
+msgstr "Information!"
+
+#: searx/templates/oscar/messages/no_cookies.html:4
+msgid "currently, there are no cookies defined."
+msgstr "actualmente, il non ha cookies definite."
+
+#: searx/templates/oscar/messages/no_data_available.html:4
+msgid "There is currently no data available. "
+msgstr "Actualmente, il non ha datos disponibile."
+
+#: searx/templates/oscar/messages/no_results.html:4
+#: searx/templates/simple/messages/no_results.html:4
+msgid "Engines cannot retrieve results."
+msgstr "Le motores non poteva obtener resultatos."
+
+#: searx/templates/oscar/messages/no_results.html:10
+#: searx/templates/simple/messages/no_results.html:10
+msgid "Please, try again later or find another searx instance."
+msgstr "Per favor, essaya de novo plus tarde o trova un altere instantia de searx"
+
+#: searx/templates/oscar/messages/no_results.html:14
+#: searx/templates/simple/messages/no_results.html:14
+msgid "Sorry!"
+msgstr "Pardono!"
+
+#: searx/templates/oscar/messages/no_results.html:15
+#: searx/templates/simple/messages/no_results.html:15
+msgid ""
+"we didn't find any results. Please use another query or search in more "
+"categories."
+msgstr "Nos trovava nulle resultatos. Per favor, usa altere consulta o recerca in plus categorias."
+
+#: searx/templates/oscar/messages/save_settings_successfull.html:7
+msgid "Well done!"
+msgstr "Bravo!"
+
+#: searx/templates/oscar/messages/save_settings_successfull.html:8
+msgid "Settings saved successfully."
+msgstr "Le configurationes es salvate con successo."
+
+#: searx/templates/oscar/messages/unknow_error.html:7
+msgid "Oh snap!"
+msgstr "Oh no!"
+
+#: searx/templates/oscar/messages/unknow_error.html:8
+msgid "Something went wrong."
+msgstr "Alco occurreva mal."
+
+#: searx/templates/oscar/result_templates/default.html:7
+#: searx/templates/simple/result_templates/default.html:6
+msgid "show media"
+msgstr "monstrar multimedia"
+
+#: searx/templates/oscar/result_templates/default.html:7
+#: searx/templates/simple/result_templates/default.html:6
+msgid "hide media"
+msgstr "occultar multimedia"
+
+#: searx/templates/oscar/result_templates/images.html:30
+msgid "Get image"
+msgstr "Obtener imagine"
+
+#: searx/templates/oscar/result_templates/images.html:33
+msgid "View source"
+msgstr "Vider fonte"
+
+#: searx/templates/oscar/result_templates/map.html:7
+#: searx/templates/simple/result_templates/map.html:7
+msgid "show map"
+msgstr "monstrar mappa"
+
+#: searx/templates/oscar/result_templates/map.html:7
+#: searx/templates/simple/result_templates/map.html:7
+msgid "hide map"
+msgstr "occultar mappa"
+
+#: searx/templates/oscar/result_templates/map.html:11
+#: searx/templates/simple/result_templates/map.html:11
+msgid "show details"
+msgstr "monstrar detalios"
+
+#: searx/templates/oscar/result_templates/map.html:11
+#: searx/templates/simple/result_templates/map.html:11
+msgid "hide details"
+msgstr "occultar detalios"
+
+#: searx/templates/oscar/result_templates/torrent.html:7
+#: searx/templates/simple/result_templates/torrent.html:11
+msgid "Filesize"
+msgstr "Dimension del file"
+
+#: searx/templates/oscar/result_templates/torrent.html:9
+#: searx/templates/simple/result_templates/torrent.html:12
+msgid "Bytes"
+msgstr "Bytes"
+
+#: searx/templates/oscar/result_templates/torrent.html:10
+#: searx/templates/simple/result_templates/torrent.html:13
+msgid "kiB"
+msgstr "kiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:11
+#: searx/templates/simple/result_templates/torrent.html:14
+msgid "MiB"
+msgstr "MiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:12
+#: searx/templates/simple/result_templates/torrent.html:15
+msgid "GiB"
+msgstr "GiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:13
+#: searx/templates/simple/result_templates/torrent.html:16
+msgid "TiB"
+msgstr "TiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:15
+#: searx/templates/simple/result_templates/torrent.html:20
+msgid "Number of Files"
+msgstr "Numero de Files"
+
+#: searx/templates/oscar/result_templates/videos.html:7
+#: searx/templates/simple/result_templates/videos.html:6
+msgid "show video"
+msgstr "monstrar video"
+
+#: searx/templates/oscar/result_templates/videos.html:7
+#: searx/templates/simple/result_templates/videos.html:6
+msgid "hide video"
+msgstr "occultar video"
+
+#: searx/templates/pix-art/results.html:28
+msgid "Load more..."
+msgstr "Cargar plus..."
+
+#: searx/templates/simple/base.html:31
+msgid "No item found"
+msgstr "Nulle item trovate"
+
+#: searx/templates/simple/preferences.html:89
+msgid "Supports selected language"
+msgstr "Supporta le lingua selectionate"
+
+#: searx/templates/simple/preferences.html:118
+msgid "User interface"
+msgstr "Interfacie del usator"
+
+#: searx/templates/simple/preferences.html:154
+msgid "Privacy"
+msgstr "Confidentialitate"
diff --git a/searx/translations/it/LC_MESSAGES/messages.mo b/searx/translations/it/LC_MESSAGES/messages.mo
index 53eca9e67..729c4ecc9 100644
--- a/searx/translations/it/LC_MESSAGES/messages.mo
+++ b/searx/translations/it/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/it/LC_MESSAGES/messages.po b/searx/translations/it/LC_MESSAGES/messages.po
index c2d5c8588..ba5c5e39e 100644
--- a/searx/translations/it/LC_MESSAGES/messages.po
+++ b/searx/translations/it/LC_MESSAGES/messages.po
@@ -11,14 +11,14 @@
# Federico <fedett@gmail.com>, 2018
# Luca C <mybusiness@yopmail.com>, 2017
# Luc <luc.absil2@gmail.com>, 2015
-# Random_R, 2018
+# Random_R, 2018-2019
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-10-16 15:53+0000\n"
-"Last-Translator: caoswave\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-11-19 10:03+0000\n"
+"Last-Translator: Random_R\n"
"Language-Team: Italian (http://www.transifex.com/asciimoo/searx/language/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -39,63 +39,63 @@ msgstr "eccezione della richiesta"
msgid "unexpected crash"
msgstr "crash inaspettato"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "documenti"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "generale"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "musica"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "social"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "immagini"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "video"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "IT"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "notizie"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "mappe"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "scienza"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Impostazioni non valide, modifica le tue preferenze"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Impostazioni non valide"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "errore di ricerca"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "di {minutes} minuti fa"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "di {hours} ore e {minutes} minuti fa"
@@ -115,29 +115,28 @@ msgstr "Funzioni statistiche"
msgid "Compute {functions} of the arguments"
msgstr "Calcola {functions} degli argomenti"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Tempo del motore (secondi)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr " Caricamento della pagina (secondi)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Numero di risultati"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Punteggio"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Punteggio per risultato"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Errori"
@@ -149,9 +148,15 @@ msgstr "{title}&nbsp;(OBSOLETO)"
msgid "This entry has been superseded by"
msgstr "Questa voce è stata sostituita da"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Nessun sommario disponibile per questa pubblicazione"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "Reindirizzamento DOAI"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Se possibile, evita il paywall di una pubblicazione reindirizzando ad una versione ad accesso libero"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -165,16 +170,6 @@ msgstr "Scorrimento infinito"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Carica automaticamente la pagina successiva quando si scorre sino alla fine della pagina attuale"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Reindirizzamento Open Access DOI"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Se possibile, evita il paywall di una pubblicazione reindirizzando ad una versione libera"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -185,7 +180,7 @@ msgstr "Apri i risultati in nuove schede del browser"
msgid ""
"Results are opened in the same window by default. This plugin overwrites the"
" default behaviour to open links on new tabs/windows. (JavaScript required)"
-msgstr "Di base i risultati sono aperti nella stessa finestra. Questa estensione fa sì invece che vengano mostrati in nuove schede/finestre. (Javascript necessario)\""
+msgstr "Di base i risultati sono aperti nella stessa finestra. Questa estensione fa sì invece che vengano mostrati in nuove schede/finestre. (Javascript necessario)"
#: searx/plugins/search_on_category_select.py:18
msgid "Search on category select"
@@ -195,7 +190,7 @@ msgstr "Cerca nella categoria selezionata"
msgid ""
"Perform search immediately if a category selected. Disable to select "
"multiple categories. (JavaScript required)"
-msgstr "Esegui la ricerca immediatamente se una categoria è selezionata. Disabilita questa opzione se vuoi selezionare più categorie. (Javascript necessario)\""
+msgstr "Esegui la ricerca immediatamente se una categoria è selezionata. Disabilita questa opzione se vuoi selezionare più categorie. (Javascript necessario)"
#: searx/plugins/self_info.py:20
msgid ""
@@ -205,7 +200,7 @@ msgstr "Mostra il tuo IP se hai cercato \"ip\" ed il tuo user agent se hai cerca
#: searx/plugins/tracker_url_remover.py:26
msgid "Tracker URL remover"
-msgstr "Rimuovi tracciamento URL"
+msgstr "Rimuovi URL traccianti"
#: searx/plugins/tracker_url_remover.py:27
msgid "Remove trackers arguments from the returned URL"
@@ -296,7 +291,7 @@ msgstr "Lingua predefinita"
#: searx/templates/pix-art/preferences.html:20
#: searx/templates/simple/preferences.html:120
msgid "Interface language"
-msgstr "Linguaggio dell'interfaccia"
+msgstr "Lingua dell'interfaccia"
#: searx/templates/courgette/preferences.html:34
#: searx/templates/legacy/preferences.html:35
@@ -337,8 +332,8 @@ msgstr "Metodo"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -349,21 +344,21 @@ msgstr "Ricerca Sicura"
#: searx/templates/oscar/preferences.html:90
#: searx/templates/simple/preferences.html:66
msgid "Strict"
-msgstr "Rigoroso"
+msgstr "Rigorosa"
#: searx/templates/courgette/preferences.html:67
#: searx/templates/legacy/preferences.html:68
#: searx/templates/oscar/preferences.html:91
#: searx/templates/simple/preferences.html:67
msgid "Moderate"
-msgstr "Moderato"
+msgstr "Moderata"
#: searx/templates/courgette/preferences.html:68
#: searx/templates/legacy/preferences.html:69
#: searx/templates/oscar/preferences.html:92
#: searx/templates/simple/preferences.html:68
msgid "None"
-msgstr "Nessuno"
+msgstr "Nessuna"
#: searx/templates/courgette/preferences.html:73
#: searx/templates/legacy/preferences.html:74
@@ -410,8 +405,8 @@ msgstr "Motori di ricerca attualmente in uso"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -426,8 +421,8 @@ msgstr "Categoria"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -445,7 +440,7 @@ msgstr "Blocca"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -455,7 +450,7 @@ msgstr "Le impostazioni vengono salvate nei tuoi cookie, consentendoci di non co
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -465,7 +460,7 @@ msgstr "Questi cookie servono solo ad offrirti un servizio migliore. Non li usia
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -473,14 +468,14 @@ msgstr "salva"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Reimposta i valori iniziali"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -651,30 +646,30 @@ msgid "General"
msgstr "Generale"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Motori"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Plugin"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Risponditori"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cookie"
#: searx/templates/oscar/preferences.html:42
#: searx/templates/simple/preferences.html:48
msgid "What language do you prefer for search?"
-msgstr "Lingua dei risultati di ricerca"
+msgstr "Che lingua preferisci per la ricerca?"
#: searx/templates/oscar/preferences.html:48
#: searx/templates/simple/preferences.html:128
@@ -706,7 +701,7 @@ msgstr "Filtro famiglia"
#: searx/templates/oscar/preferences.html:97
#: searx/templates/simple/preferences.html:139
msgid "Change searx layout"
-msgstr "Cambia il layout di searx"
+msgstr "Cambia l'aspetto di searx"
#: searx/templates/oscar/preferences.html:106
#: searx/templates/oscar/preferences.html:111
@@ -718,92 +713,82 @@ msgstr "Scegli lo stile per questo tema"
msgid "Style"
msgstr "Stile"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Resolver Open Access DOI"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Indirizza a versioni open-access delle pubblicazioni quando disponibili (plugin richiesto)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Scorciatoia"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Lingua selezionata"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Intervallo di tempo"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Tempo medio"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Tempo massimo"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Questa è la lista dei moduli searx con risposta immediata"
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Nome"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Parole chiave"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Descrizione"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Esempi"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Qui puoi vedere i cookie che vengono conservati sul tuo computer."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "In questo modo, puoi constatare la trasparenza di searx."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Nome del cookie"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Valore"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
-msgstr "Cerca URL delle preferenze attualmente salvate"
+msgstr "URL di ricerca delle preferenze attualmente salvate"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
-msgstr "Nota: specificando impostazioni personalizzate nella ricerca URL può ridurre la privacy facendo traperlare dati ai siti cliccati"
+msgstr "Nota: specificare impostazioni personalizzate nell'URL di ricerca può ridurre la privacy facendo trapelare dati ai siti cliccati"
#: searx/templates/oscar/results.html:17
msgid "Search results"
@@ -836,7 +821,7 @@ msgstr "statistiche"
#: searx/templates/oscar/time-range.html:3
#: searx/templates/simple/time-range.html:3
msgid "Anytime"
-msgstr "Di sempre"
+msgstr "Qualsiasi data"
#: searx/templates/oscar/time-range.html:6
#: searx/templates/simple/time-range.html:6
@@ -856,7 +841,7 @@ msgstr "Ultimo mese"
#: searx/templates/oscar/time-range.html:15
#: searx/templates/simple/time-range.html:15
msgid "Last year"
-msgstr "L'anno scorso"
+msgstr "Ultimo anno"
#: searx/templates/oscar/messages/first_time.html:6
#: searx/templates/oscar/messages/no_data_available.html:3
diff --git a/searx/translations/ja/LC_MESSAGES/messages.mo b/searx/translations/ja/LC_MESSAGES/messages.mo
index eb1267287..4bfa7bbeb 100644
--- a/searx/translations/ja/LC_MESSAGES/messages.mo
+++ b/searx/translations/ja/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/ja/LC_MESSAGES/messages.po b/searx/translations/ja/LC_MESSAGES/messages.po
index 24d2c359e..94f1504f3 100644
--- a/searx/translations/ja/LC_MESSAGES/messages.po
+++ b/searx/translations/ja/LC_MESSAGES/messages.po
@@ -6,6 +6,7 @@
# Akio Nishimura <akionux@gmail.com>, 2016-2018
# Thomas Pointhuber, 2014-2015
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014,2016
+# KAWASAKI ICHIRO, 2020
# Lucas Phillips <mail@lep.pw>, 2015
# Max <theshirinzu@gmail.com>, 2015
# Nobuhiro Iwamatsu <iwamatsu@nigauri.org>, 2018
@@ -15,9 +16,9 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-08-13 03:03+0000\n"
-"Last-Translator: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2020-01-20 14:30+0000\n"
+"Last-Translator: KAWASAKI ICHIRO\n"
"Language-Team: Japanese (http://www.transifex.com/asciimoo/searx/language/ja/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -38,63 +39,63 @@ msgstr "例外要求"
msgid "unexpected crash"
msgstr "予期しないクラッシュ"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "ファイル"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "一般"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "音楽"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "ソーシャルメディア"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "画像"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "動画"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "情報技術"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
-msgstr "お知らせ"
+msgstr "ニュース"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "地図"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "学問"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "不正な設定です。設定を編集してください。"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "不正な設定"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "検索エラー"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes}分前"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours}時間と{minutes}分前"
@@ -114,29 +115,28 @@ msgstr "統計機能"
msgid "Compute {functions} of the arguments"
msgstr "変数の{functions}を計算する"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "検索時間 (秒)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "ページ読み込み時間 (秒)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "通知の数"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "スコア"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "検索結果当たりスコア"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "エラー"
@@ -148,9 +148,15 @@ msgstr "{title}&nbsp;(廃止)"
msgid "This entry has been superseded by"
msgstr "このエントリーの優先"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "この出版物には要約がありません。"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "DOAI再書き込み"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "可能ならば出版物のオープンアクセス版へリダイレクトして有料の壁を避ける"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -164,16 +170,6 @@ msgstr "無限スクロール"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "現在のページの下端でスクロールすると自動的に次のページを読み込む"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "オープンアクセス DOI リライト"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "可能ならば出版物のオープンアクセス版へリダイレクトして有料の壁を避ける"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -336,8 +332,8 @@ msgstr "方法"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -409,8 +405,8 @@ msgstr "現在使用中の検索エンジン"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -425,8 +421,8 @@ msgstr "カテゴリー"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -444,7 +440,7 @@ msgstr "禁止する"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -454,7 +450,7 @@ msgstr "これらの設定はあなたのクッキーに保存されますが、
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -464,7 +460,7 @@ msgstr "クッキーはあなたが便利に使えるようにするために使
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -472,14 +468,14 @@ msgstr "保存"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "デフォルト設定に戻す"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -650,23 +646,23 @@ msgid "General"
msgstr "一般設定"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "検索エンジン"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "プラグイン"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "回答者"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "クッキー"
@@ -717,88 +713,78 @@ msgstr "このテーマのスタイルを選択"
msgid "Style"
msgstr "スタイル"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "オープンアクセス DOI リゾルバー"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "利用可能な場合(プラグインが必要)、オープンアクセス版の出版物にリダイレクトする"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "ショートカット"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "選択された言語"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "時間範囲"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "平均時間"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "最大時間"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "これは searx の即席回答モジュールのリストです。"
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "名前"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "キーワード"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "説明"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "例"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "これはクッキーのリストで、これらの値はあなたのコンピュータに保存されています。"
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "このリストによって、あなたは searx の透明性を評価できます。"
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "クッキー名"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "値"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "現在保存されている設定の検索 URL"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/lt/LC_MESSAGES/messages.mo b/searx/translations/lt/LC_MESSAGES/messages.mo
new file mode 100644
index 000000000..8f33a1660
--- /dev/null
+++ b/searx/translations/lt/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/lt/LC_MESSAGES/messages.po b/searx/translations/lt/LC_MESSAGES/messages.po
new file mode 100644
index 000000000..f9e4ffd6c
--- /dev/null
+++ b/searx/translations/lt/LC_MESSAGES/messages.po
@@ -0,0 +1,998 @@
+# Translations template for PROJECT.
+# Copyright (C) 2017 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+#
+# Translators:
+# Moo, 2019
+msgid ""
+msgstr ""
+"Project-Id-Version: searx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-11-02 12:57+0000\n"
+"Last-Translator: Moo\n"
+"Language-Team: Lithuanian (http://www.transifex.com/asciimoo/searx/language/lt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.3.4\n"
+"Language: lt\n"
+"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n"
+
+#: searx/search.py:137 searx/search.py:182
+msgid "timeout"
+msgstr "baigėsi laikas"
+
+#: searx/search.py:144
+msgid "request exception"
+msgstr "užklausos išimtis"
+
+#: searx/search.py:151
+msgid "unexpected crash"
+msgstr "netikėta strigtis"
+
+#: searx/webapp.py:135
+msgid "files"
+msgstr "failai"
+
+#: searx/webapp.py:136
+msgid "general"
+msgstr "bendra"
+
+#: searx/webapp.py:137
+msgid "music"
+msgstr "muzika"
+
+#: searx/webapp.py:138
+msgid "social media"
+msgstr "socialinė medija"
+
+#: searx/webapp.py:139
+msgid "images"
+msgstr "paveikslai"
+
+#: searx/webapp.py:140
+msgid "videos"
+msgstr "vaizdo įrašai"
+
+#: searx/webapp.py:141
+msgid "it"
+msgstr "IT"
+
+#: searx/webapp.py:142
+msgid "news"
+msgstr "naujienos"
+
+#: searx/webapp.py:143
+msgid "map"
+msgstr "žemėlapis"
+
+#: searx/webapp.py:144
+msgid "science"
+msgstr "mokslas"
+
+#: searx/webapp.py:398 searx/webapp.py:653
+msgid "Invalid settings, please edit your preferences"
+msgstr "Neteisingi nustatymai, pataisykite savo nuostatas"
+
+#: searx/webapp.py:410
+msgid "Invalid settings"
+msgstr "Neteisingi nustatymai"
+
+#: searx/webapp.py:444 searx/webapp.py:488
+msgid "search error"
+msgstr "paieškos klaida"
+
+#: searx/webapp.py:525
+msgid "{minutes} minute(s) ago"
+msgstr "prieš {minutes} min."
+
+#: searx/webapp.py:527
+msgid "{hours} hour(s), {minutes} minute(s) ago"
+msgstr "prieš {hours} val., {minutes} min."
+
+#: searx/answerers/random/answerer.py:53
+msgid "Random value generator"
+msgstr "Atsitiktinių reikmių generatorius"
+
+#: searx/answerers/random/answerer.py:54
+msgid "Generate different random values"
+msgstr "Generuoja įvairias atsitiktines reikšmes"
+
+#: searx/answerers/statistics/answerer.py:53
+msgid "Statistics functions"
+msgstr "Statistikos funkcijos"
+
+#: searx/answerers/statistics/answerer.py:54
+msgid "Compute {functions} of the arguments"
+msgstr "Skaičiuoti argumentų {functions} funkcijas"
+
+#: searx/engines/__init__.py:194
+msgid "Engine time (sec)"
+msgstr "Sistemos laikas (sek.)"
+
+#: searx/engines/__init__.py:198
+msgid "Page loads (sec)"
+msgstr "Puslapių įkėlimai (sek.)"
+
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
+#: searx/templates/simple/results.html:20
+msgid "Number of results"
+msgstr "Rezultatų skaičius"
+
+#: searx/engines/__init__.py:206
+msgid "Scores"
+msgstr "Įverčiai"
+
+#: searx/engines/__init__.py:210
+msgid "Scores per result"
+msgstr "Įverčiai pagal rezultatą"
+
+#: searx/engines/__init__.py:214
+msgid "Errors"
+msgstr "Klaidos"
+
+#: searx/engines/pdbe.py:87
+msgid "{title}&nbsp;(OBSOLETE)"
+msgstr "{title}&nbsp;(PASENĘS)"
+
+#: searx/engines/pdbe.py:91
+msgid "This entry has been superseded by"
+msgstr "Šį įrašą pakeitė"
+
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "DOAI perrašymas"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Vengti apmokamų sienų, kai įmanoma, peradresuojant į atviros prieigos publikacijų versijas"
+
+#: searx/plugins/https_rewrite.py:32
+msgid "Rewrite HTTP links to HTTPS if possible"
+msgstr "Jei įmanoma, perrašyti HTTP nuorodas į HTTPS"
+
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr "Begalinis slinkimas"
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr "Automatiškai įkelti kitą puslapį, kai nuslenkama į esamo puslapio apačią"
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/simple/preferences.html:149
+msgid "Open result links on new browser tabs"
+msgstr "Atverti rezultatų nuorodas naujose naršyklės kortelėse"
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr "Pagal numatymą, rezultatai yra atveriami tame pačiame lange. Šis įskiepis perrašo numatytąją elgseną taip, kad nuorodos būtų atveriamos naujose kortelėse/languose. (reikalinga JavaScript)"
+
+#: searx/plugins/search_on_category_select.py:18
+msgid "Search on category select"
+msgstr "Pasirinkus kategoriją, atlikti paiešką"
+
+#: searx/plugins/search_on_category_select.py:19
+msgid ""
+"Perform search immediately if a category selected. Disable to select "
+"multiple categories. (JavaScript required)"
+msgstr "Jei pasirenkama kategorija, nedelsiant atlikti paiešką. Išjunkite norėdami pasirinkti kelias kategorijas. (reikalinga JavaScript)"
+
+#: searx/plugins/self_info.py:20
+msgid ""
+"Displays your IP if the query is \"ip\" and your user agent if the query "
+"contains \"user agent\"."
+msgstr "Rodo jūsų IP adresą, jei užklausa yra \"ip\" ir jūsų naudotojo agentą, jei užklausoje yra \"user agent\"."
+
+#: searx/plugins/tracker_url_remover.py:26
+msgid "Tracker URL remover"
+msgstr "Seklių URL šalintojas"
+
+#: searx/plugins/tracker_url_remover.py:27
+msgid "Remove trackers arguments from the returned URL"
+msgstr "Šalinti seklių argumentus iš grąžinamų URL"
+
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr "Vim pavidalo spartieji klavišai"
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr "Naršyti po paieškos rezultatus naudojant Vim pavidalo sparčiuosius klavišus (reikalinga JavaScript). Paspauskite pagrindiniame ar rezultatų puslapyje \"h\" klavišą norėdami gauti pagalbos."
+
+#: searx/templates/courgette/404.html:4 searx/templates/legacy/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+#: searx/templates/simple/404.html:4
+msgid "Page not found"
+msgstr "Puslapis nerastas"
+
+#: searx/templates/courgette/404.html:6 searx/templates/legacy/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#: searx/templates/simple/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr "Pereiti į %(search_page)s."
+
+#: searx/templates/courgette/404.html:6 searx/templates/legacy/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#: searx/templates/simple/404.html:6
+msgid "search page"
+msgstr "paieškos puslapį"
+
+#: searx/templates/courgette/index.html:9
+#: searx/templates/courgette/index.html:13
+#: searx/templates/courgette/results.html:5
+#: searx/templates/legacy/index.html:8 searx/templates/legacy/index.html:12
+#: searx/templates/oscar/navbar.html:7
+#: searx/templates/oscar/preferences.html:3
+#: searx/templates/pix-art/index.html:8
+msgid "preferences"
+msgstr "nuostatos"
+
+#: searx/templates/courgette/index.html:11
+#: searx/templates/legacy/index.html:10 searx/templates/oscar/about.html:2
+#: searx/templates/oscar/navbar.html:6 searx/templates/pix-art/index.html:7
+msgid "about"
+msgstr "apie"
+
+#: searx/templates/courgette/preferences.html:5
+#: searx/templates/legacy/preferences.html:5
+#: searx/templates/oscar/preferences.html:8
+#: searx/templates/pix-art/preferences.html:5
+#: searx/templates/simple/preferences.html:26
+msgid "Preferences"
+msgstr "Nuostatos"
+
+#: searx/templates/courgette/preferences.html:9
+#: searx/templates/legacy/preferences.html:9
+#: searx/templates/oscar/preferences.html:33
+#: searx/templates/oscar/preferences.html:35
+#: searx/templates/simple/preferences.html:34
+msgid "Default categories"
+msgstr "Numatytosios kategorijos"
+
+#: searx/templates/courgette/preferences.html:13
+#: searx/templates/legacy/preferences.html:14
+#: searx/templates/oscar/preferences.html:41
+#: searx/templates/pix-art/preferences.html:9
+#: searx/templates/simple/preferences.html:39
+#: searx/templates/simple/preferences.html:163
+msgid "Search language"
+msgstr "Paieškos kalba"
+
+#: searx/templates/courgette/preferences.html:16
+#: searx/templates/legacy/preferences.html:17
+#: searx/templates/oscar/languages.html:6
+#: searx/templates/pix-art/preferences.html:12
+#: searx/templates/simple/languages.html:2
+#: searx/templates/simple/preferences.html:42
+msgid "Default language"
+msgstr "Numatytoji kalba"
+
+#: searx/templates/courgette/preferences.html:24
+#: searx/templates/legacy/preferences.html:25
+#: searx/templates/oscar/preferences.html:47
+#: searx/templates/pix-art/preferences.html:20
+#: searx/templates/simple/preferences.html:120
+msgid "Interface language"
+msgstr "Sąsajos kalba"
+
+#: searx/templates/courgette/preferences.html:34
+#: searx/templates/legacy/preferences.html:35
+#: searx/templates/oscar/preferences.html:57
+#: searx/templates/simple/preferences.html:51
+msgid "Autocomplete"
+msgstr "Automatinis užbaigimas"
+
+#: searx/templates/courgette/preferences.html:45
+#: searx/templates/legacy/preferences.html:46
+#: searx/templates/oscar/preferences.html:68
+#: searx/templates/simple/preferences.html:166
+msgid "Image proxy"
+msgstr "Paveikslų įgaliotasis serveris"
+
+#: searx/templates/courgette/preferences.html:48
+#: searx/templates/legacy/preferences.html:49
+#: searx/templates/oscar/preferences.html:72
+#: searx/templates/simple/preferences.html:169
+msgid "Enabled"
+msgstr "Įjungta"
+
+#: searx/templates/courgette/preferences.html:49
+#: searx/templates/legacy/preferences.html:50
+#: searx/templates/oscar/preferences.html:73
+#: searx/templates/simple/preferences.html:170
+msgid "Disabled"
+msgstr "Išjungta"
+
+#: searx/templates/courgette/preferences.html:54
+#: searx/templates/legacy/preferences.html:55
+#: searx/templates/oscar/preferences.html:77
+#: searx/templates/pix-art/preferences.html:30
+#: searx/templates/simple/preferences.html:156
+msgid "Method"
+msgstr "Metodas"
+
+#: searx/templates/courgette/preferences.html:63
+#: searx/templates/legacy/preferences.html:64
+#: searx/templates/oscar/preferences.html:86
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/simple/preferences.html:63
+#: searx/templates/simple/preferences.html:90
+msgid "SafeSearch"
+msgstr "Saugi paieška"
+
+#: searx/templates/courgette/preferences.html:66
+#: searx/templates/legacy/preferences.html:67
+#: searx/templates/oscar/preferences.html:90
+#: searx/templates/simple/preferences.html:66
+msgid "Strict"
+msgstr "Griežta"
+
+#: searx/templates/courgette/preferences.html:67
+#: searx/templates/legacy/preferences.html:68
+#: searx/templates/oscar/preferences.html:91
+#: searx/templates/simple/preferences.html:67
+msgid "Moderate"
+msgstr "Nuosaiki"
+
+#: searx/templates/courgette/preferences.html:68
+#: searx/templates/legacy/preferences.html:69
+#: searx/templates/oscar/preferences.html:92
+#: searx/templates/simple/preferences.html:68
+msgid "None"
+msgstr "Nėra"
+
+#: searx/templates/courgette/preferences.html:73
+#: searx/templates/legacy/preferences.html:74
+#: searx/templates/oscar/preferences.html:96
+#: searx/templates/pix-art/preferences.html:39
+#: searx/templates/simple/preferences.html:131
+msgid "Themes"
+msgstr "Apipavidalinimai"
+
+#: searx/templates/courgette/preferences.html:83
+msgid "Color"
+msgstr "Spalva"
+
+#: searx/templates/courgette/preferences.html:86
+msgid "Blue (default)"
+msgstr "Mėlyna (numatytoji)"
+
+#: searx/templates/courgette/preferences.html:87
+msgid "Violet"
+msgstr "Violetinė"
+
+#: searx/templates/courgette/preferences.html:88
+msgid "Green"
+msgstr "Žalia"
+
+#: searx/templates/courgette/preferences.html:89
+msgid "Cyan"
+msgstr "Žydra"
+
+#: searx/templates/courgette/preferences.html:90
+msgid "Orange"
+msgstr "Oranžinė"
+
+#: searx/templates/courgette/preferences.html:91
+msgid "Red"
+msgstr "Raudona"
+
+#: searx/templates/courgette/preferences.html:96
+#: searx/templates/legacy/preferences.html:93
+#: searx/templates/pix-art/preferences.html:49
+#: searx/templates/simple/preferences.html:77
+msgid "Currently used search engines"
+msgstr "Šiuo metu naudojamos paieškos sistemos"
+
+#: searx/templates/courgette/preferences.html:100
+#: searx/templates/legacy/preferences.html:97
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
+#: searx/templates/pix-art/preferences.html:53
+#: searx/templates/simple/preferences.html:87
+msgid "Engine name"
+msgstr "Sistemos pavadinimas"
+
+#: searx/templates/courgette/preferences.html:101
+#: searx/templates/legacy/preferences.html:98
+msgid "Category"
+msgstr "Kategorija"
+
+#: searx/templates/courgette/preferences.html:102
+#: searx/templates/courgette/preferences.html:113
+#: searx/templates/legacy/preferences.html:99
+#: searx/templates/legacy/preferences.html:110
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
+#: searx/templates/pix-art/preferences.html:54
+#: searx/templates/pix-art/preferences.html:64
+#: searx/templates/simple/preferences.html:86
+msgid "Allow"
+msgstr "Leisti"
+
+#: searx/templates/courgette/preferences.html:102
+#: searx/templates/courgette/preferences.html:114
+#: searx/templates/legacy/preferences.html:99
+#: searx/templates/legacy/preferences.html:111
+#: searx/templates/pix-art/preferences.html:54
+#: searx/templates/pix-art/preferences.html:65
+msgid "Block"
+msgstr "Blokuoti"
+
+#: searx/templates/courgette/preferences.html:122
+#: searx/templates/legacy/preferences.html:119
+#: searx/templates/oscar/preferences.html:285
+#: searx/templates/pix-art/preferences.html:73
+#: searx/templates/simple/preferences.html:180
+msgid ""
+"These settings are stored in your cookies, this allows us not to store this "
+"data about you."
+msgstr "Šie nustatymai yra laikomi jūsų slapukuose, tai leidžia mums nesaugoti šių duomenų apie jus."
+
+#: searx/templates/courgette/preferences.html:124
+#: searx/templates/legacy/preferences.html:121
+#: searx/templates/oscar/preferences.html:287
+#: searx/templates/pix-art/preferences.html:75
+#: searx/templates/simple/preferences.html:182
+msgid ""
+"These cookies serve your sole convenience, we don't use these cookies to "
+"track you."
+msgstr "Šie slapukai yra naudojami išskirtinai jūsų patogumui, mes nenaudojame jų, kad jus sektume."
+
+#: searx/templates/courgette/preferences.html:127
+#: searx/templates/legacy/preferences.html:124
+#: searx/templates/oscar/preferences.html:293
+#: searx/templates/pix-art/preferences.html:78
+#: searx/templates/simple/preferences.html:185
+msgid "save"
+msgstr "Įrašyti"
+
+#: searx/templates/courgette/preferences.html:128
+#: searx/templates/legacy/preferences.html:125
+#: searx/templates/oscar/preferences.html:295
+#: searx/templates/simple/preferences.html:186
+msgid "Reset defaults"
+msgstr "Atstatyti numatytuosius"
+
+#: searx/templates/courgette/preferences.html:129
+#: searx/templates/legacy/preferences.html:126
+#: searx/templates/oscar/preferences.html:294
+#: searx/templates/pix-art/preferences.html:79
+#: searx/templates/simple/preferences.html:187
+msgid "back"
+msgstr "Atgal"
+
+#: searx/templates/courgette/results.html:12
+#: searx/templates/legacy/results.html:13
+#: searx/templates/oscar/results.html:136
+#: searx/templates/simple/results.html:58
+msgid "Search URL"
+msgstr "Paieškos URL"
+
+#: searx/templates/courgette/results.html:16
+#: searx/templates/legacy/results.html:17
+#: searx/templates/oscar/results.html:141
+#: searx/templates/simple/results.html:62
+msgid "Download results"
+msgstr "Atsisiųsti rezultatus"
+
+#: searx/templates/courgette/results.html:34
+#: searx/templates/legacy/results.html:35
+#: searx/templates/simple/results.html:10
+msgid "Answers"
+msgstr "Atsakymai"
+
+#: searx/templates/courgette/results.html:42
+#: searx/templates/legacy/results.html:43
+#: searx/templates/oscar/results.html:116
+#: searx/templates/simple/results.html:42
+msgid "Suggestions"
+msgstr "Pasiūlymai"
+
+#: searx/templates/courgette/results.html:70
+#: searx/templates/legacy/results.html:81
+#: searx/templates/oscar/results.html:68 searx/templates/oscar/results.html:78
+#: searx/templates/simple/results.html:130
+msgid "previous page"
+msgstr "ankstesnis puslapis"
+
+#: searx/templates/courgette/results.html:81
+#: searx/templates/legacy/results.html:92
+#: searx/templates/oscar/results.html:62 searx/templates/oscar/results.html:84
+#: searx/templates/simple/results.html:145
+msgid "next page"
+msgstr "kitas puslapis"
+
+#: searx/templates/courgette/search.html:3
+#: searx/templates/legacy/search.html:3 searx/templates/oscar/search.html:6
+#: searx/templates/oscar/search_full.html:9
+#: searx/templates/pix-art/search.html:3 searx/templates/simple/search.html:4
+msgid "Search for..."
+msgstr "Ko ieškoti..."
+
+#: searx/templates/courgette/stats.html:4 searx/templates/legacy/stats.html:4
+#: searx/templates/oscar/stats.html:5 searx/templates/pix-art/stats.html:4
+#: searx/templates/simple/stats.html:7
+msgid "Engine stats"
+msgstr "Sistemos statistika"
+
+#: searx/templates/courgette/result_templates/images.html:4
+#: searx/templates/legacy/result_templates/images.html:4
+#: searx/templates/pix-art/result_templates/images.html:4
+msgid "original context"
+msgstr "pradinis kontekstas"
+
+#: searx/templates/courgette/result_templates/torrent.html:7
+#: searx/templates/legacy/result_templates/torrent.html:11
+#: searx/templates/oscar/result_templates/torrent.html:6
+#: searx/templates/simple/result_templates/torrent.html:9
+msgid "Seeder"
+msgstr "Skleidėjai"
+
+#: searx/templates/courgette/result_templates/torrent.html:7
+#: searx/templates/legacy/result_templates/torrent.html:11
+#: searx/templates/oscar/result_templates/torrent.html:6
+#: searx/templates/simple/result_templates/torrent.html:9
+msgid "Leecher"
+msgstr "Siuntėjai"
+
+#: searx/templates/courgette/result_templates/torrent.html:9
+#: searx/templates/legacy/result_templates/torrent.html:9
+#: searx/templates/oscar/macros.html:23
+#: searx/templates/simple/result_templates/torrent.html:6
+msgid "magnet link"
+msgstr "magnet nuoroda"
+
+#: searx/templates/courgette/result_templates/torrent.html:10
+#: searx/templates/legacy/result_templates/torrent.html:10
+#: searx/templates/oscar/macros.html:24
+#: searx/templates/simple/result_templates/torrent.html:7
+msgid "torrent file"
+msgstr "torrent failas"
+
+#: searx/templates/legacy/categories.html:8
+#: searx/templates/simple/categories.html:6
+msgid "Click on the magnifier to perform search"
+msgstr "Norėdami atlikti paiešką, spustelėkite ant didinamojo stiklo"
+
+#: searx/templates/legacy/preferences.html:84
+#: searx/templates/oscar/preferences.html:113
+#: searx/templates/simple/preferences.html:142
+msgid "Results on new tabs"
+msgstr "Rezultatai naujose kortelėse"
+
+#: searx/templates/legacy/preferences.html:87
+#: searx/templates/oscar/preferences.html:117
+#: searx/templates/simple/preferences.html:145
+msgid "On"
+msgstr "Įjungta"
+
+#: searx/templates/legacy/preferences.html:88
+#: searx/templates/oscar/preferences.html:118
+#: searx/templates/simple/preferences.html:146
+msgid "Off"
+msgstr "Išjungta"
+
+#: searx/templates/legacy/result_templates/code.html:3
+#: searx/templates/legacy/result_templates/default.html:3
+#: searx/templates/legacy/result_templates/map.html:9
+#: searx/templates/oscar/macros.html:34 searx/templates/oscar/macros.html:48
+#: searx/templates/simple/macros.html:43
+msgid "cached"
+msgstr "podėlio versija"
+
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr "Išplėstiniai nustatymai"
+
+#: searx/templates/oscar/base.html:62
+#: searx/templates/oscar/messages/first_time.html:4
+#: searx/templates/oscar/messages/save_settings_successfull.html:5
+#: searx/templates/oscar/messages/unknow_error.html:5
+msgid "Close"
+msgstr "Užverti"
+
+#: searx/templates/oscar/base.html:64
+#: searx/templates/oscar/messages/no_results.html:4
+#: searx/templates/simple/messages/no_results.html:4
+#: searx/templates/simple/results.html:25
+msgid "Error!"
+msgstr "Klaida!"
+
+#: searx/templates/oscar/base.html:90 searx/templates/simple/base.html:55
+msgid "Powered by"
+msgstr "Veikia su"
+
+#: searx/templates/oscar/base.html:90 searx/templates/simple/base.html:55
+msgid "a privacy-respecting, hackable metasearch engine"
+msgstr "gerbianti privatumą, programuojama metapaieškos sistema"
+
+#: searx/templates/oscar/macros.html:36 searx/templates/oscar/macros.html:50
+#: searx/templates/simple/macros.html:43
+msgid "proxied"
+msgstr "per įgaliotąjį serverį"
+
+#: searx/templates/oscar/macros.html:92
+msgid "supported"
+msgstr "palaikoma"
+
+#: searx/templates/oscar/macros.html:96
+msgid "not supported"
+msgstr "nepalaikoma"
+
+#: searx/templates/oscar/preferences.html:13
+#: searx/templates/oscar/preferences.html:22
+#: searx/templates/simple/preferences.html:32
+msgid "General"
+msgstr "Bendra"
+
+#: searx/templates/oscar/preferences.html:14
+#: searx/templates/oscar/preferences.html:134
+#: searx/templates/simple/preferences.html:76
+msgid "Engines"
+msgstr "Sistemos"
+
+#: searx/templates/oscar/preferences.html:15
+#: searx/templates/oscar/preferences.html:207
+msgid "Plugins"
+msgstr "Įskiepiai"
+
+#: searx/templates/oscar/preferences.html:16
+#: searx/templates/oscar/preferences.html:233
+msgid "Answerers"
+msgstr "Atsakikliai"
+
+#: searx/templates/oscar/preferences.html:17
+#: searx/templates/oscar/preferences.html:260
+msgid "Cookies"
+msgstr "Slapukai"
+
+#: searx/templates/oscar/preferences.html:42
+#: searx/templates/simple/preferences.html:48
+msgid "What language do you prefer for search?"
+msgstr "Kokią kalbą pageidaujate paieškai?"
+
+#: searx/templates/oscar/preferences.html:48
+#: searx/templates/simple/preferences.html:128
+msgid "Change the language of the layout"
+msgstr "Keisti išdėstymo kalbą"
+
+#: searx/templates/oscar/preferences.html:58
+#: searx/templates/simple/preferences.html:60
+msgid "Find stuff as you type"
+msgstr "Rasti medžiagą berašant"
+
+#: searx/templates/oscar/preferences.html:69
+#: searx/templates/simple/preferences.html:173
+msgid "Proxying image results through searx"
+msgstr "Paveikslų persiuntimas įgaliotuoju serveriu per searx"
+
+#: searx/templates/oscar/preferences.html:78
+msgid ""
+"Change how forms are submited, <a "
+"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
+" rel=\"external\">learn more about request methods</a>"
+msgstr "Keisti kaip yra pateikiamos formos, <a href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\" rel=\"external\">sužinokite daugiau apie užklausos metodus</a>"
+
+#: searx/templates/oscar/preferences.html:87
+#: searx/templates/simple/preferences.html:71
+msgid "Filter content"
+msgstr "Filtruoti turinį"
+
+#: searx/templates/oscar/preferences.html:97
+#: searx/templates/simple/preferences.html:139
+msgid "Change searx layout"
+msgstr "Keisti searx išdėstymą"
+
+#: searx/templates/oscar/preferences.html:106
+#: searx/templates/oscar/preferences.html:111
+msgid "Choose style for this theme"
+msgstr "Pasirinkti šio apipavidalinimo stilių"
+
+#: searx/templates/oscar/preferences.html:106
+#: searx/templates/oscar/preferences.html:111
+msgid "Style"
+msgstr "Stilius"
+
+#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:163
+#: searx/templates/simple/preferences.html:88
+msgid "Shortcut"
+msgstr "Trumpinys"
+
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
+msgid "Selected language"
+msgstr "Pasirinkta kalba"
+
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/simple/preferences.html:91
+msgid "Time range"
+msgstr "Laiko rėžis"
+
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/simple/preferences.html:92
+msgid "Avg. time"
+msgstr "Vid. laikas"
+
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/simple/preferences.html:93
+msgid "Max time"
+msgstr "Maks. laikas"
+
+#: searx/templates/oscar/preferences.html:236
+msgid "This is the list of searx's instant answering modules."
+msgstr "Tai yra searx greitų atsakiklių modulių sąrašas."
+
+#: searx/templates/oscar/preferences.html:240
+msgid "Name"
+msgstr "Pavadinimas"
+
+#: searx/templates/oscar/preferences.html:241
+msgid "Keywords"
+msgstr "Raktažodžiai"
+
+#: searx/templates/oscar/preferences.html:242
+msgid "Description"
+msgstr "Aprašas"
+
+#: searx/templates/oscar/preferences.html:243
+msgid "Examples"
+msgstr "Pavyzdžiai"
+
+#: searx/templates/oscar/preferences.html:263
+msgid ""
+"This is the list of cookies and their values searx is storing on your "
+"computer."
+msgstr "Tai yra slapukų ir jų reikšmių, kuriuos searx laiko jūsų kompiuteryje, sąrašas."
+
+#: searx/templates/oscar/preferences.html:264
+msgid "With that list, you can assess searx transparency."
+msgstr "Naudodami sąrašą, galite įvertinti searx skaidrumą."
+
+#: searx/templates/oscar/preferences.html:269
+msgid "Cookie name"
+msgstr "Slapuko pavadinimas"
+
+#: searx/templates/oscar/preferences.html:270
+msgid "Value"
+msgstr "Reikšmė"
+
+#: searx/templates/oscar/preferences.html:289
+msgid "Search URL of the currently saved preferences"
+msgstr "Šiuo metu įrašytų nuostatų paieškos URL"
+
+#: searx/templates/oscar/preferences.html:289
+msgid ""
+"Note: specifying custom settings in the search URL can reduce privacy by "
+"leaking data to the clicked result sites."
+msgstr "Pastaba: paieškos URL adrese nurodant tinkintus nustatymus, gali būti sumažintas jūsų privatumas, atskleidžiant duomenis toms rezultatų svetainėms, ant kurių spustelėjate."
+
+#: searx/templates/oscar/results.html:17
+msgid "Search results"
+msgstr "Paieškos rezultatai"
+
+#: searx/templates/oscar/results.html:21
+#: searx/templates/simple/results.html:84
+msgid "Try searching for:"
+msgstr "Bandykite ieškoti:"
+
+#: searx/templates/oscar/results.html:100
+#: searx/templates/simple/results.html:25
+msgid "Engines cannot retrieve results"
+msgstr "Sistemos negali gauti rezultatų"
+
+#: searx/templates/oscar/results.html:131
+msgid "Links"
+msgstr "Nuorodos"
+
+#: searx/templates/oscar/search.html:8
+#: searx/templates/oscar/search_full.html:11
+#: searx/templates/simple/search.html:5
+msgid "Start search"
+msgstr "Pradėti paiešką"
+
+#: searx/templates/oscar/stats.html:2
+msgid "stats"
+msgstr "statistika"
+
+#: searx/templates/oscar/time-range.html:3
+#: searx/templates/simple/time-range.html:3
+msgid "Anytime"
+msgstr "Bet kada"
+
+#: searx/templates/oscar/time-range.html:6
+#: searx/templates/simple/time-range.html:6
+msgid "Last day"
+msgstr "Praeitą dieną"
+
+#: searx/templates/oscar/time-range.html:9
+#: searx/templates/simple/time-range.html:9
+msgid "Last week"
+msgstr "Praeitą savaitę"
+
+#: searx/templates/oscar/time-range.html:12
+#: searx/templates/simple/time-range.html:12
+msgid "Last month"
+msgstr "Praeitą mėnesį"
+
+#: searx/templates/oscar/time-range.html:15
+#: searx/templates/simple/time-range.html:15
+msgid "Last year"
+msgstr "Praeitais metais"
+
+#: searx/templates/oscar/messages/first_time.html:6
+#: searx/templates/oscar/messages/no_data_available.html:3
+msgid "Heads up!"
+msgstr "Dėmesio!"
+
+#: searx/templates/oscar/messages/first_time.html:7
+msgid "It look like you are using searx first time."
+msgstr "Atrodo, kad pirmą kartą naudojate searx."
+
+#: searx/templates/oscar/messages/no_cookies.html:3
+msgid "Information!"
+msgstr "Informacija!"
+
+#: searx/templates/oscar/messages/no_cookies.html:4
+msgid "currently, there are no cookies defined."
+msgstr "Šiuo metu nėra jokių apibrėžtų slapukų."
+
+#: searx/templates/oscar/messages/no_data_available.html:4
+msgid "There is currently no data available. "
+msgstr "Šiuo metu nėra jokių prieinamų duomenų."
+
+#: searx/templates/oscar/messages/no_results.html:4
+#: searx/templates/simple/messages/no_results.html:4
+msgid "Engines cannot retrieve results."
+msgstr "Sistemos negali gauti rezultatų."
+
+#: searx/templates/oscar/messages/no_results.html:10
+#: searx/templates/simple/messages/no_results.html:10
+msgid "Please, try again later or find another searx instance."
+msgstr "Vėliau bandykite dar kartą arba raskite kitą searx egzempliorių."
+
+#: searx/templates/oscar/messages/no_results.html:14
+#: searx/templates/simple/messages/no_results.html:14
+msgid "Sorry!"
+msgstr "Atleiskite!"
+
+#: searx/templates/oscar/messages/no_results.html:15
+#: searx/templates/simple/messages/no_results.html:15
+msgid ""
+"we didn't find any results. Please use another query or search in more "
+"categories."
+msgstr "Mes neradome jokių rezultatų. Naudokite kitokią užklausą arba ieškokite kitose kategorijose."
+
+#: searx/templates/oscar/messages/save_settings_successfull.html:7
+msgid "Well done!"
+msgstr "Gerai padirbėta!"
+
+#: searx/templates/oscar/messages/save_settings_successfull.html:8
+msgid "Settings saved successfully."
+msgstr "Nustatymai sėkmingai įrašyti."
+
+#: searx/templates/oscar/messages/unknow_error.html:7
+msgid "Oh snap!"
+msgstr "O, ne!"
+
+#: searx/templates/oscar/messages/unknow_error.html:8
+msgid "Something went wrong."
+msgstr "Kažkas nutiko."
+
+#: searx/templates/oscar/result_templates/default.html:7
+#: searx/templates/simple/result_templates/default.html:6
+msgid "show media"
+msgstr "rodyti mediją"
+
+#: searx/templates/oscar/result_templates/default.html:7
+#: searx/templates/simple/result_templates/default.html:6
+msgid "hide media"
+msgstr "slėpti mediją"
+
+#: searx/templates/oscar/result_templates/images.html:30
+msgid "Get image"
+msgstr "Gauti paveikslą"
+
+#: searx/templates/oscar/result_templates/images.html:33
+msgid "View source"
+msgstr "Rodyti šaltinį"
+
+#: searx/templates/oscar/result_templates/map.html:7
+#: searx/templates/simple/result_templates/map.html:7
+msgid "show map"
+msgstr "rodyti žemėlapį"
+
+#: searx/templates/oscar/result_templates/map.html:7
+#: searx/templates/simple/result_templates/map.html:7
+msgid "hide map"
+msgstr "slėpti žemėlapį"
+
+#: searx/templates/oscar/result_templates/map.html:11
+#: searx/templates/simple/result_templates/map.html:11
+msgid "show details"
+msgstr "rodyti informaciją"
+
+#: searx/templates/oscar/result_templates/map.html:11
+#: searx/templates/simple/result_templates/map.html:11
+msgid "hide details"
+msgstr "slėpti informaciją"
+
+#: searx/templates/oscar/result_templates/torrent.html:7
+#: searx/templates/simple/result_templates/torrent.html:11
+msgid "Filesize"
+msgstr "Failo dydis"
+
+#: searx/templates/oscar/result_templates/torrent.html:9
+#: searx/templates/simple/result_templates/torrent.html:12
+msgid "Bytes"
+msgstr "Baitai"
+
+#: searx/templates/oscar/result_templates/torrent.html:10
+#: searx/templates/simple/result_templates/torrent.html:13
+msgid "kiB"
+msgstr "kiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:11
+#: searx/templates/simple/result_templates/torrent.html:14
+msgid "MiB"
+msgstr "MiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:12
+#: searx/templates/simple/result_templates/torrent.html:15
+msgid "GiB"
+msgstr "GiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:13
+#: searx/templates/simple/result_templates/torrent.html:16
+msgid "TiB"
+msgstr "TiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:15
+#: searx/templates/simple/result_templates/torrent.html:20
+msgid "Number of Files"
+msgstr "Failų skaičius"
+
+#: searx/templates/oscar/result_templates/videos.html:7
+#: searx/templates/simple/result_templates/videos.html:6
+msgid "show video"
+msgstr "rodyti vaizdo įrašą"
+
+#: searx/templates/oscar/result_templates/videos.html:7
+#: searx/templates/simple/result_templates/videos.html:6
+msgid "hide video"
+msgstr "slėpti vaizdo įrašą"
+
+#: searx/templates/pix-art/results.html:28
+msgid "Load more..."
+msgstr "Įkelti daugiau..."
+
+#: searx/templates/simple/base.html:31
+msgid "No item found"
+msgstr "Elementų nerasta"
+
+#: searx/templates/simple/preferences.html:89
+msgid "Supports selected language"
+msgstr "Palaiko pasirinktą kalbą"
+
+#: searx/templates/simple/preferences.html:118
+msgid "User interface"
+msgstr "Naudotojo sąsaja"
+
+#: searx/templates/simple/preferences.html:154
+msgid "Privacy"
+msgstr "Privatumas"
diff --git a/searx/translations/nl/LC_MESSAGES/messages.mo b/searx/translations/nl/LC_MESSAGES/messages.mo
index 057853be5..55f7230bb 100644
--- a/searx/translations/nl/LC_MESSAGES/messages.mo
+++ b/searx/translations/nl/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/nl/LC_MESSAGES/messages.po b/searx/translations/nl/LC_MESSAGES/messages.po
index b4e061402..be2438b84 100644
--- a/searx/translations/nl/LC_MESSAGES/messages.po
+++ b/searx/translations/nl/LC_MESSAGES/messages.po
@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-09-22 06:46+0000\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-04-27 08:22+0000\n"
"Last-Translator: André Koot <meneer@tken.net>\n"
"Language-Team: Dutch (http://www.transifex.com/asciimoo/searx/language/nl/)\n"
"MIME-Version: 1.0\n"
@@ -33,63 +33,63 @@ msgstr "aanvraaguitzondering"
msgid "unexpected crash"
msgstr "onverwachte crash"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "bestanden"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "algemeen"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "muziek"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "sociale media"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "afbeeldingen"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "video’s"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "IT"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "nieuws"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "kaart"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "wetenschap"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Ongeldige instellingen, werk je voorkeuren bij"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Ongeldige instellingen"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "zoekfout"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} min geleden"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} uur, {minutes} min geleden"
@@ -109,29 +109,28 @@ msgstr "Statistische functies"
msgid "Compute {functions} of the arguments"
msgstr "Bereken {functions} van de argumenten"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Snelheid zoekmachine (sec)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Laden van pagina’s (sec)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Aantal zoekresultaten"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Scores"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Scores per zoekresultaat"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Fouten"
@@ -143,9 +142,15 @@ msgstr "{title}&nbsp;(VEROUDERD)"
msgid "This entry has been superseded by"
msgstr "Dit object is vervangen door"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Voor deze publicatie is geen abstract beschikbaar."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "DOAI herschrijven"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Omzeil betaalmuren met een doorverwijzing naar vrij toegankelijke versies van publicaties indien beschikbaar"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -159,16 +164,6 @@ msgstr "Oneindig scrollen"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Volgende pagina automatisch laden bij bereiken van de onderkant van de huidige pagina"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Open Access DOI herschrijven"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Omzeil betaalmuren met een doorverwijzing naar vrij toegankelijke versies van publicaties indien beschikbaar"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -331,8 +326,8 @@ msgstr "Methode"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -404,8 +399,8 @@ msgstr "Momenteel gebruikte zoekmachines"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -420,8 +415,8 @@ msgstr "Categorie"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -439,7 +434,7 @@ msgstr "Blokkeren"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -449,7 +444,7 @@ msgstr "Deze instellingen worden bewaard in je cookies. Hierdoor hoeven wij niet
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -459,7 +454,7 @@ msgstr "Deze cookies zijn alleen voor je eigen gemak, we gebruiken deze cookies
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -467,14 +462,14 @@ msgstr "bewaren"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Standaardinstellingen herstellen"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -645,23 +640,23 @@ msgid "General"
msgstr "Algemeen"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Zoekmachines"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Plug-ins"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Beantwoorders"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cookies"
@@ -712,88 +707,78 @@ msgstr "Kies een stijl voor dit thema"
msgid "Style"
msgstr "Stijl"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Open Access DOI herschrijven"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Doorverwijzen naar vrij toegankelijke versies van publicaties, indien beschikbaar (plug-in vereist)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Snelkoppeling"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Geselecteerde taal"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Tijdspanne"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Gem. duur"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Max. duur"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Dit is het overzicht van de instantantwoordmodules van searx."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Naam"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Kernwoorden"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Beschrijving"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Voorbeelden"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Dit is de lijst van cookies en hun waarden die searx op je computer opslaat."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Met deze lijst kan je de openheid van searx beoordelen."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Cookienaam"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Waarde"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "Zoek-URL van de huidig opgeslagen voorkeuren"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/nl_BE/LC_MESSAGES/messages.mo b/searx/translations/nl_BE/LC_MESSAGES/messages.mo
index e233f5c89..e37b9e272 100644
--- a/searx/translations/nl_BE/LC_MESSAGES/messages.mo
+++ b/searx/translations/nl_BE/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/nl_BE/LC_MESSAGES/messages.po b/searx/translations/nl_BE/LC_MESSAGES/messages.po
index c4ef0228a..21fa68cf1 100644
--- a/searx/translations/nl_BE/LC_MESSAGES/messages.po
+++ b/searx/translations/nl_BE/LC_MESSAGES/messages.po
@@ -3,13 +3,13 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
-# Nathan Follens, 2018
+# Nathan Follens, 2018-2019
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-06-24 07:59+0000\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 19:47+0000\n"
"Last-Translator: Nathan Follens\n"
"Language-Team: Dutch (Belgium) (http://www.transifex.com/asciimoo/searx/language/nl_BE/)\n"
"MIME-Version: 1.0\n"
@@ -31,63 +31,63 @@ msgstr "aanvraaguitzondering"
msgid "unexpected crash"
msgstr "onverwachte crash"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "bestanden"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "algemeen"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "muziek"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "sociale media"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "afbeeldingen"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "video’s"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "IT"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "nieuws"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "kaart"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "wetenschap"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Ongeldige instellingen, werkt uw voorkeuren bij"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Ongeldige instellingen"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "zoekfout"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} min geleden"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} uur, {minutes} min geleden"
@@ -107,29 +107,28 @@ msgstr "Statistische functies"
msgid "Compute {functions} of the arguments"
msgstr "Berekent {functions} van de argumenten"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Snelheid zoekmachien (sec)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Laden van pagina’s (sec)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Aantal zoekresultaten"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Scores"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Scores per zoekresultaat"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Fouten"
@@ -141,9 +140,15 @@ msgstr "{title}&nbsp;(VEROUDERD)"
msgid "This entry has been superseded by"
msgstr "Dit object is vervangen door"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Voor deze publicatie is geen abstract beschikbaar."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "DOAI herschrijven"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Omzeilt betaalmuren met een doorverwijzing naar vrij toegankelijke versies van publicaties indien beschikbaar"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -157,16 +162,6 @@ msgstr "Oneindig scrollen"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Volgende pagina automatisch laden bij bereiken van den onderkant van de huidige pagina"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Open Access DOI herschrijven"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Omzeilt betaalmuren met een doorverwijzing naar vrij toegankelijke versies van publicaties indien beschikbaar"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -329,8 +324,8 @@ msgstr "Methode"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -402,8 +397,8 @@ msgstr "Momenteel gebruikte zoekmachienen"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -418,8 +413,8 @@ msgstr "Categorie"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -437,7 +432,7 @@ msgstr "Blokkeren"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -447,7 +442,7 @@ msgstr "Deze instellingen worden bewaard in uw cookies. Hierdoor hoeven wij niks
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -457,7 +452,7 @@ msgstr "Deze cookies zijn alleen voor uw eigen gemak, we gebruiken deze cookies
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -465,14 +460,14 @@ msgstr "opslaan"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Standaardinstellingen herstellen"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -643,23 +638,23 @@ msgid "General"
msgstr "Algemeen"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Zoekmachienen"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Plug-ins"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Beantwoorders"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cookies"
@@ -710,88 +705,78 @@ msgstr "Kiest ne stijl voor dit thema"
msgid "Style"
msgstr "Stijl"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Open Access DOI herschrijven"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Doorverwijzen naar vrij toegankelijke versies van publicaties, indien beschikbaar (plug-in vereist)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Snelkoppeling"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Geselecteerde taal"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Tijdspanne"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Gem. duur"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Max. duur"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Dit is het overzicht van de instantantwoordmodules van searx."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Naam"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Kernwoorden"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Beschrijving"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Voorbeelden"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Dit is de lijst van cookies en hun waarden die searx op uwe computer opslaat."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Met deze lijst kunt ge de openheid van searx beoordelen."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Cookienaam"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Waarde"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "Zoek-URL van de momenteel opgeslagen voorkeuren"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/oc/LC_MESSAGES/messages.mo b/searx/translations/oc/LC_MESSAGES/messages.mo
new file mode 100644
index 000000000..a9519a677
--- /dev/null
+++ b/searx/translations/oc/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/oc/LC_MESSAGES/messages.po b/searx/translations/oc/LC_MESSAGES/messages.po
new file mode 100644
index 000000000..404343938
--- /dev/null
+++ b/searx/translations/oc/LC_MESSAGES/messages.po
@@ -0,0 +1,999 @@
+# Translations template for PROJECT.
+# Copyright (C) 2017 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+#
+# Translators:
+# Quentin, 2016,2018
+# Marc Abonce Seguin, 2019
+msgid ""
+msgstr ""
+"Project-Id-Version: searx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-04-12 23:05+0000\n"
+"Last-Translator: Marc Abonce Seguin\n"
+"Language-Team: Occitan (post 1500) (http://www.transifex.com/asciimoo/searx/language/oc/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.3.4\n"
+"Language: oc\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: searx/search.py:137 searx/search.py:182
+msgid "timeout"
+msgstr "relambi passat"
+
+#: searx/search.py:144
+msgid "request exception"
+msgstr "excepcion de requèsta"
+
+#: searx/search.py:151
+msgid "unexpected crash"
+msgstr "fracàs pas previst"
+
+#: searx/webapp.py:135
+msgid "files"
+msgstr "fichièrs"
+
+#: searx/webapp.py:136
+msgid "general"
+msgstr "general"
+
+#: searx/webapp.py:137
+msgid "music"
+msgstr "musica"
+
+#: searx/webapp.py:138
+msgid "social media"
+msgstr "mèdias socials"
+
+#: searx/webapp.py:139
+msgid "images"
+msgstr "imatges"
+
+#: searx/webapp.py:140
+msgid "videos"
+msgstr "vidèos"
+
+#: searx/webapp.py:141
+msgid "it"
+msgstr "tecnologia"
+
+#: searx/webapp.py:142
+msgid "news"
+msgstr "actualitat"
+
+#: searx/webapp.py:143
+msgid "map"
+msgstr "mapa"
+
+#: searx/webapp.py:144
+msgid "science"
+msgstr "sciéncia"
+
+#: searx/webapp.py:398 searx/webapp.py:653
+msgid "Invalid settings, please edit your preferences"
+msgstr "Paramètre pas valide, mercés de modificar vòstras preferéncias"
+
+#: searx/webapp.py:410
+msgid "Invalid settings"
+msgstr "Paramètres invalids"
+
+#: searx/webapp.py:444 searx/webapp.py:488
+msgid "search error"
+msgstr "error de recèrca"
+
+#: searx/webapp.py:525
+msgid "{minutes} minute(s) ago"
+msgstr "fa {minutes} minuta(s)"
+
+#: searx/webapp.py:527
+msgid "{hours} hour(s), {minutes} minute(s) ago"
+msgstr "Fa {hours} ora(s), {minutes} minuta(s)"
+
+#: searx/answerers/random/answerer.py:53
+msgid "Random value generator"
+msgstr "Generator aleatòri"
+
+#: searx/answerers/random/answerer.py:54
+msgid "Generate different random values"
+msgstr "Crèa de valors aleatòrias diferentas"
+
+#: searx/answerers/statistics/answerer.py:53
+msgid "Statistics functions"
+msgstr "Foncions estatisticas"
+
+#: searx/answerers/statistics/answerer.py:54
+msgid "Compute {functions} of the arguments"
+msgstr "Calcula las {functions} dels arguments"
+
+#: searx/engines/__init__.py:194
+msgid "Engine time (sec)"
+msgstr "Temps del motor (sec)"
+
+#: searx/engines/__init__.py:198
+msgid "Page loads (sec)"
+msgstr "Pagina cargada en (sec) segondas"
+
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
+#: searx/templates/simple/results.html:20
+msgid "Number of results"
+msgstr "Nombre de resultats"
+
+#: searx/engines/__init__.py:206
+msgid "Scores"
+msgstr "Marcas"
+
+#: searx/engines/__init__.py:210
+msgid "Scores per result"
+msgstr "Marcas per resultat"
+
+#: searx/engines/__init__.py:214
+msgid "Errors"
+msgstr "Errors"
+
+#: searx/engines/pdbe.py:87
+msgid "{title}&nbsp;(OBSOLETE)"
+msgstr "{titre}&nbsp;(OBSOLETE)"
+
+#: searx/engines/pdbe.py:91
+msgid "This entry has been superseded by"
+msgstr "Aqueste element es estat remplaçat per"
+
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "Reescritura DOAI"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Evitar las paginas de pagament ne virant sus la version en accès liure quand es disponibla"
+
+#: searx/plugins/https_rewrite.py:32
+msgid "Rewrite HTTP links to HTTPS if possible"
+msgstr "Reescritura de los ligam HTTP en HTTPS s'es possible."
+
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr "Desfilament sens fin"
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr "Carga automaticament la pagina seguenta quand arribatz en fin de pagina"
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/simple/preferences.html:149
+msgid "Open result links on new browser tabs"
+msgstr "Dubrir los ligams de resultats dins un nòu onglet"
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr "Los resultats son dobèrts dins una nòva fenestra per defaut. Aquesta extension càmbia lo comportement per defaut per dobrir los ligams dins de nòus onglets o fenestras (Javascript es necessari)"
+
+#: searx/plugins/search_on_category_select.py:18
+msgid "Search on category select"
+msgstr "Cercar dins la categoria causida"
+
+#: searx/plugins/search_on_category_select.py:19
+msgid ""
+"Perform search immediately if a category selected. Disable to select "
+"multiple categories. (JavaScript required)"
+msgstr "Lança la recèrca sul còp se una categoria es seleccionada. Desactivar per seleccionar mai d'una categoria (Javascript necessari)."
+
+#: searx/plugins/self_info.py:20
+msgid ""
+"Displays your IP if the query is \"ip\" and your user agent if the query "
+"contains \"user agent\"."
+msgstr "Aficha vòstre adreça IP se la demanda es \"ip\", e aficha vòstre user-agent se la demanda conten \"user agent\"."
+
+#: searx/plugins/tracker_url_remover.py:26
+msgid "Tracker URL remover"
+msgstr "Netejador d'URL de traçat"
+
+#: searx/plugins/tracker_url_remover.py:27
+msgid "Remove trackers arguments from the returned URL"
+msgstr "Lèva los arguments de las URL utilizats per vos traçar"
+
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr "Acorchis coma Vim"
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr "Percorrètz los resultats de recèrca amb d'acorchis clavièr coma sus Vim (Javascript necessari). Picatz sus \"h\" dins la fenestra principala de resultats per afichar l'ajuda."
+
+#: searx/templates/courgette/404.html:4 searx/templates/legacy/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+#: searx/templates/simple/404.html:4
+msgid "Page not found"
+msgstr "Pagina pas trobada"
+
+#: searx/templates/courgette/404.html:6 searx/templates/legacy/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#: searx/templates/simple/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr "Anar a %(search_page)s."
+
+#: searx/templates/courgette/404.html:6 searx/templates/legacy/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#: searx/templates/simple/404.html:6
+msgid "search page"
+msgstr "cercar dins la pagina"
+
+#: searx/templates/courgette/index.html:9
+#: searx/templates/courgette/index.html:13
+#: searx/templates/courgette/results.html:5
+#: searx/templates/legacy/index.html:8 searx/templates/legacy/index.html:12
+#: searx/templates/oscar/navbar.html:7
+#: searx/templates/oscar/preferences.html:3
+#: searx/templates/pix-art/index.html:8
+msgid "preferences"
+msgstr "preferéncias"
+
+#: searx/templates/courgette/index.html:11
+#: searx/templates/legacy/index.html:10 searx/templates/oscar/about.html:2
+#: searx/templates/oscar/navbar.html:6 searx/templates/pix-art/index.html:7
+msgid "about"
+msgstr "a prepaus"
+
+#: searx/templates/courgette/preferences.html:5
+#: searx/templates/legacy/preferences.html:5
+#: searx/templates/oscar/preferences.html:8
+#: searx/templates/pix-art/preferences.html:5
+#: searx/templates/simple/preferences.html:26
+msgid "Preferences"
+msgstr "Preferéncias"
+
+#: searx/templates/courgette/preferences.html:9
+#: searx/templates/legacy/preferences.html:9
+#: searx/templates/oscar/preferences.html:33
+#: searx/templates/oscar/preferences.html:35
+#: searx/templates/simple/preferences.html:34
+msgid "Default categories"
+msgstr "Categoria per defaut"
+
+#: searx/templates/courgette/preferences.html:13
+#: searx/templates/legacy/preferences.html:14
+#: searx/templates/oscar/preferences.html:41
+#: searx/templates/pix-art/preferences.html:9
+#: searx/templates/simple/preferences.html:39
+#: searx/templates/simple/preferences.html:163
+msgid "Search language"
+msgstr "Lenga de recerca"
+
+#: searx/templates/courgette/preferences.html:16
+#: searx/templates/legacy/preferences.html:17
+#: searx/templates/oscar/languages.html:6
+#: searx/templates/pix-art/preferences.html:12
+#: searx/templates/simple/languages.html:2
+#: searx/templates/simple/preferences.html:42
+msgid "Default language"
+msgstr "Lenga per defaut"
+
+#: searx/templates/courgette/preferences.html:24
+#: searx/templates/legacy/preferences.html:25
+#: searx/templates/oscar/preferences.html:47
+#: searx/templates/pix-art/preferences.html:20
+#: searx/templates/simple/preferences.html:120
+msgid "Interface language"
+msgstr "Lenga de l'interfàcia"
+
+#: searx/templates/courgette/preferences.html:34
+#: searx/templates/legacy/preferences.html:35
+#: searx/templates/oscar/preferences.html:57
+#: searx/templates/simple/preferences.html:51
+msgid "Autocomplete"
+msgstr "Autocompletar"
+
+#: searx/templates/courgette/preferences.html:45
+#: searx/templates/legacy/preferences.html:46
+#: searx/templates/oscar/preferences.html:68
+#: searx/templates/simple/preferences.html:166
+msgid "Image proxy"
+msgstr "Proxy pels imatges"
+
+#: searx/templates/courgette/preferences.html:48
+#: searx/templates/legacy/preferences.html:49
+#: searx/templates/oscar/preferences.html:72
+#: searx/templates/simple/preferences.html:169
+msgid "Enabled"
+msgstr "Activat"
+
+#: searx/templates/courgette/preferences.html:49
+#: searx/templates/legacy/preferences.html:50
+#: searx/templates/oscar/preferences.html:73
+#: searx/templates/simple/preferences.html:170
+msgid "Disabled"
+msgstr "Desactivat"
+
+#: searx/templates/courgette/preferences.html:54
+#: searx/templates/legacy/preferences.html:55
+#: searx/templates/oscar/preferences.html:77
+#: searx/templates/pix-art/preferences.html:30
+#: searx/templates/simple/preferences.html:156
+msgid "Method"
+msgstr "Metòde"
+
+#: searx/templates/courgette/preferences.html:63
+#: searx/templates/legacy/preferences.html:64
+#: searx/templates/oscar/preferences.html:86
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/simple/preferences.html:63
+#: searx/templates/simple/preferences.html:90
+msgid "SafeSearch"
+msgstr "Recèrca segurizada"
+
+#: searx/templates/courgette/preferences.html:66
+#: searx/templates/legacy/preferences.html:67
+#: searx/templates/oscar/preferences.html:90
+#: searx/templates/simple/preferences.html:66
+msgid "Strict"
+msgstr "Estricte"
+
+#: searx/templates/courgette/preferences.html:67
+#: searx/templates/legacy/preferences.html:68
+#: searx/templates/oscar/preferences.html:91
+#: searx/templates/simple/preferences.html:67
+msgid "Moderate"
+msgstr "Moderat"
+
+#: searx/templates/courgette/preferences.html:68
+#: searx/templates/legacy/preferences.html:69
+#: searx/templates/oscar/preferences.html:92
+#: searx/templates/simple/preferences.html:68
+msgid "None"
+msgstr "Cap"
+
+#: searx/templates/courgette/preferences.html:73
+#: searx/templates/legacy/preferences.html:74
+#: searx/templates/oscar/preferences.html:96
+#: searx/templates/pix-art/preferences.html:39
+#: searx/templates/simple/preferences.html:131
+msgid "Themes"
+msgstr "Tèmas"
+
+#: searx/templates/courgette/preferences.html:83
+msgid "Color"
+msgstr "Color"
+
+#: searx/templates/courgette/preferences.html:86
+msgid "Blue (default)"
+msgstr "Blau (defaut)"
+
+#: searx/templates/courgette/preferences.html:87
+msgid "Violet"
+msgstr "Violet"
+
+#: searx/templates/courgette/preferences.html:88
+msgid "Green"
+msgstr "Verd"
+
+#: searx/templates/courgette/preferences.html:89
+msgid "Cyan"
+msgstr "Blau"
+
+#: searx/templates/courgette/preferences.html:90
+msgid "Orange"
+msgstr "Irange"
+
+#: searx/templates/courgette/preferences.html:91
+msgid "Red"
+msgstr "Roge"
+
+#: searx/templates/courgette/preferences.html:96
+#: searx/templates/legacy/preferences.html:93
+#: searx/templates/pix-art/preferences.html:49
+#: searx/templates/simple/preferences.html:77
+msgid "Currently used search engines"
+msgstr "Motors de recèrca utilizat actualament"
+
+#: searx/templates/courgette/preferences.html:100
+#: searx/templates/legacy/preferences.html:97
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
+#: searx/templates/pix-art/preferences.html:53
+#: searx/templates/simple/preferences.html:87
+msgid "Engine name"
+msgstr "Nom del motor de cerca"
+
+#: searx/templates/courgette/preferences.html:101
+#: searx/templates/legacy/preferences.html:98
+msgid "Category"
+msgstr "Categoria"
+
+#: searx/templates/courgette/preferences.html:102
+#: searx/templates/courgette/preferences.html:113
+#: searx/templates/legacy/preferences.html:99
+#: searx/templates/legacy/preferences.html:110
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
+#: searx/templates/pix-art/preferences.html:54
+#: searx/templates/pix-art/preferences.html:64
+#: searx/templates/simple/preferences.html:86
+msgid "Allow"
+msgstr "Autorizar"
+
+#: searx/templates/courgette/preferences.html:102
+#: searx/templates/courgette/preferences.html:114
+#: searx/templates/legacy/preferences.html:99
+#: searx/templates/legacy/preferences.html:111
+#: searx/templates/pix-art/preferences.html:54
+#: searx/templates/pix-art/preferences.html:65
+msgid "Block"
+msgstr "Blocar"
+
+#: searx/templates/courgette/preferences.html:122
+#: searx/templates/legacy/preferences.html:119
+#: searx/templates/oscar/preferences.html:285
+#: searx/templates/pix-art/preferences.html:73
+#: searx/templates/simple/preferences.html:180
+msgid ""
+"These settings are stored in your cookies, this allows us not to store this "
+"data about you."
+msgstr "Aquestes paramètres son gardats dins vòstres cookies : aquò nos permet pas de collectar vòstras donadas."
+
+#: searx/templates/courgette/preferences.html:124
+#: searx/templates/legacy/preferences.html:121
+#: searx/templates/oscar/preferences.html:287
+#: searx/templates/pix-art/preferences.html:75
+#: searx/templates/simple/preferences.html:182
+msgid ""
+"These cookies serve your sole convenience, we don't use these cookies to "
+"track you."
+msgstr "Aquestes cookies existon per vòstre confòrt d'utilizacion, los empleguem pas per vos espiar."
+
+#: searx/templates/courgette/preferences.html:127
+#: searx/templates/legacy/preferences.html:124
+#: searx/templates/oscar/preferences.html:293
+#: searx/templates/pix-art/preferences.html:78
+#: searx/templates/simple/preferences.html:185
+msgid "save"
+msgstr "enregistrar"
+
+#: searx/templates/courgette/preferences.html:128
+#: searx/templates/legacy/preferences.html:125
+#: searx/templates/oscar/preferences.html:295
+#: searx/templates/simple/preferences.html:186
+msgid "Reset defaults"
+msgstr "Reïnicializar per defaut"
+
+#: searx/templates/courgette/preferences.html:129
+#: searx/templates/legacy/preferences.html:126
+#: searx/templates/oscar/preferences.html:294
+#: searx/templates/pix-art/preferences.html:79
+#: searx/templates/simple/preferences.html:187
+msgid "back"
+msgstr "tornar"
+
+#: searx/templates/courgette/results.html:12
+#: searx/templates/legacy/results.html:13
+#: searx/templates/oscar/results.html:136
+#: searx/templates/simple/results.html:58
+msgid "Search URL"
+msgstr "URL de recèrca"
+
+#: searx/templates/courgette/results.html:16
+#: searx/templates/legacy/results.html:17
+#: searx/templates/oscar/results.html:141
+#: searx/templates/simple/results.html:62
+msgid "Download results"
+msgstr "Telecargar los resultats"
+
+#: searx/templates/courgette/results.html:34
+#: searx/templates/legacy/results.html:35
+#: searx/templates/simple/results.html:10
+msgid "Answers"
+msgstr "Responsas"
+
+#: searx/templates/courgette/results.html:42
+#: searx/templates/legacy/results.html:43
+#: searx/templates/oscar/results.html:116
+#: searx/templates/simple/results.html:42
+msgid "Suggestions"
+msgstr "Suggestions"
+
+#: searx/templates/courgette/results.html:70
+#: searx/templates/legacy/results.html:81
+#: searx/templates/oscar/results.html:68 searx/templates/oscar/results.html:78
+#: searx/templates/simple/results.html:130
+msgid "previous page"
+msgstr "pagina precedenta"
+
+#: searx/templates/courgette/results.html:81
+#: searx/templates/legacy/results.html:92
+#: searx/templates/oscar/results.html:62 searx/templates/oscar/results.html:84
+#: searx/templates/simple/results.html:145
+msgid "next page"
+msgstr "pagina seguenta"
+
+#: searx/templates/courgette/search.html:3
+#: searx/templates/legacy/search.html:3 searx/templates/oscar/search.html:6
+#: searx/templates/oscar/search_full.html:9
+#: searx/templates/pix-art/search.html:3 searx/templates/simple/search.html:4
+msgid "Search for..."
+msgstr "Cerca per..."
+
+#: searx/templates/courgette/stats.html:4 searx/templates/legacy/stats.html:4
+#: searx/templates/oscar/stats.html:5 searx/templates/pix-art/stats.html:4
+#: searx/templates/simple/stats.html:7
+msgid "Engine stats"
+msgstr "Estatistica del motor"
+
+#: searx/templates/courgette/result_templates/images.html:4
+#: searx/templates/legacy/result_templates/images.html:4
+#: searx/templates/pix-art/result_templates/images.html:4
+msgid "original context"
+msgstr "contèxte d'origina"
+
+#: searx/templates/courgette/result_templates/torrent.html:7
+#: searx/templates/legacy/result_templates/torrent.html:11
+#: searx/templates/oscar/result_templates/torrent.html:6
+#: searx/templates/simple/result_templates/torrent.html:9
+msgid "Seeder"
+msgstr "Fonts"
+
+#: searx/templates/courgette/result_templates/torrent.html:7
+#: searx/templates/legacy/result_templates/torrent.html:11
+#: searx/templates/oscar/result_templates/torrent.html:6
+#: searx/templates/simple/result_templates/torrent.html:9
+msgid "Leecher"
+msgstr "Telecargaires"
+
+#: searx/templates/courgette/result_templates/torrent.html:9
+#: searx/templates/legacy/result_templates/torrent.html:9
+#: searx/templates/oscar/macros.html:23
+#: searx/templates/simple/result_templates/torrent.html:6
+msgid "magnet link"
+msgstr "ligam magnet"
+
+#: searx/templates/courgette/result_templates/torrent.html:10
+#: searx/templates/legacy/result_templates/torrent.html:10
+#: searx/templates/oscar/macros.html:24
+#: searx/templates/simple/result_templates/torrent.html:7
+msgid "torrent file"
+msgstr "fichièr torrent"
+
+#: searx/templates/legacy/categories.html:8
+#: searx/templates/simple/categories.html:6
+msgid "Click on the magnifier to perform search"
+msgstr "Clicatz sus la lópia per lançar una recèrca"
+
+#: searx/templates/legacy/preferences.html:84
+#: searx/templates/oscar/preferences.html:113
+#: searx/templates/simple/preferences.html:142
+msgid "Results on new tabs"
+msgstr "Resultat dins de nòus onglets"
+
+#: searx/templates/legacy/preferences.html:87
+#: searx/templates/oscar/preferences.html:117
+#: searx/templates/simple/preferences.html:145
+msgid "On"
+msgstr "Òc"
+
+#: searx/templates/legacy/preferences.html:88
+#: searx/templates/oscar/preferences.html:118
+#: searx/templates/simple/preferences.html:146
+msgid "Off"
+msgstr "Non"
+
+#: searx/templates/legacy/result_templates/code.html:3
+#: searx/templates/legacy/result_templates/default.html:3
+#: searx/templates/legacy/result_templates/map.html:9
+#: searx/templates/oscar/macros.html:34 searx/templates/oscar/macros.html:48
+#: searx/templates/simple/macros.html:43
+msgid "cached"
+msgstr "en version locala"
+
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr "Paramètres avançats"
+
+#: searx/templates/oscar/base.html:62
+#: searx/templates/oscar/messages/first_time.html:4
+#: searx/templates/oscar/messages/save_settings_successfull.html:5
+#: searx/templates/oscar/messages/unknow_error.html:5
+msgid "Close"
+msgstr "Tampar"
+
+#: searx/templates/oscar/base.html:64
+#: searx/templates/oscar/messages/no_results.html:4
+#: searx/templates/simple/messages/no_results.html:4
+#: searx/templates/simple/results.html:25
+msgid "Error!"
+msgstr "Error !"
+
+#: searx/templates/oscar/base.html:90 searx/templates/simple/base.html:55
+msgid "Powered by"
+msgstr "Propulsat per"
+
+#: searx/templates/oscar/base.html:90 searx/templates/simple/base.html:55
+msgid "a privacy-respecting, hackable metasearch engine"
+msgstr "un meta-motor de recèrca hackable e respectuós de la vida privada"
+
+#: searx/templates/oscar/macros.html:36 searx/templates/oscar/macros.html:50
+#: searx/templates/simple/macros.html:43
+msgid "proxied"
+msgstr "proxifiat"
+
+#: searx/templates/oscar/macros.html:92
+msgid "supported"
+msgstr "compatible"
+
+#: searx/templates/oscar/macros.html:96
+msgid "not supported"
+msgstr "pas compatible"
+
+#: searx/templates/oscar/preferences.html:13
+#: searx/templates/oscar/preferences.html:22
+#: searx/templates/simple/preferences.html:32
+msgid "General"
+msgstr "General"
+
+#: searx/templates/oscar/preferences.html:14
+#: searx/templates/oscar/preferences.html:134
+#: searx/templates/simple/preferences.html:76
+msgid "Engines"
+msgstr "Motors de cerca"
+
+#: searx/templates/oscar/preferences.html:15
+#: searx/templates/oscar/preferences.html:207
+msgid "Plugins"
+msgstr "Extensions"
+
+#: searx/templates/oscar/preferences.html:16
+#: searx/templates/oscar/preferences.html:233
+msgid "Answerers"
+msgstr "Respondaires"
+
+#: searx/templates/oscar/preferences.html:17
+#: searx/templates/oscar/preferences.html:260
+msgid "Cookies"
+msgstr "Cookies"
+
+#: searx/templates/oscar/preferences.html:42
+#: searx/templates/simple/preferences.html:48
+msgid "What language do you prefer for search?"
+msgstr "Dins quina lenga vos agrada mai cercar ?"
+
+#: searx/templates/oscar/preferences.html:48
+#: searx/templates/simple/preferences.html:128
+msgid "Change the language of the layout"
+msgstr "Cambiar la lenga de l'interfàcia"
+
+#: searx/templates/oscar/preferences.html:58
+#: searx/templates/simple/preferences.html:60
+msgid "Find stuff as you type"
+msgstr "Trobar de causas pendent que picatz"
+
+#: searx/templates/oscar/preferences.html:69
+#: searx/templates/simple/preferences.html:173
+msgid "Proxying image results through searx"
+msgstr "Proxifiar los imatges de resultats a travers searx"
+
+#: searx/templates/oscar/preferences.html:78
+msgid ""
+"Change how forms are submited, <a "
+"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
+" rel=\"external\">learn more about request methods</a>"
+msgstr "Permet de causir cossí la recèrca es mandada, <a href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\" rel=\"external\"> per ne saber mai suls metòdes HTTP</a>"
+
+#: searx/templates/oscar/preferences.html:87
+#: searx/templates/simple/preferences.html:71
+msgid "Filter content"
+msgstr "Filtrar lo contengut"
+
+#: searx/templates/oscar/preferences.html:97
+#: searx/templates/simple/preferences.html:139
+msgid "Change searx layout"
+msgstr "Cambiar l'interfàcia de searx"
+
+#: searx/templates/oscar/preferences.html:106
+#: searx/templates/oscar/preferences.html:111
+msgid "Choose style for this theme"
+msgstr "Causir un estil per aqueste tèma"
+
+#: searx/templates/oscar/preferences.html:106
+#: searx/templates/oscar/preferences.html:111
+msgid "Style"
+msgstr "Estil"
+
+#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:163
+#: searx/templates/simple/preferences.html:88
+msgid "Shortcut"
+msgstr "Acorchis"
+
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
+msgid "Selected language"
+msgstr "Seleccionatz una lenga"
+
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/simple/preferences.html:91
+msgid "Time range"
+msgstr "Espaci temporal"
+
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/simple/preferences.html:92
+msgid "Avg. time"
+msgstr "Temps mejan"
+
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/simple/preferences.html:93
+msgid "Max time"
+msgstr "Temps max"
+
+#: searx/templates/oscar/preferences.html:236
+msgid "This is the list of searx's instant answering modules."
+msgstr "Vaquí la lista dels module de searx que dònan de responsa instantanèas."
+
+#: searx/templates/oscar/preferences.html:240
+msgid "Name"
+msgstr "Nom"
+
+#: searx/templates/oscar/preferences.html:241
+msgid "Keywords"
+msgstr "Mots claus"
+
+#: searx/templates/oscar/preferences.html:242
+msgid "Description"
+msgstr "Descripcion"
+
+#: searx/templates/oscar/preferences.html:243
+msgid "Examples"
+msgstr "Exemples"
+
+#: searx/templates/oscar/preferences.html:263
+msgid ""
+"This is the list of cookies and their values searx is storing on your "
+"computer."
+msgstr "S'agís de la lista dels cookies e de lors valors que searx enregistra sus vòstre ordinador."
+
+#: searx/templates/oscar/preferences.html:264
+msgid "With that list, you can assess searx transparency."
+msgstr "Amb aquesta lista, podètz jutjar de la transparéncia de searx."
+
+#: searx/templates/oscar/preferences.html:269
+msgid "Cookie name"
+msgstr "Nom del cookie"
+
+#: searx/templates/oscar/preferences.html:270
+msgid "Value"
+msgstr "Valor"
+
+#: searx/templates/oscar/preferences.html:289
+msgid "Search URL of the currently saved preferences"
+msgstr "URL de recèrca actuala dels paramètres enregistrats"
+
+#: searx/templates/oscar/preferences.html:289
+msgid ""
+"Note: specifying custom settings in the search URL can reduce privacy by "
+"leaking data to the clicked result sites."
+msgstr "Nòta : especificar de paramètres personalizats en l’URL pòt reduire la privacitat en revelar de donadas als sites de resultat clicats."
+
+#: searx/templates/oscar/results.html:17
+msgid "Search results"
+msgstr "Resultats de la recerca"
+
+#: searx/templates/oscar/results.html:21
+#: searx/templates/simple/results.html:84
+msgid "Try searching for:"
+msgstr "Ensajatz de cercar :"
+
+#: searx/templates/oscar/results.html:100
+#: searx/templates/simple/results.html:25
+msgid "Engines cannot retrieve results"
+msgstr "Los cercadors pòdons pas recuperar los resultats"
+
+#: searx/templates/oscar/results.html:131
+msgid "Links"
+msgstr "Ligams"
+
+#: searx/templates/oscar/search.html:8
+#: searx/templates/oscar/search_full.html:11
+#: searx/templates/simple/search.html:5
+msgid "Start search"
+msgstr "Començar de cercar"
+
+#: searx/templates/oscar/stats.html:2
+msgid "stats"
+msgstr "estatisticas"
+
+#: searx/templates/oscar/time-range.html:3
+#: searx/templates/simple/time-range.html:3
+msgid "Anytime"
+msgstr "Impòrta pas quand"
+
+#: searx/templates/oscar/time-range.html:6
+#: searx/templates/simple/time-range.html:6
+msgid "Last day"
+msgstr "Ièr"
+
+#: searx/templates/oscar/time-range.html:9
+#: searx/templates/simple/time-range.html:9
+msgid "Last week"
+msgstr "La setmana passada"
+
+#: searx/templates/oscar/time-range.html:12
+#: searx/templates/simple/time-range.html:12
+msgid "Last month"
+msgstr "Lo mes passat"
+
+#: searx/templates/oscar/time-range.html:15
+#: searx/templates/simple/time-range.html:15
+msgid "Last year"
+msgstr "L'an passat"
+
+#: searx/templates/oscar/messages/first_time.html:6
+#: searx/templates/oscar/messages/no_data_available.html:3
+msgid "Heads up!"
+msgstr "Astúcia !"
+
+#: searx/templates/oscar/messages/first_time.html:7
+msgid "It look like you are using searx first time."
+msgstr "Sembla qu'utilizatz searx pel primièr còp."
+
+#: searx/templates/oscar/messages/no_cookies.html:3
+msgid "Information!"
+msgstr "Informacion !"
+
+#: searx/templates/oscar/messages/no_cookies.html:4
+msgid "currently, there are no cookies defined."
+msgstr "pel moment i a pas cap de cookie definit"
+
+#: searx/templates/oscar/messages/no_data_available.html:4
+msgid "There is currently no data available. "
+msgstr "Pel moment i a pas cap de donada disponibla."
+
+#: searx/templates/oscar/messages/no_results.html:4
+#: searx/templates/simple/messages/no_results.html:4
+msgid "Engines cannot retrieve results."
+msgstr "Los cercadors pòdons pas recuperar los resultats."
+
+#: searx/templates/oscar/messages/no_results.html:10
+#: searx/templates/simple/messages/no_results.html:10
+msgid "Please, try again later or find another searx instance."
+msgstr "Mercés de tornar ensajar o de trobar una instància searx mai"
+
+#: searx/templates/oscar/messages/no_results.html:14
+#: searx/templates/simple/messages/no_results.html:14
+msgid "Sorry!"
+msgstr "O planhèm !"
+
+#: searx/templates/oscar/messages/no_results.html:15
+#: searx/templates/simple/messages/no_results.html:15
+msgid ""
+"we didn't find any results. Please use another query or search in more "
+"categories."
+msgstr "avèm pas trobat cap de resultat. Mercés d'utilizar une autre mot clau o de cercar dins autras categorias."
+
+#: searx/templates/oscar/messages/save_settings_successfull.html:7
+msgid "Well done!"
+msgstr "Òsca !"
+
+#: searx/templates/oscar/messages/save_settings_successfull.html:8
+msgid "Settings saved successfully."
+msgstr "Paramètres salvagardats amb succès."
+
+#: searx/templates/oscar/messages/unknow_error.html:7
+msgid "Oh snap!"
+msgstr "Bondu!"
+
+#: searx/templates/oscar/messages/unknow_error.html:8
+msgid "Something went wrong."
+msgstr "Quicòm a fracassat."
+
+#: searx/templates/oscar/result_templates/default.html:7
+#: searx/templates/simple/result_templates/default.html:6
+msgid "show media"
+msgstr "mostrar mèdias"
+
+#: searx/templates/oscar/result_templates/default.html:7
+#: searx/templates/simple/result_templates/default.html:6
+msgid "hide media"
+msgstr "escondre mèdias"
+
+#: searx/templates/oscar/result_templates/images.html:30
+msgid "Get image"
+msgstr "Obténer l'imatge"
+
+#: searx/templates/oscar/result_templates/images.html:33
+msgid "View source"
+msgstr "Veire font"
+
+#: searx/templates/oscar/result_templates/map.html:7
+#: searx/templates/simple/result_templates/map.html:7
+msgid "show map"
+msgstr "mostrar la mapa"
+
+#: searx/templates/oscar/result_templates/map.html:7
+#: searx/templates/simple/result_templates/map.html:7
+msgid "hide map"
+msgstr "escondre la mapa"
+
+#: searx/templates/oscar/result_templates/map.html:11
+#: searx/templates/simple/result_templates/map.html:11
+msgid "show details"
+msgstr "mostrar detalhs"
+
+#: searx/templates/oscar/result_templates/map.html:11
+#: searx/templates/simple/result_templates/map.html:11
+msgid "hide details"
+msgstr "escondre detalhs"
+
+#: searx/templates/oscar/result_templates/torrent.html:7
+#: searx/templates/simple/result_templates/torrent.html:11
+msgid "Filesize"
+msgstr "Talha del fichièr"
+
+#: searx/templates/oscar/result_templates/torrent.html:9
+#: searx/templates/simple/result_templates/torrent.html:12
+msgid "Bytes"
+msgstr "octets"
+
+#: searx/templates/oscar/result_templates/torrent.html:10
+#: searx/templates/simple/result_templates/torrent.html:13
+msgid "kiB"
+msgstr "kiO"
+
+#: searx/templates/oscar/result_templates/torrent.html:11
+#: searx/templates/simple/result_templates/torrent.html:14
+msgid "MiB"
+msgstr "MiO"
+
+#: searx/templates/oscar/result_templates/torrent.html:12
+#: searx/templates/simple/result_templates/torrent.html:15
+msgid "GiB"
+msgstr "GiO"
+
+#: searx/templates/oscar/result_templates/torrent.html:13
+#: searx/templates/simple/result_templates/torrent.html:16
+msgid "TiB"
+msgstr "TiO"
+
+#: searx/templates/oscar/result_templates/torrent.html:15
+#: searx/templates/simple/result_templates/torrent.html:20
+msgid "Number of Files"
+msgstr "Nombre de fichièrs"
+
+#: searx/templates/oscar/result_templates/videos.html:7
+#: searx/templates/simple/result_templates/videos.html:6
+msgid "show video"
+msgstr "mostrar la vidèo"
+
+#: searx/templates/oscar/result_templates/videos.html:7
+#: searx/templates/simple/result_templates/videos.html:6
+msgid "hide video"
+msgstr "escondre la vidèo"
+
+#: searx/templates/pix-art/results.html:28
+msgid "Load more..."
+msgstr "Ne cargar mai..."
+
+#: searx/templates/simple/base.html:31
+msgid "No item found"
+msgstr "Cap d’element pas trobat"
+
+#: searx/templates/simple/preferences.html:89
+msgid "Supports selected language"
+msgstr "Compatible amb las lengas seleccionadas"
+
+#: searx/templates/simple/preferences.html:118
+msgid "User interface"
+msgstr "Interfàcia utilizaire"
+
+#: searx/templates/simple/preferences.html:154
+msgid "Privacy"
+msgstr "Privacitat"
diff --git a/searx/translations/pl/LC_MESSAGES/messages.mo b/searx/translations/pl/LC_MESSAGES/messages.mo
index e4a451013..595154a68 100644
--- a/searx/translations/pl/LC_MESSAGES/messages.mo
+++ b/searx/translations/pl/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/pt/LC_MESSAGES/messages.mo b/searx/translations/pt/LC_MESSAGES/messages.mo
index d88c449f1..e6fa6dc5b 100644
--- a/searx/translations/pt/LC_MESSAGES/messages.mo
+++ b/searx/translations/pt/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/pt/LC_MESSAGES/messages.po b/searx/translations/pt/LC_MESSAGES/messages.po
index d8446731a..f9342cd29 100644
--- a/searx/translations/pt/LC_MESSAGES/messages.po
+++ b/searx/translations/pt/LC_MESSAGES/messages.po
@@ -4,14 +4,14 @@
#
# Translators:
# Dickprince, 2017
-# Chacal Exodius, 2018
+# C. E., 2018
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-12-26 22:43+0000\n"
-"Last-Translator: Chacal Exodius\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: Dickprince\n"
"Language-Team: Portuguese (http://www.transifex.com/asciimoo/searx/language/pt/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -32,63 +32,63 @@ msgstr "solicitar exceção"
msgid "unexpected crash"
msgstr "acidente inesperado"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "ficheiros"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "geral"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "música"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "redes sociais"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "imagens"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "vídeos"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "ti"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "notícias"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "mapa"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "ciência"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Definições inválidas, por favor edite as suas preferências"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Configurações inválidas"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "erro de procura"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} minuto(s) atrás"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} hora(s), {minutes} minuto(s) atrás"
@@ -108,29 +108,28 @@ msgstr "Funções de estatística"
msgid "Compute {functions} of the arguments"
msgstr "Calcular {functions} dos argumentos"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Tempo de pesquisa (seg)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Página carregada (seg)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Número de resultados"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Contagens"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Contagens por resultado"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Erros"
@@ -142,9 +141,15 @@ msgstr "{title}&nbsp;(OBSOLETE)"
msgid "This entry has been superseded by"
msgstr "Esta entrada foi substituída por"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Nenhum resumo está disponível para esta publicação."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "Reformulação DOAI"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Evite acessos pagos acedendo a versões de livre acesso sempre que disponível"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -158,16 +163,6 @@ msgstr "Deslocação Infinita"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Carregar automaticamente a próxima página assim que se desloque para o fim da página atual"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Reescrita DOI de acesso aberto"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Evite acessos pagos acedendo a versões de livre acesso sempre que disponível"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -330,8 +325,8 @@ msgstr "Método"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -403,8 +398,8 @@ msgstr "Motores de pesquisa utilizados"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -419,8 +414,8 @@ msgstr "Categoria"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -438,7 +433,7 @@ msgstr "Bloquear"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -448,7 +443,7 @@ msgstr "Estas definições são guardadas nos seus cookies, isto permite-nos que
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -458,7 +453,7 @@ msgstr "Estes cookies servem somente para sua conveniência, não os utilizamos
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -466,14 +461,14 @@ msgstr "Guardar"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Repor predefinições"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -644,23 +639,23 @@ msgid "General"
msgstr "Geral"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Motores de pesquisa"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Extensões"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Remetente"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cookies"
@@ -711,88 +706,78 @@ msgstr "Escolher estilo para este tema"
msgid "Style"
msgstr "Estilo"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Resolvedor DOI de Acesso Aberto"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Redirecionar para versões de acesso aberto de publicações quando disponíveis (requer plug-in)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Atalho"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Idioma selecionado"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Período de tempo"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Tempo médio"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Tempo máximo"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Esta é a lista dos modulos instantâneos de resposta do searx"
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Nome"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Palavras-chave"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Descrição"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Exemplos"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Esta é a lista de cookies e os valores que o searx está a guardar no seu computador."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Com essa lista pode aceder à transparência do searx."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Nome de cookie"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Valor"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "URL de pesquisa das preferências salvas atualmente"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/pt_BR/LC_MESSAGES/messages.mo b/searx/translations/pt_BR/LC_MESSAGES/messages.mo
index 03eb74f4e..c37882dc6 100644
--- a/searx/translations/pt_BR/LC_MESSAGES/messages.mo
+++ b/searx/translations/pt_BR/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/pt_BR/LC_MESSAGES/messages.po b/searx/translations/pt_BR/LC_MESSAGES/messages.po
index 6a0a6b837..18bae82a9 100644
--- a/searx/translations/pt_BR/LC_MESSAGES/messages.po
+++ b/searx/translations/pt_BR/LC_MESSAGES/messages.po
@@ -4,9 +4,9 @@
#
# Translators:
# Adam Tauber <asciimoo@gmail.com>, 2017
-# Chacal Exodius, 2018
+# C. E., 2018
# Gabriel Nunes <gabriel.hkr@gmail.com>, 2017
-# Guimarães Mello <maeslor@cryptolab.net>, 2017
+# Guimarães Mello <matheus.mello@disroot.org>, 2017
# Neton Brício <fervelinux@gmail.com>, 2015
# pizzaiolo, 2016
# shizuka, 2018
@@ -14,9 +14,9 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-08-06 05:21+0000\n"
-"Last-Translator: Chacal Exodius\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: pizzaiolo\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/asciimoo/searx/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -37,63 +37,63 @@ msgstr "falha na requisição"
msgid "unexpected crash"
msgstr "erro inesperado"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "arquivos"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "geral"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "áudio"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "redes sociais"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "imagens"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "vídeos"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "códigos"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "notícias"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "mapas"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "ciência"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Configurações inválidas, por favor, edite suas preferências"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Configurações inválidas"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "erro de busca"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutos} minuto(s) atrás"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} hora(s), {minutes} minuto(s) atrás"
@@ -113,29 +113,28 @@ msgstr "Funções estatísticas"
msgid "Compute {functions} of the arguments"
msgstr "Compute {functions} dos argumentos"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Tempo do motor (segundos)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Carregamento da página (sec)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Número de resultados"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Pontuações"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Pontuações por resultado"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Erros"
@@ -147,9 +146,15 @@ msgstr "{title}&nbsp;(OBSOLETA)"
msgid "This entry has been superseded by"
msgstr "Esta entrada foi substituída por"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Nenhum resumo disponível para essa publicação."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "Redirecionamento ao DOAI"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Evita \"paywalls\" ao redirecionar para versões de acesso livre de publicações, quando possível"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -163,16 +168,6 @@ msgstr "Scroll infinito"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Automaticamente carregar a próxima página quando ir até o fim da página atual"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Reescrita DOI de acesso aberto"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Evita \"paywalls\" ao redirecionar para versões de acesso livre de publicações, quando possível"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -335,8 +330,8 @@ msgstr "Método"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -408,8 +403,8 @@ msgstr "Serviço de busca usado atualmente"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -424,8 +419,8 @@ msgstr "Categoria"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -443,7 +438,7 @@ msgstr "Bloqueado"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -453,7 +448,7 @@ msgstr "Essas configurações são armazenadas em seus cookies, nos não armazen
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -463,7 +458,7 @@ msgstr "Estes cookies servem ao seu único propósito, nós não usamos esses co
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -471,14 +466,14 @@ msgstr "salvar"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Redefinir configurações"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -649,23 +644,23 @@ msgid "General"
msgstr "Geral"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Buscadores"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Complementos"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Operadores de Resposta"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cookies"
@@ -716,88 +711,78 @@ msgstr "Escolher um estilo para este tema"
msgid "Style"
msgstr "Estilo"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Resolvedor DOI de Acesso Aberto"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Quando disponível, redirecionar para as versões de acesso livre das publicações (necessário plugin)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Atalhos"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Idioma selecionado"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Intervalo de tempo"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Tempo médio"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Tempo máximo"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Esta é a lista do módulos de resposta instantânea do searx."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Nome"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Palavras-chave"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Descrição"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Exemplos"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Esta é a lista de cookies que o searx está armazenando em seu computador."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Com essa lista, você pode avaliar a transparência do searx."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Nome do cookie"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Valor"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "URL de Pesquisa das configurações salvas atuais"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/ro/LC_MESSAGES/messages.mo b/searx/translations/ro/LC_MESSAGES/messages.mo
index f39068576..d90ed5144 100644
--- a/searx/translations/ro/LC_MESSAGES/messages.mo
+++ b/searx/translations/ro/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/ro/LC_MESSAGES/messages.po b/searx/translations/ro/LC_MESSAGES/messages.po
index 7cfd1be37..625feea8f 100644
--- a/searx/translations/ro/LC_MESSAGES/messages.po
+++ b/searx/translations/ro/LC_MESSAGES/messages.po
@@ -4,14 +4,16 @@
#
# Translators:
# adrian.fita <adrian.fita@gmail.com>, 2015
+# adrian.fita <adrian.fita@gmail.com>, 2015
# Daniel Șerbănescu <daniel@serbanescu.dk>, 2018
+# Mihai Pora <mihai.pora@gmail.com>, 2019
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-11-15 21:18+0000\n"
-"Last-Translator: Daniel Șerbănescu <daniel@serbanescu.dk>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-08-31 18:38+0000\n"
+"Last-Translator: Mihai Pora <mihai.pora@gmail.com>\n"
"Language-Team: Romanian (http://www.transifex.com/asciimoo/searx/language/ro/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -32,63 +34,63 @@ msgstr "excepție la cerere"
msgid "unexpected crash"
msgstr "terminare prematură neașteptată"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "fișiere"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "generale"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "muzică"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "rețele sociale"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "imagini"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "videouri"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "informatică"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "știri"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "hărți"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "știință"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Configurări nevalide, editați preferințele"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Configurări nevalide"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "eroare de căutare"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} minut(e) în urmă"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} oră(e), {minutes} minut(e) în urmă"
@@ -108,29 +110,28 @@ msgstr "Funcții statistice"
msgid "Compute {functions} of the arguments"
msgstr "Calculează {functions} din argumente"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Timpul motorului (sec)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Încărcarea paginii (sec)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Numărul de rezultate"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Scoruri"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Scoruri per rezultat"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Erori"
@@ -142,9 +143,15 @@ msgstr "{title}&nbsp;(ÎNVECHIT)"
msgid "This entry has been superseded by"
msgstr "Această intrare a fost perimată de"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Niciun abstract disponibil pentru această publicație."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "Rescriere DOAI"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Evită „zidurile de plată” redirecționând către versiuni cu acces deschis ale publicațiilor când sunt disponibile"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -158,16 +165,6 @@ msgstr "Derulare infinită"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Încarcă automat pagina următoare când se derulează la baza paginii curente"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Rescriere către acces deschis DOI"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Evită „zidurile de plată” redirecționând către versiuni cu acces deschis ale publicațiilor când sunt disponibile"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -330,8 +327,8 @@ msgstr "Metodă"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -403,8 +400,8 @@ msgstr "Motoarele de căutare folosite curent"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -419,8 +416,8 @@ msgstr "Categorie"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -438,7 +435,7 @@ msgstr "Blochează"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -448,7 +445,7 @@ msgstr "Aceste configurări sunt stocate în cookie-uri, ceea ce ne permite să
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -458,7 +455,7 @@ msgstr "Aceste cookie-uri servesc doar pentru conveniența dumneavoastră, noi n
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -466,14 +463,14 @@ msgstr "salvează"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Restabilește la valorile implicite"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -644,23 +641,23 @@ msgid "General"
msgstr "Generale"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Motoare"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Module"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Răspunzători"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cookie-uri"
@@ -711,88 +708,78 @@ msgstr "Alegeți stilul pentru această temă"
msgid "Style"
msgstr "Stil"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Rezolvator de acces deschis DOI"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Redirecționează către versiuni cu acces deschis ale publicațiilor când sunt disponibile (modul necesar)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Scurtătură"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Limba selectată"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Interval de timp"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Timp mediu"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Timp maxim"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Aceasta este lista de module de răspundere instantă a lui searx."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Nume"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Cuvinte cheie"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Descriere"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Exemple"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Aceasta este lista de cookie-uri și valorile lor pe care searx le stochează pe calculatorul dumneavoastră."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Cu acea listă puteți evalua nivelul de transparență al lui searx."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Nume cookie"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Valuare"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "URL-ul de căutare al preferințelor salvate curent"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/ru/LC_MESSAGES/messages.mo b/searx/translations/ru/LC_MESSAGES/messages.mo
index c6bcdd1b6..7132a8c1f 100644
--- a/searx/translations/ru/LC_MESSAGES/messages.mo
+++ b/searx/translations/ru/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/ru/LC_MESSAGES/messages.po b/searx/translations/ru/LC_MESSAGES/messages.po
index befe7f963..ec7975b5f 100644
--- a/searx/translations/ru/LC_MESSAGES/messages.po
+++ b/searx/translations/ru/LC_MESSAGES/messages.po
@@ -5,7 +5,7 @@
# Translators:
# Andrey, 2017-2019
# dimqua <dimqua@riseup.net>, 2015
-# dimqua <dimqua@riseup.net>, 2015
+# dimqua <dimqua@riseup.net>, 2015,2017
# dimqua <dimqua@riseup.net>, 2017
# John DOe <is-kir@ya.ru>, 2018
# Дмитрий Михирев, 2016-2017
@@ -13,8 +13,8 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2019-01-05 12:11+0000\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
"Last-Translator: Andrey\n"
"Language-Team: Russian (http://www.transifex.com/asciimoo/searx/language/ru/)\n"
"MIME-Version: 1.0\n"
@@ -36,63 +36,63 @@ msgstr "ошибка выполнения запроса"
msgid "unexpected crash"
msgstr "неожиданный сбой"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "файлы"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "общие"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "музыка"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "социальные сети"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "картинки"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "видео"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "it"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "новости"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "карты"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "наука"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Неправильные параметры, измените настройки"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Настройки некорректны"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "ошибка поиска"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} минут(а) назад"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} час(ов), {minutes} минут(а) назад"
@@ -112,29 +112,28 @@ msgstr "Статистические функции"
msgid "Compute {functions} of the arguments"
msgstr "Вычисляет {functions} от аргументов"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Время поиска (сек)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Загрузка страниц (сек)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Количество результатов"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Попаданий"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Попаданий за результат"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Ошибки"
@@ -146,9 +145,15 @@ msgstr "{title}&nbsp;(УСТАРЕВШИЕ)"
msgid "This entry has been superseded by"
msgstr "Эта запись была заменена на"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Нет аннотации для этой публикации."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "Перезапись DOAI"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Позволяет получить бесплатную версию запрашиваемой статьи, если таковая имеется"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -162,16 +167,6 @@ msgstr "Бесконечная прокрутка"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Автоматически загружать следующую страницу при прокрутке до конца текущей"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Перезапись открытого доступа к DOI"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Позволяет получить бесплатную версию запрашиваемой статьи, если таковая имеется"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -334,8 +329,8 @@ msgstr "Метод"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -407,8 +402,8 @@ msgstr "Используемые поисковые системы"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -423,8 +418,8 @@ msgstr "Категория"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -442,7 +437,7 @@ msgstr "Блокировать"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -452,7 +447,7 @@ msgstr "Настройки сохраняются в ваших файлах coo
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -462,7 +457,7 @@ msgstr "Эти файлы используются исключительно д
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -470,14 +465,14 @@ msgstr "сохранить"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Восстановить настройки по умолчанию"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -648,23 +643,23 @@ msgid "General"
msgstr "Общие"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Поисковые системы"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Плагины"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Ответчики"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cookie"
@@ -715,88 +710,78 @@ msgstr "Стиль для выбранной темы"
msgid "Style"
msgstr "Стиль"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Распознаватель открытого доступа к DOI"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Перенаправление на открытые версии публикаций при их наличии (требуется плагин)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Сокращение"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Выбранный язык"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Временной диапазон"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Среднее время"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Максимальное время"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Это список модулей мгновенного ответа searx"
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Имя"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Ключевые слова"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Описание"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Примеры"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Это список файлов cookie и их значения, которые searx хранит на вашем компьютере."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "С помощью этого списка можно оценить прозрачность searx."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Имя файла cookie"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Значение"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "URL поиска для текущих сохраненных параметров"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/sk/LC_MESSAGES/messages.mo b/searx/translations/sk/LC_MESSAGES/messages.mo
index 0d8f6fa70..7156b51dd 100644
--- a/searx/translations/sk/LC_MESSAGES/messages.mo
+++ b/searx/translations/sk/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/sk/LC_MESSAGES/messages.po b/searx/translations/sk/LC_MESSAGES/messages.po
index ebf1bba55..60ef06461 100644
--- a/searx/translations/sk/LC_MESSAGES/messages.po
+++ b/searx/translations/sk/LC_MESSAGES/messages.po
@@ -8,16 +8,16 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2017-11-01 20:31+0000\n"
-"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: Jan Hovancik\n"
"Language-Team: Slovak (http://www.transifex.com/asciimoo/searx/language/sk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.3.4\n"
"Language: sk\n"
-"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n"
#: searx/search.py:137 searx/search.py:182
msgid "timeout"
@@ -31,63 +31,63 @@ msgstr ""
msgid "unexpected crash"
msgstr ""
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "súbory"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "všeobecné"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "hudba"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "sociálne médiá"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "obrázky"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "videá"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "technika"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "správy"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "mapy"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "veda"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Neplatné nastavenia, upravte svoje hodnoty, prosím"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr ""
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "chyba vyhľadávania"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} min. pred"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} hod., {minutes} min. pred"
@@ -107,29 +107,28 @@ msgstr "Štatistické funkcie"
msgid "Compute {functions} of the arguments"
msgstr "Vypočítať {functions} argumentov"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Načítanie vyhľadávača (sek)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Načítanie stránky (sek)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Počet výsledkov"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr ""
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr ""
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Chyby"
@@ -141,9 +140,15 @@ msgstr "{title}&nbsp;(ZASTARANÉ)"
msgid "This entry has been superseded by"
msgstr "Táto položka bola nahradená"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr ""
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "Prepis DOAI"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Vyhnúť sa plateným bránam presmerovaním na verejne prístupné verzie publikácií ak sú k dispozícii"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -157,16 +162,6 @@ msgstr "Nekonečné posúvanie"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Automaticky načítať ďalšiu stránku pri posunutí na koniec aktuálnej stránky"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr ""
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Vyhnúť sa plateným bránam presmerovaním na verejne prístupné verzie publikácií ak sú k dispozícii"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -329,8 +324,8 @@ msgstr "Metóda"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -402,8 +397,8 @@ msgstr "poruba@contours.cz"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -418,8 +413,8 @@ msgstr "Kategória"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -437,7 +432,7 @@ msgstr "Blokovať"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -447,7 +442,7 @@ msgstr "Tieto nastavenia sú uložené v cookies, čo nám umožňuje neukladať
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -457,7 +452,7 @@ msgstr "Tieto cookies slúžia výhradné pre vaše pohodlie a nie sú používa
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -465,14 +460,14 @@ msgstr "uložiť"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Obnoviť predvolené"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -643,23 +638,23 @@ msgid "General"
msgstr "Všeobecné"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Vyhľadávače"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Zásuvné moduly"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Rýchle odpovede"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cookies"
@@ -710,88 +705,78 @@ msgstr "Vyberte si štýl pre túto tému"
msgid "Style"
msgstr "Štýl"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr ""
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr ""
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Skratka"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr ""
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Časový rozsah"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Priemerný čas"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Maximálny čas"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Toto je zoznam modulov rýchlej odpovede pre searx."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Názov"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Kľúčové slová"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Popis"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Príklady"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Toto je zoznam cookies a ich hodnôt uložených searx na vašom počítači"
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Pomocou tohto zoznamu môžte vidieť transparentnosť searx."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Názov cookie"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Hodnota"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr ""
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/sl/LC_MESSAGES/messages.mo b/searx/translations/sl/LC_MESSAGES/messages.mo
index b2cf9e1b1..9e980f78c 100644
--- a/searx/translations/sl/LC_MESSAGES/messages.mo
+++ b/searx/translations/sl/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/sl/LC_MESSAGES/messages.po b/searx/translations/sl/LC_MESSAGES/messages.po
index 3ce7f97d6..77ef61b8c 100644
--- a/searx/translations/sl/LC_MESSAGES/messages.po
+++ b/searx/translations/sl/LC_MESSAGES/messages.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-05-01 08:59+0000\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
"Last-Translator: asladic <ales.sladic@gmail.com>\n"
"Language-Team: Slovenian (http://www.transifex.com/asciimoo/searx/language/sl/)\n"
"MIME-Version: 1.0\n"
@@ -31,63 +31,63 @@ msgstr "napaka poizvedbe"
msgid "unexpected crash"
msgstr "nepričakovana napaka"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "datoteke"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "splošno"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "glasba"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "družabna omrežja"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "slike"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "videi"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "informatika"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "novice"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "zemljevid"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "znanost"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Neveljavne nastavitve. Prosimo, preverite vašo konfiguracijo"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Neveljavne nastavitve"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "napaka pri iskanju"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} minut nazaj"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "pred {hours} urami in {minutes} minut"
@@ -107,29 +107,28 @@ msgstr "Statistične funkcije"
msgid "Compute {functions} of the arguments"
msgstr "Izračunaj {functions} argumentov"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Čas iskanja (sek.)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Čas nalaganja (sek.)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Število zadetkov"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Točke"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Točke na zadetek"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Napake"
@@ -141,9 +140,15 @@ msgstr "{title}&nbsp;(ZASTARANO)"
msgid "This entry has been superseded by"
msgstr "Ta vnos je presegel"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr ""
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "prepisovanje DOAI"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Izogibanje plačilom s preusmeritvijo na prostodostopne različice publikacij, ko so na voljo"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -157,16 +162,6 @@ msgstr "Neskončno drsenje"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Samodejno naloži naslednjo stran ob ogledu dna trenutne strani"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr ""
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Izogibanje plačilom s preusmeritvijo na prostodostopne različice publikacij, ko so na voljo"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -329,8 +324,8 @@ msgstr "Metoda"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -402,8 +397,8 @@ msgstr "Trenutno uporabljeni iskalniki"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -418,8 +413,8 @@ msgstr "Kategorija"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -437,7 +432,7 @@ msgstr "Blokiraj"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -447,7 +442,7 @@ msgstr "Te nastavitve so shranjene v vaših piškotkih; to nam omogoča, da ne h
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -457,7 +452,7 @@ msgstr "Ti piškotki so za boljšo izkušnjo, ne uporabljamo jih za sledenje."
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -465,14 +460,14 @@ msgstr "shrani"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Ponastavi na privzeto"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -643,23 +638,23 @@ msgid "General"
msgstr "Splošno"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Iskalniki"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Vtičniki"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Ponudniki odgovorov"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Piškotki"
@@ -710,88 +705,78 @@ msgstr "Izberite stil za trenutno temo"
msgid "Style"
msgstr "Stil"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr ""
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Preusmeri na prosto dostopne različice publikacij, ko so na voljo (zahtevan vtičnik)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Bližnjica"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Izbrani jezik"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Časovni razpon"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Povprečni čas"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Največji čas"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "To je seznam modulov searx za takojšnje odgovore."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Ime"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Ključne besede"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Opis"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Primeri"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "To je seznam piškotkov in pripadajočih vrednosti, ki jih searx hrani na vašem računalniku."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "S tem seznamom lahko ocenite transparentnost searx."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Ime piškotka"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Vrednost"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "Iskalni URL trenutno shranjenih nastavitev"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/sr/LC_MESSAGES/messages.mo b/searx/translations/sr/LC_MESSAGES/messages.mo
index 65efaaa1a..d7585916f 100644
--- a/searx/translations/sr/LC_MESSAGES/messages.mo
+++ b/searx/translations/sr/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/sr/LC_MESSAGES/messages.po b/searx/translations/sr/LC_MESSAGES/messages.po
index b676f3dcc..01e36b1e8 100644
--- a/searx/translations/sr/LC_MESSAGES/messages.po
+++ b/searx/translations/sr/LC_MESSAGES/messages.po
@@ -3,14 +3,15 @@
# This file is distributed under the same license as the PROJECT project.
#
# Translators:
+# Marc Abonce Seguin, 2019
# jugi1, 2017
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2017-11-03 11:24+0000\n"
-"Last-Translator: jugi1\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-07-28 05:07+0000\n"
+"Last-Translator: Marc Abonce Seguin\n"
"Language-Team: Serbian (http://www.transifex.com/asciimoo/searx/language/sr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -31,63 +32,63 @@ msgstr "захтевај изузетак"
msgid "unexpected crash"
msgstr "неочекивани пад"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "фајлови"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "уопштено"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "музика"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "друштвени медији"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "слике"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "видео"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "ит"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "новости"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "мапа"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "наука"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Неважеће поставке, молимо уредите свој избор"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Неважећа подешавања"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "грешка у претрази"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} минут(а) назад"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} час(a), {minutes} минут(а) назад"
@@ -105,31 +106,30 @@ msgstr "Статистичке функције"
#: searx/answerers/statistics/answerer.py:54
msgid "Compute {functions} of the arguments"
-msgstr "Израчунајте {функције} аргумената"
+msgstr "Израчунајте {functions} аргумената"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Време претраге (сек)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Учитавање странице (сек)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Број резултата"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Резултати"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Остварени резултати"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Грешке"
@@ -141,9 +141,15 @@ msgstr "{наслов}&nbsp;(ЗАСТАРЕЛО)"
msgid "This entry has been superseded by"
msgstr "Овај унос је заменио"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Абстракт није доступан за ову публикацију."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "Препис DOAI"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Избегните плаћање у случају да је доступна бесплатна публикација"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -157,16 +163,6 @@ msgstr "Бесконачно померање"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Аутоматско учитавање следеће странице приликом померања на дно текуће странице"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Отворени приступ DOI преписа"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Избегните плаћање у случају да је доступна бесплатна публикација"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -329,8 +325,8 @@ msgstr "Метода"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -402,8 +398,8 @@ msgstr "Тренутно коришћени претраживачи"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -418,8 +414,8 @@ msgstr "Категорија"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -437,7 +433,7 @@ msgstr "Блокирај"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -447,7 +443,7 @@ msgstr "Ова подешавања се чувају у вашим колачи
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -457,7 +453,7 @@ msgstr "Ови колачићи служе Вашој погодности, ми
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -465,14 +461,14 @@ msgstr "сними"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Врати на подразумевано"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -643,23 +639,23 @@ msgid "General"
msgstr "Уопштено"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Претраживачи"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Плагини"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Одговори"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Колачићи"
@@ -710,88 +706,78 @@ msgstr "Изаберите стил за ову тему"
msgid "Style"
msgstr "Стил"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Отворени приступ DOI решења"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Преусмери на верзије публикација отвореног приступа кад је доступно (потребан је плагин)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Пречица"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Изабрани језик"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Временски опсег"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Просечно време"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Макс. време"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Ово је листа searx инстант одговора."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Име"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Кључне речи"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Опис"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Примери"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Ово је листа колачића и њихова вредност се снима на вашем рачунару."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Са овом листом можете бити searx транспаренти"
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Име колачића"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Вредност"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "Pretražite URL адресу тренутно сачуваних поставки"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/sv/LC_MESSAGES/messages.mo b/searx/translations/sv/LC_MESSAGES/messages.mo
index 73d36de8c..d432f219a 100644
--- a/searx/translations/sv/LC_MESSAGES/messages.mo
+++ b/searx/translations/sv/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/sv/LC_MESSAGES/messages.po b/searx/translations/sv/LC_MESSAGES/messages.po
index e8b01c832..1949932d1 100644
--- a/searx/translations/sv/LC_MESSAGES/messages.po
+++ b/searx/translations/sv/LC_MESSAGES/messages.po
@@ -4,14 +4,14 @@
#
# Translators:
# Jonatan Nyberg, 2016-2017
-# Jonatan Nyberg, 2018
+# Jonatan Nyberg, 2018-2019
# Jonatan Nyberg, 2017-2018
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-07-24 18:39+0000\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-28 20:53+0000\n"
"Last-Translator: Jonatan Nyberg\n"
"Language-Team: Swedish (http://www.transifex.com/asciimoo/searx/language/sv/)\n"
"MIME-Version: 1.0\n"
@@ -33,63 +33,63 @@ msgstr "begär undantag"
msgid "unexpected crash"
msgstr "oväntad krasch"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "filer"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "allmänt"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "musik"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "sociala medier"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "bilder"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "videor"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "it"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "nyheter"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "karta"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "vetenskap"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Ogiltiga inställningar, vänligen redigerar dina inställningar"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Ogiltiga inställningar"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "sökfel"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} minut(er) sedan"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} timm(e/ar), {minutes} minut(er) sedan"
@@ -109,29 +109,28 @@ msgstr "Statistikfunktioner"
msgid "Compute {functions} of the arguments"
msgstr "Beräkna {functions} av argumenten"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Sökmotor tid (sek)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Sidan laddas (sek)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Antal resultat"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Poäng"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Poäng per resultat"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Fel"
@@ -143,9 +142,15 @@ msgstr "{title}&nbsp;(FÖRÅLDRAD)"
msgid "This entry has been superseded by"
msgstr "Detta inlägg har ersatts av"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Inget abstract är tillgänglig för denna publikation."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "DOAI-omskrivning"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Undvik betalväggar genom att omdirigera till öppen tillgång versioner av publikationer när de är tillgängliga"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -159,16 +164,6 @@ msgstr "Oändlig bläddring"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Automatiskt ladda nästa sida när du bläddrar till botten av aktuell sida"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Open Access DOI-omskrivning"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Undvik betalväggar genom att omdirigera till öppen tillgång versioner av publikationer när de är tillgängliga"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -331,8 +326,8 @@ msgstr "Metod"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -404,8 +399,8 @@ msgstr "För tillfället används sökmotorer"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -420,8 +415,8 @@ msgstr "Kategori"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -439,7 +434,7 @@ msgstr "Blockera"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -449,7 +444,7 @@ msgstr "Dessa inställningar lagras i dina kakor, vilket gör att vi inte lagrar
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -459,7 +454,7 @@ msgstr "Dessa kakor tjänar din egen bekvämlighet, vi använder inte dessa kako
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -467,14 +462,14 @@ msgstr "spara"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Återställ standardvärden"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -645,23 +640,23 @@ msgid "General"
msgstr "Allmänt"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Sökmotorer"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Insticksmoduler"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Besvarare"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Kakor"
@@ -712,88 +707,78 @@ msgstr "Välj stil för detta tema"
msgid "Style"
msgstr "Stil"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Open Access DOI-lösare"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Omdirigera till öppna versioner av publikationer när de är tillgängliga (tillägg krävs)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Genväg"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Valt språk"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Tidsintervall"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Genomsnittstid"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Max tid"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Detta är en lista över searxs snabbsvarsmoduler."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Namn"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Nyckelord"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Beskrivning"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Exempel"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Detta är en lista över kakor och deras värden som searx lagrar på din dator."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Med denna lista kan du bedöma searx öppenhet."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Kaknamn"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Värde"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "Sökadressen för de för nuvarande sparade inställningarna"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
@@ -835,22 +820,22 @@ msgstr "Närsom"
#: searx/templates/oscar/time-range.html:6
#: searx/templates/simple/time-range.html:6
msgid "Last day"
-msgstr "Senaste dag"
+msgstr "Igår"
#: searx/templates/oscar/time-range.html:9
#: searx/templates/simple/time-range.html:9
msgid "Last week"
-msgstr "Senaste vecka"
+msgstr "Förra veckan"
#: searx/templates/oscar/time-range.html:12
#: searx/templates/simple/time-range.html:12
msgid "Last month"
-msgstr "Senaste månad"
+msgstr "Förra månaden"
#: searx/templates/oscar/time-range.html:15
#: searx/templates/simple/time-range.html:15
msgid "Last year"
-msgstr "Senaste år"
+msgstr "Förra året"
#: searx/templates/oscar/messages/first_time.html:6
#: searx/templates/oscar/messages/no_data_available.html:3
diff --git a/searx/translations/ta/LC_MESSAGES/messages.mo b/searx/translations/ta/LC_MESSAGES/messages.mo
new file mode 100644
index 000000000..356472f65
--- /dev/null
+++ b/searx/translations/ta/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/ta/LC_MESSAGES/messages.po b/searx/translations/ta/LC_MESSAGES/messages.po
new file mode 100644
index 000000000..dbb9aa2ae
--- /dev/null
+++ b/searx/translations/ta/LC_MESSAGES/messages.po
@@ -0,0 +1,1003 @@
+# Translations template for PROJECT.
+# Copyright (C) 2017 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+#
+# Translators:
+# Balaji Ravichandran <rbalajives@gmail.com>, 2019
+# gurulenin <guruleninn@gmail.com>, 2019
+# Manimaran.K <manimaraninam1027@gmail.com>, 2019
+# Nazigai Kallan <arn1291@gmail.com>, 2019
+# POORAJITH ST <gokulkannanst@gmail.com>, 2019
+# Prasanna Venkadesh <prasmailme@gmail.com>, 2019
+msgid ""
+msgstr ""
+"Project-Id-Version: searx\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: Noémi Ványi <sitbackandwait@gmail.com>\n"
+"Language-Team: Tamil (http://www.transifex.com/asciimoo/searx/language/ta/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.3.4\n"
+"Language: ta\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: searx/search.py:137 searx/search.py:182
+msgid "timeout"
+msgstr "காலாவதியானது"
+
+#: searx/search.py:144
+msgid "request exception"
+msgstr ""
+
+#: searx/search.py:151
+msgid "unexpected crash"
+msgstr "எதிர்பாராத முடக்கம்"
+
+#: searx/webapp.py:135
+msgid "files"
+msgstr "கோப்புகள்"
+
+#: searx/webapp.py:136
+msgid "general"
+msgstr "பொதுத் தேடல்"
+
+#: searx/webapp.py:137
+msgid "music"
+msgstr "இசை"
+
+#: searx/webapp.py:138
+msgid "social media"
+msgstr "சமூக தளங்கள்"
+
+#: searx/webapp.py:139
+msgid "images"
+msgstr "படங்கள்"
+
+#: searx/webapp.py:140
+msgid "videos"
+msgstr "காணொளிகள்"
+
+#: searx/webapp.py:141
+msgid "it"
+msgstr ""
+
+#: searx/webapp.py:142
+msgid "news"
+msgstr "செய்திகள்"
+
+#: searx/webapp.py:143
+msgid "map"
+msgstr "வரைப்படம்"
+
+#: searx/webapp.py:144
+msgid "science"
+msgstr "அறிவியல்"
+
+#: searx/webapp.py:398 searx/webapp.py:653
+msgid "Invalid settings, please edit your preferences"
+msgstr "ஏற்க முடியாத அமைப்பு,உங்கள் விருப்பத்தை தொகுக்கவும்"
+
+#: searx/webapp.py:410
+msgid "Invalid settings"
+msgstr "ஏற்கமுடியாத அமைப்பு"
+
+#: searx/webapp.py:444 searx/webapp.py:488
+msgid "search error"
+msgstr "தேடல் பிழை"
+
+#: searx/webapp.py:525
+msgid "{minutes} minute(s) ago"
+msgstr "{minutes} நிமிடங்களுக்கு முன்னால்"
+
+#: searx/webapp.py:527
+msgid "{hours} hour(s), {minutes} minute(s) ago"
+msgstr "{hours} மணிநேரம், {minutes} நிமிடங்களுக்கு முன்னால்"
+
+#: searx/answerers/random/answerer.py:53
+msgid "Random value generator"
+msgstr "சீரற்ற மதிப்பு உருவாக்கி"
+
+#: searx/answerers/random/answerer.py:54
+msgid "Generate different random values"
+msgstr "வெவ்வாறான சீரற்ற மதிப்புகளை உருவாக்கு"
+
+#: searx/answerers/statistics/answerer.py:53
+msgid "Statistics functions"
+msgstr "புள்ளியியல் செயல்பாடுகள்"
+
+#: searx/answerers/statistics/answerer.py:54
+msgid "Compute {functions} of the arguments"
+msgstr ""
+
+#: searx/engines/__init__.py:194
+msgid "Engine time (sec)"
+msgstr "எந்திர நேரம் (நொடிகளில்)"
+
+#: searx/engines/__init__.py:198
+msgid "Page loads (sec)"
+msgstr ""
+
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
+#: searx/templates/simple/results.html:20
+msgid "Number of results"
+msgstr "முடிவுகளின் எண்ணிக்கை"
+
+#: searx/engines/__init__.py:206
+msgid "Scores"
+msgstr "மதிப்புகள்"
+
+#: searx/engines/__init__.py:210
+msgid "Scores per result"
+msgstr "தேடல் மதிப்பு"
+
+#: searx/engines/__init__.py:214
+msgid "Errors"
+msgstr "பிழைகள்"
+
+#: searx/engines/pdbe.py:87
+msgid "{title}&nbsp;(OBSOLETE)"
+msgstr ""
+
+#: searx/engines/pdbe.py:91
+msgid "This entry has been superseded by"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "பணம் பறிக்கும் தளங்களை தவிர்த்து முடிந்த வரையில் open-access பதிப்புகளை வழங்கும் தளங்களுக்கு செல்லவும்"
+
+#: searx/plugins/https_rewrite.py:32
+msgid "Rewrite HTTP links to HTTPS if possible"
+msgstr "முடிந்தால் HTTP இணைப்புகளை HTTPS இணைப்புகளாக மாற்றவும்"
+
+#: searx/plugins/infinite_scroll.py:3
+msgid "Infinite scroll"
+msgstr "தொடர் பட்டியல்"
+
+#: searx/plugins/infinite_scroll.py:4
+msgid "Automatically load next page when scrolling to bottom of current page"
+msgstr "பக்கத்தின் முடிவை அடைந்தவுடன் தானாக அடுத்த பக்கததிற்கு செல்லவும்"
+
+#: searx/plugins/open_results_on_new_tab.py:18
+#: searx/templates/oscar/preferences.html:114
+#: searx/templates/simple/preferences.html:149
+msgid "Open result links on new browser tabs"
+msgstr "இணைப்புகளை புதிய Tab-ல் திறக்கவும்"
+
+#: searx/plugins/open_results_on_new_tab.py:19
+msgid ""
+"Results are opened in the same window by default. This plugin overwrites the"
+" default behaviour to open links on new tabs/windows. (JavaScript required)"
+msgstr ""
+
+#: searx/plugins/search_on_category_select.py:18
+msgid "Search on category select"
+msgstr "தேர்ந்தெடுத்தப் பிரிவில் தேடுக"
+
+#: searx/plugins/search_on_category_select.py:19
+msgid ""
+"Perform search immediately if a category selected. Disable to select "
+"multiple categories. (JavaScript required)"
+msgstr "பிரிவு தேர்வு செய்யப்பட்டால் தேடல் உடனடியாகச் செயற்படுத்தும். பல பிரிவுகளைத் தேர்வு செய்ய முடக்கவும். (ஜாவா ஸ்கிரிப்ட் தேவைப்படும்)"
+
+#: searx/plugins/self_info.py:20
+msgid ""
+"Displays your IP if the query is \"ip\" and your user agent if the query "
+"contains \"user agent\"."
+msgstr "\"ip\" என்று தேடினால் உங்கள் ip முகவரியையும், \"user agent\" என்று தேடினால் உங்கள் user-agent-ம் காட்டப்படும்."
+
+#: searx/plugins/tracker_url_remover.py:26
+msgid "Tracker URL remover"
+msgstr "உளவுப் பார்க்கும் வலைதள முகவரி நீக்கி"
+
+#: searx/plugins/tracker_url_remover.py:27
+msgid "Remove trackers arguments from the returned URL"
+msgstr "உங்களை உளவு பார்த்து பின்தொடர பயன்படும் எழுத்துக்களை வலைதள முகவரியிலிருந்து நீக்குக"
+
+#: searx/plugins/vim_hotkeys.py:3
+msgid "Vim-like hotkeys"
+msgstr "Vim போன்ற hotkeys"
+
+#: searx/plugins/vim_hotkeys.py:4
+msgid ""
+"Navigate search results with Vim-like hotkeys (JavaScript required). Press "
+"\"h\" key on main or result page to get help."
+msgstr ""
+
+#: searx/templates/courgette/404.html:4 searx/templates/legacy/404.html:4
+#: searx/templates/oscar/404.html:4 searx/templates/pix-art/404.html:4
+#: searx/templates/simple/404.html:4
+msgid "Page not found"
+msgstr "பக்கம் கிடைக்கவில்லை"
+
+#: searx/templates/courgette/404.html:6 searx/templates/legacy/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#: searx/templates/simple/404.html:6
+#, python-format
+msgid "Go to %(search_page)s."
+msgstr "%(search_page)s-க்கு செல்"
+
+#: searx/templates/courgette/404.html:6 searx/templates/legacy/404.html:6
+#: searx/templates/oscar/404.html:6 searx/templates/pix-art/404.html:6
+#: searx/templates/simple/404.html:6
+msgid "search page"
+msgstr "தேடல் பக்கம்"
+
+#: searx/templates/courgette/index.html:9
+#: searx/templates/courgette/index.html:13
+#: searx/templates/courgette/results.html:5
+#: searx/templates/legacy/index.html:8 searx/templates/legacy/index.html:12
+#: searx/templates/oscar/navbar.html:7
+#: searx/templates/oscar/preferences.html:3
+#: searx/templates/pix-art/index.html:8
+msgid "preferences"
+msgstr "விருப்பத்தேர்வு"
+
+#: searx/templates/courgette/index.html:11
+#: searx/templates/legacy/index.html:10 searx/templates/oscar/about.html:2
+#: searx/templates/oscar/navbar.html:6 searx/templates/pix-art/index.html:7
+msgid "about"
+msgstr "பற்றி"
+
+#: searx/templates/courgette/preferences.html:5
+#: searx/templates/legacy/preferences.html:5
+#: searx/templates/oscar/preferences.html:8
+#: searx/templates/pix-art/preferences.html:5
+#: searx/templates/simple/preferences.html:26
+msgid "Preferences"
+msgstr "விருப்பத்தேர்வு"
+
+#: searx/templates/courgette/preferences.html:9
+#: searx/templates/legacy/preferences.html:9
+#: searx/templates/oscar/preferences.html:33
+#: searx/templates/oscar/preferences.html:35
+#: searx/templates/simple/preferences.html:34
+msgid "Default categories"
+msgstr "இயல்புநிலை பிரிவுகள்"
+
+#: searx/templates/courgette/preferences.html:13
+#: searx/templates/legacy/preferences.html:14
+#: searx/templates/oscar/preferences.html:41
+#: searx/templates/pix-art/preferences.html:9
+#: searx/templates/simple/preferences.html:39
+#: searx/templates/simple/preferences.html:163
+msgid "Search language"
+msgstr "தேடல் மொழி"
+
+#: searx/templates/courgette/preferences.html:16
+#: searx/templates/legacy/preferences.html:17
+#: searx/templates/oscar/languages.html:6
+#: searx/templates/pix-art/preferences.html:12
+#: searx/templates/simple/languages.html:2
+#: searx/templates/simple/preferences.html:42
+msgid "Default language"
+msgstr "இயல்புநிலை மொழி"
+
+#: searx/templates/courgette/preferences.html:24
+#: searx/templates/legacy/preferences.html:25
+#: searx/templates/oscar/preferences.html:47
+#: searx/templates/pix-art/preferences.html:20
+#: searx/templates/simple/preferences.html:120
+msgid "Interface language"
+msgstr "முகப்பின் மொழி"
+
+#: searx/templates/courgette/preferences.html:34
+#: searx/templates/legacy/preferences.html:35
+#: searx/templates/oscar/preferences.html:57
+#: searx/templates/simple/preferences.html:51
+msgid "Autocomplete"
+msgstr "நிறைவுத் தானியக்கம்"
+
+#: searx/templates/courgette/preferences.html:45
+#: searx/templates/legacy/preferences.html:46
+#: searx/templates/oscar/preferences.html:68
+#: searx/templates/simple/preferences.html:166
+msgid "Image proxy"
+msgstr "பட நிகராளி"
+
+#: searx/templates/courgette/preferences.html:48
+#: searx/templates/legacy/preferences.html:49
+#: searx/templates/oscar/preferences.html:72
+#: searx/templates/simple/preferences.html:169
+msgid "Enabled"
+msgstr "செயல்படுத்து"
+
+#: searx/templates/courgette/preferences.html:49
+#: searx/templates/legacy/preferences.html:50
+#: searx/templates/oscar/preferences.html:73
+#: searx/templates/simple/preferences.html:170
+msgid "Disabled"
+msgstr "நிறுத்தப்பட்டது"
+
+#: searx/templates/courgette/preferences.html:54
+#: searx/templates/legacy/preferences.html:55
+#: searx/templates/oscar/preferences.html:77
+#: searx/templates/pix-art/preferences.html:30
+#: searx/templates/simple/preferences.html:156
+msgid "Method"
+msgstr "முறை"
+
+#: searx/templates/courgette/preferences.html:63
+#: searx/templates/legacy/preferences.html:64
+#: searx/templates/oscar/preferences.html:86
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
+#: searx/templates/simple/preferences.html:63
+#: searx/templates/simple/preferences.html:90
+msgid "SafeSearch"
+msgstr "பாதுகாப்பன தேடல்"
+
+#: searx/templates/courgette/preferences.html:66
+#: searx/templates/legacy/preferences.html:67
+#: searx/templates/oscar/preferences.html:90
+#: searx/templates/simple/preferences.html:66
+msgid "Strict"
+msgstr ""
+
+#: searx/templates/courgette/preferences.html:67
+#: searx/templates/legacy/preferences.html:68
+#: searx/templates/oscar/preferences.html:91
+#: searx/templates/simple/preferences.html:67
+msgid "Moderate"
+msgstr "மிதமான"
+
+#: searx/templates/courgette/preferences.html:68
+#: searx/templates/legacy/preferences.html:69
+#: searx/templates/oscar/preferences.html:92
+#: searx/templates/simple/preferences.html:68
+msgid "None"
+msgstr "எதுவுமில்லை"
+
+#: searx/templates/courgette/preferences.html:73
+#: searx/templates/legacy/preferences.html:74
+#: searx/templates/oscar/preferences.html:96
+#: searx/templates/pix-art/preferences.html:39
+#: searx/templates/simple/preferences.html:131
+msgid "Themes"
+msgstr ""
+
+#: searx/templates/courgette/preferences.html:83
+msgid "Color"
+msgstr "வண்ணம்"
+
+#: searx/templates/courgette/preferences.html:86
+msgid "Blue (default)"
+msgstr "நீலம் (இயல்பான)"
+
+#: searx/templates/courgette/preferences.html:87
+msgid "Violet"
+msgstr "ஊதா"
+
+#: searx/templates/courgette/preferences.html:88
+msgid "Green"
+msgstr "பச்சை"
+
+#: searx/templates/courgette/preferences.html:89
+msgid "Cyan"
+msgstr "மயில் நிறம்"
+
+#: searx/templates/courgette/preferences.html:90
+msgid "Orange"
+msgstr "ஆரஞ்சு"
+
+#: searx/templates/courgette/preferences.html:91
+msgid "Red"
+msgstr "சிவப்பு"
+
+#: searx/templates/courgette/preferences.html:96
+#: searx/templates/legacy/preferences.html:93
+#: searx/templates/pix-art/preferences.html:49
+#: searx/templates/simple/preferences.html:77
+msgid "Currently used search engines"
+msgstr "தற்போது பயன்படுத்திய தேடுபொறிகள்"
+
+#: searx/templates/courgette/preferences.html:100
+#: searx/templates/legacy/preferences.html:97
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
+#: searx/templates/pix-art/preferences.html:53
+#: searx/templates/simple/preferences.html:87
+msgid "Engine name"
+msgstr "எந்திரத்தின் பெயர்"
+
+#: searx/templates/courgette/preferences.html:101
+#: searx/templates/legacy/preferences.html:98
+msgid "Category"
+msgstr "வகுப்பு"
+
+#: searx/templates/courgette/preferences.html:102
+#: searx/templates/courgette/preferences.html:113
+#: searx/templates/legacy/preferences.html:99
+#: searx/templates/legacy/preferences.html:110
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
+#: searx/templates/pix-art/preferences.html:54
+#: searx/templates/pix-art/preferences.html:64
+#: searx/templates/simple/preferences.html:86
+msgid "Allow"
+msgstr "அனுமதி"
+
+#: searx/templates/courgette/preferences.html:102
+#: searx/templates/courgette/preferences.html:114
+#: searx/templates/legacy/preferences.html:99
+#: searx/templates/legacy/preferences.html:111
+#: searx/templates/pix-art/preferences.html:54
+#: searx/templates/pix-art/preferences.html:65
+msgid "Block"
+msgstr "தடை"
+
+#: searx/templates/courgette/preferences.html:122
+#: searx/templates/legacy/preferences.html:119
+#: searx/templates/oscar/preferences.html:285
+#: searx/templates/pix-art/preferences.html:73
+#: searx/templates/simple/preferences.html:180
+msgid ""
+"These settings are stored in your cookies, this allows us not to store this "
+"data about you."
+msgstr ""
+
+#: searx/templates/courgette/preferences.html:124
+#: searx/templates/legacy/preferences.html:121
+#: searx/templates/oscar/preferences.html:287
+#: searx/templates/pix-art/preferences.html:75
+#: searx/templates/simple/preferences.html:182
+msgid ""
+"These cookies serve your sole convenience, we don't use these cookies to "
+"track you."
+msgstr "இந்த நினைவிகள் உங்களின் வசதிக்காக மட்டுமே. இந்த நினைவிகள் உங்களை உளவு பார்க்காது."
+
+#: searx/templates/courgette/preferences.html:127
+#: searx/templates/legacy/preferences.html:124
+#: searx/templates/oscar/preferences.html:293
+#: searx/templates/pix-art/preferences.html:78
+#: searx/templates/simple/preferences.html:185
+msgid "save"
+msgstr "சேமி"
+
+#: searx/templates/courgette/preferences.html:128
+#: searx/templates/legacy/preferences.html:125
+#: searx/templates/oscar/preferences.html:295
+#: searx/templates/simple/preferences.html:186
+msgid "Reset defaults"
+msgstr "இயல்புநிலைக்குத் திருப்பவும்"
+
+#: searx/templates/courgette/preferences.html:129
+#: searx/templates/legacy/preferences.html:126
+#: searx/templates/oscar/preferences.html:294
+#: searx/templates/pix-art/preferences.html:79
+#: searx/templates/simple/preferences.html:187
+msgid "back"
+msgstr "பின்செல்"
+
+#: searx/templates/courgette/results.html:12
+#: searx/templates/legacy/results.html:13
+#: searx/templates/oscar/results.html:136
+#: searx/templates/simple/results.html:58
+msgid "Search URL"
+msgstr "இத்தேடலின் முகவரி"
+
+#: searx/templates/courgette/results.html:16
+#: searx/templates/legacy/results.html:17
+#: searx/templates/oscar/results.html:141
+#: searx/templates/simple/results.html:62
+msgid "Download results"
+msgstr "தேடல் பதில்களை தரவிறக்கு"
+
+#: searx/templates/courgette/results.html:34
+#: searx/templates/legacy/results.html:35
+#: searx/templates/simple/results.html:10
+msgid "Answers"
+msgstr "பதில்கள்"
+
+#: searx/templates/courgette/results.html:42
+#: searx/templates/legacy/results.html:43
+#: searx/templates/oscar/results.html:116
+#: searx/templates/simple/results.html:42
+msgid "Suggestions"
+msgstr "பரிந்துரைகள்"
+
+#: searx/templates/courgette/results.html:70
+#: searx/templates/legacy/results.html:81
+#: searx/templates/oscar/results.html:68 searx/templates/oscar/results.html:78
+#: searx/templates/simple/results.html:130
+msgid "previous page"
+msgstr "முந்தைய பக்கம்"
+
+#: searx/templates/courgette/results.html:81
+#: searx/templates/legacy/results.html:92
+#: searx/templates/oscar/results.html:62 searx/templates/oscar/results.html:84
+#: searx/templates/simple/results.html:145
+msgid "next page"
+msgstr "அடுத்தப் பக்கம்"
+
+#: searx/templates/courgette/search.html:3
+#: searx/templates/legacy/search.html:3 searx/templates/oscar/search.html:6
+#: searx/templates/oscar/search_full.html:9
+#: searx/templates/pix-art/search.html:3 searx/templates/simple/search.html:4
+msgid "Search for..."
+msgstr "எதைப்பற்றி தேட வேண்டும்?"
+
+#: searx/templates/courgette/stats.html:4 searx/templates/legacy/stats.html:4
+#: searx/templates/oscar/stats.html:5 searx/templates/pix-art/stats.html:4
+#: searx/templates/simple/stats.html:7
+msgid "Engine stats"
+msgstr "எந்திரத்தின் புள்ளி விவரங்கள்"
+
+#: searx/templates/courgette/result_templates/images.html:4
+#: searx/templates/legacy/result_templates/images.html:4
+#: searx/templates/pix-art/result_templates/images.html:4
+msgid "original context"
+msgstr "உண்மையான சூழல்"
+
+#: searx/templates/courgette/result_templates/torrent.html:7
+#: searx/templates/legacy/result_templates/torrent.html:11
+#: searx/templates/oscar/result_templates/torrent.html:6
+#: searx/templates/simple/result_templates/torrent.html:9
+msgid "Seeder"
+msgstr "பகிர்பவர்"
+
+#: searx/templates/courgette/result_templates/torrent.html:7
+#: searx/templates/legacy/result_templates/torrent.html:11
+#: searx/templates/oscar/result_templates/torrent.html:6
+#: searx/templates/simple/result_templates/torrent.html:9
+msgid "Leecher"
+msgstr "எடுப்பவர்"
+
+#: searx/templates/courgette/result_templates/torrent.html:9
+#: searx/templates/legacy/result_templates/torrent.html:9
+#: searx/templates/oscar/macros.html:23
+#: searx/templates/simple/result_templates/torrent.html:6
+msgid "magnet link"
+msgstr "காந்த இணைப்பு"
+
+#: searx/templates/courgette/result_templates/torrent.html:10
+#: searx/templates/legacy/result_templates/torrent.html:10
+#: searx/templates/oscar/macros.html:24
+#: searx/templates/simple/result_templates/torrent.html:7
+msgid "torrent file"
+msgstr "டொரன்ட் கோப்பு"
+
+#: searx/templates/legacy/categories.html:8
+#: searx/templates/simple/categories.html:6
+msgid "Click on the magnifier to perform search"
+msgstr "உருப்பெருக்கியைச் சொடுக்கி தேடலைத் தொடங்கவும்"
+
+#: searx/templates/legacy/preferences.html:84
+#: searx/templates/oscar/preferences.html:113
+#: searx/templates/simple/preferences.html:142
+msgid "Results on new tabs"
+msgstr "தேடல் முடிவுகள் புதிய Tab-ல்"
+
+#: searx/templates/legacy/preferences.html:87
+#: searx/templates/oscar/preferences.html:117
+#: searx/templates/simple/preferences.html:145
+msgid "On"
+msgstr "இயக்கு"
+
+#: searx/templates/legacy/preferences.html:88
+#: searx/templates/oscar/preferences.html:118
+#: searx/templates/simple/preferences.html:146
+msgid "Off"
+msgstr "அமர்த்து"
+
+#: searx/templates/legacy/result_templates/code.html:3
+#: searx/templates/legacy/result_templates/default.html:3
+#: searx/templates/legacy/result_templates/map.html:9
+#: searx/templates/oscar/macros.html:34 searx/templates/oscar/macros.html:48
+#: searx/templates/simple/macros.html:43
+msgid "cached"
+msgstr ""
+
+#: searx/templates/oscar/advanced.html:4
+msgid "Advanced settings"
+msgstr "மேம்பட்ட அமைப்புகள்"
+
+#: searx/templates/oscar/base.html:62
+#: searx/templates/oscar/messages/first_time.html:4
+#: searx/templates/oscar/messages/save_settings_successfull.html:5
+#: searx/templates/oscar/messages/unknow_error.html:5
+msgid "Close"
+msgstr "மூடு"
+
+#: searx/templates/oscar/base.html:64
+#: searx/templates/oscar/messages/no_results.html:4
+#: searx/templates/simple/messages/no_results.html:4
+#: searx/templates/simple/results.html:25
+msgid "Error!"
+msgstr "பிழை!"
+
+#: searx/templates/oscar/base.html:90 searx/templates/simple/base.html:55
+msgid "Powered by"
+msgstr ""
+
+#: searx/templates/oscar/base.html:90 searx/templates/simple/base.html:55
+msgid "a privacy-respecting, hackable metasearch engine"
+msgstr "உங்கள் அகவுரிமையை மதிக்கும் மாற்றியமைக்ககூடிய ஒரு தேடல் எந்திரம்"
+
+#: searx/templates/oscar/macros.html:36 searx/templates/oscar/macros.html:50
+#: searx/templates/simple/macros.html:43
+msgid "proxied"
+msgstr ""
+
+#: searx/templates/oscar/macros.html:92
+msgid "supported"
+msgstr "ஆதரவுண்டு"
+
+#: searx/templates/oscar/macros.html:96
+msgid "not supported"
+msgstr "ஆதரவில்லை"
+
+#: searx/templates/oscar/preferences.html:13
+#: searx/templates/oscar/preferences.html:22
+#: searx/templates/simple/preferences.html:32
+msgid "General"
+msgstr "பொது"
+
+#: searx/templates/oscar/preferences.html:14
+#: searx/templates/oscar/preferences.html:134
+#: searx/templates/simple/preferences.html:76
+msgid "Engines"
+msgstr "எந்திரங்கள்"
+
+#: searx/templates/oscar/preferences.html:15
+#: searx/templates/oscar/preferences.html:207
+msgid "Plugins"
+msgstr "நீட்சி"
+
+#: searx/templates/oscar/preferences.html:16
+#: searx/templates/oscar/preferences.html:233
+msgid "Answerers"
+msgstr "பதில்கள்"
+
+#: searx/templates/oscar/preferences.html:17
+#: searx/templates/oscar/preferences.html:260
+msgid "Cookies"
+msgstr "நினைவிகள்"
+
+#: searx/templates/oscar/preferences.html:42
+#: searx/templates/simple/preferences.html:48
+msgid "What language do you prefer for search?"
+msgstr "தேடலுக்கு எந்த மொழியை விரும்புகிறீர்கள்?"
+
+#: searx/templates/oscar/preferences.html:48
+#: searx/templates/simple/preferences.html:128
+msgid "Change the language of the layout"
+msgstr "வடிவமைப்பின் மொழியை மாற்று"
+
+#: searx/templates/oscar/preferences.html:58
+#: searx/templates/simple/preferences.html:60
+msgid "Find stuff as you type"
+msgstr "உள்ளிடும் போதே தேடு"
+
+#: searx/templates/oscar/preferences.html:69
+#: searx/templates/simple/preferences.html:173
+msgid "Proxying image results through searx"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:78
+msgid ""
+"Change how forms are submited, <a "
+"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
+" rel=\"external\">learn more about request methods</a>"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:87
+#: searx/templates/simple/preferences.html:71
+msgid "Filter content"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:97
+#: searx/templates/simple/preferences.html:139
+msgid "Change searx layout"
+msgstr "searx-ன் வடிவமைப்பை மாற்று"
+
+#: searx/templates/oscar/preferences.html:106
+#: searx/templates/oscar/preferences.html:111
+msgid "Choose style for this theme"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:106
+#: searx/templates/oscar/preferences.html:111
+msgid "Style"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:151
+#: searx/templates/oscar/preferences.html:163
+#: searx/templates/simple/preferences.html:88
+msgid "Shortcut"
+msgstr ""
+
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
+msgid "Selected language"
+msgstr "தேர்வு செய்யப்பட்ட மொழி"
+
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
+#: searx/templates/simple/preferences.html:91
+msgid "Time range"
+msgstr "நேர வரம்பு"
+
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
+#: searx/templates/simple/preferences.html:92
+msgid "Avg. time"
+msgstr "சராசரி நேரம்"
+
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
+#: searx/templates/simple/preferences.html:93
+msgid "Max time"
+msgstr "அதிகபட்ச நேரம்"
+
+#: searx/templates/oscar/preferences.html:236
+msgid "This is the list of searx's instant answering modules."
+msgstr "இது searx-ன் உடனடி பதிலளிக்கும் தொகுதிகளின் பட்டியல்."
+
+#: searx/templates/oscar/preferences.html:240
+msgid "Name"
+msgstr "பெயர்"
+
+#: searx/templates/oscar/preferences.html:241
+msgid "Keywords"
+msgstr "குறிப்புச்சொற்கள்"
+
+#: searx/templates/oscar/preferences.html:242
+msgid "Description"
+msgstr "விளக்கம்"
+
+#: searx/templates/oscar/preferences.html:243
+msgid "Examples"
+msgstr "எடுத்துக்காட்டுகள்"
+
+#: searx/templates/oscar/preferences.html:263
+msgid ""
+"This is the list of cookies and their values searx is storing on your "
+"computer."
+msgstr "இந்தப் பட்டியல் உங்கள் கணினியில் சேமிக்கப்பட்டுள்ள searx-ன் நினைவிகள் மற்றும் அதனுடைய மதிப்புகள்."
+
+#: searx/templates/oscar/preferences.html:264
+msgid "With that list, you can assess searx transparency."
+msgstr "இந்தப் பட்டியல் மூலம் நீங்கள் searx-ன் வெளிப்படைத்தன்மையை மதிப்பிடலாம்."
+
+#: searx/templates/oscar/preferences.html:269
+msgid "Cookie name"
+msgstr "நினைவியின் பெயர்"
+
+#: searx/templates/oscar/preferences.html:270
+msgid "Value"
+msgstr "மதிப்பு"
+
+#: searx/templates/oscar/preferences.html:289
+msgid "Search URL of the currently saved preferences"
+msgstr "தற்போது சேமிக்கப்பட்ட விருப்பத்தேர்வுகளில் வலைதள முகவரியைத் தேடு"
+
+#: searx/templates/oscar/preferences.html:289
+msgid ""
+"Note: specifying custom settings in the search URL can reduce privacy by "
+"leaking data to the clicked result sites."
+msgstr "குறிப்பு : தேடல் வலைதள முகவரியில் குறிப்பிட்ட விருப்ப அமைப்புகள், கிடைத்தத் தளங்களை சொடுக்குவதன் மூலம் தரவுகள் கசிவதால் அகவுரிமை குறையும்."
+
+#: searx/templates/oscar/results.html:17
+msgid "Search results"
+msgstr "தேடல் முடிவுகள்"
+
+#: searx/templates/oscar/results.html:21
+#: searx/templates/simple/results.html:84
+msgid "Try searching for:"
+msgstr "இதுபோல் தேடி பார்க்கவும்"
+
+#: searx/templates/oscar/results.html:100
+#: searx/templates/simple/results.html:25
+msgid "Engines cannot retrieve results"
+msgstr "எந்திரங்களால் பதில்களை பெற முடியவில்லை"
+
+#: searx/templates/oscar/results.html:131
+msgid "Links"
+msgstr "இணைப்புகள்"
+
+#: searx/templates/oscar/search.html:8
+#: searx/templates/oscar/search_full.html:11
+#: searx/templates/simple/search.html:5
+msgid "Start search"
+msgstr "தேடலை துவங்கு"
+
+#: searx/templates/oscar/stats.html:2
+msgid "stats"
+msgstr "புள்ளி விவரங்கள்"
+
+#: searx/templates/oscar/time-range.html:3
+#: searx/templates/simple/time-range.html:3
+msgid "Anytime"
+msgstr "எந்நேரமும்"
+
+#: searx/templates/oscar/time-range.html:6
+#: searx/templates/simple/time-range.html:6
+msgid "Last day"
+msgstr "நேற்று"
+
+#: searx/templates/oscar/time-range.html:9
+#: searx/templates/simple/time-range.html:9
+msgid "Last week"
+msgstr "கடந்த வாரம்"
+
+#: searx/templates/oscar/time-range.html:12
+#: searx/templates/simple/time-range.html:12
+msgid "Last month"
+msgstr "கடந்த மாதம்"
+
+#: searx/templates/oscar/time-range.html:15
+#: searx/templates/simple/time-range.html:15
+msgid "Last year"
+msgstr "கடந்த ஆண்டு"
+
+#: searx/templates/oscar/messages/first_time.html:6
+#: searx/templates/oscar/messages/no_data_available.html:3
+msgid "Heads up!"
+msgstr "வாழ்த்துக்கள்!"
+
+#: searx/templates/oscar/messages/first_time.html:7
+msgid "It look like you are using searx first time."
+msgstr "நீங்கள் இதை பயன்படுத்துவது இதுதான் முதல்முறை போலுள்ளது."
+
+#: searx/templates/oscar/messages/no_cookies.html:3
+msgid "Information!"
+msgstr "தகவல்!"
+
+#: searx/templates/oscar/messages/no_cookies.html:4
+msgid "currently, there are no cookies defined."
+msgstr "தற்போது எந்தவொரு நினைவிகளும் வரையறுக்கப்படவில்லை."
+
+#: searx/templates/oscar/messages/no_data_available.html:4
+msgid "There is currently no data available. "
+msgstr "தற்போது தரவுகள் ஏதும் இல்லை."
+
+#: searx/templates/oscar/messages/no_results.html:4
+#: searx/templates/simple/messages/no_results.html:4
+msgid "Engines cannot retrieve results."
+msgstr "எந்திரத்தால் பதில்களை மீட்டெடுக்க இயலவில்லை."
+
+#: searx/templates/oscar/messages/no_results.html:10
+#: searx/templates/simple/messages/no_results.html:10
+msgid "Please, try again later or find another searx instance."
+msgstr "தயவுசெய்து பின்னர் முயற்சிக்கவும் அல்லது வேறொரு searx-யைத் தேடவும்"
+
+#: searx/templates/oscar/messages/no_results.html:14
+#: searx/templates/simple/messages/no_results.html:14
+msgid "Sorry!"
+msgstr "மன்னிக்கவும்!"
+
+#: searx/templates/oscar/messages/no_results.html:15
+#: searx/templates/simple/messages/no_results.html:15
+msgid ""
+"we didn't find any results. Please use another query or search in more "
+"categories."
+msgstr "எங்களால் எந்ததொரு பதில்களையும் தேட இயலவில்லை. தயவு செய்து வேறொரு வினவலில் அல்லது கூடுதலானப் பிரிவுகளில் தேடவும்."
+
+#: searx/templates/oscar/messages/save_settings_successfull.html:7
+msgid "Well done!"
+msgstr "சபாஷ்!"
+
+#: searx/templates/oscar/messages/save_settings_successfull.html:8
+msgid "Settings saved successfully."
+msgstr "அமைப்புகள் வெற்றிகரமாக சேமிக்கப்பட்டது."
+
+#: searx/templates/oscar/messages/unknow_error.html:7
+msgid "Oh snap!"
+msgstr "மன்னிக்கவும்!"
+
+#: searx/templates/oscar/messages/unknow_error.html:8
+msgid "Something went wrong."
+msgstr "ஏதோ தவறு நடந்துள்ளது."
+
+#: searx/templates/oscar/result_templates/default.html:7
+#: searx/templates/simple/result_templates/default.html:6
+msgid "show media"
+msgstr "ஊடகத்தைக் காட்டு"
+
+#: searx/templates/oscar/result_templates/default.html:7
+#: searx/templates/simple/result_templates/default.html:6
+msgid "hide media"
+msgstr "ஊடகத்தை மறை"
+
+#: searx/templates/oscar/result_templates/images.html:30
+msgid "Get image"
+msgstr "படத்தைப் பெறு"
+
+#: searx/templates/oscar/result_templates/images.html:33
+msgid "View source"
+msgstr "மூலத்தைப் பார்"
+
+#: searx/templates/oscar/result_templates/map.html:7
+#: searx/templates/simple/result_templates/map.html:7
+msgid "show map"
+msgstr "வரைபடத்தை காண்பி"
+
+#: searx/templates/oscar/result_templates/map.html:7
+#: searx/templates/simple/result_templates/map.html:7
+msgid "hide map"
+msgstr "வரைபடத்தை மறை"
+
+#: searx/templates/oscar/result_templates/map.html:11
+#: searx/templates/simple/result_templates/map.html:11
+msgid "show details"
+msgstr "விவரங்களைக் காட்டு"
+
+#: searx/templates/oscar/result_templates/map.html:11
+#: searx/templates/simple/result_templates/map.html:11
+msgid "hide details"
+msgstr "விவரங்களை மறை"
+
+#: searx/templates/oscar/result_templates/torrent.html:7
+#: searx/templates/simple/result_templates/torrent.html:11
+msgid "Filesize"
+msgstr "கோப்பளவு"
+
+#: searx/templates/oscar/result_templates/torrent.html:9
+#: searx/templates/simple/result_templates/torrent.html:12
+msgid "Bytes"
+msgstr "பைட்டுகள்"
+
+#: searx/templates/oscar/result_templates/torrent.html:10
+#: searx/templates/simple/result_templates/torrent.html:13
+msgid "kiB"
+msgstr "kiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:11
+#: searx/templates/simple/result_templates/torrent.html:14
+msgid "MiB"
+msgstr "MiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:12
+#: searx/templates/simple/result_templates/torrent.html:15
+msgid "GiB"
+msgstr "GiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:13
+#: searx/templates/simple/result_templates/torrent.html:16
+msgid "TiB"
+msgstr "TiB"
+
+#: searx/templates/oscar/result_templates/torrent.html:15
+#: searx/templates/simple/result_templates/torrent.html:20
+msgid "Number of Files"
+msgstr "மொத்த கோப்புகள்"
+
+#: searx/templates/oscar/result_templates/videos.html:7
+#: searx/templates/simple/result_templates/videos.html:6
+msgid "show video"
+msgstr "காணொளிகளை காண்பி"
+
+#: searx/templates/oscar/result_templates/videos.html:7
+#: searx/templates/simple/result_templates/videos.html:6
+msgid "hide video"
+msgstr "காணொளிகளை மறை"
+
+#: searx/templates/pix-art/results.html:28
+msgid "Load more..."
+msgstr "இன்னும் கொஞ்சம்"
+
+#: searx/templates/simple/base.html:31
+msgid "No item found"
+msgstr "எதுவும் கிடைக்கவில்லை"
+
+#: searx/templates/simple/preferences.html:89
+msgid "Supports selected language"
+msgstr "தேர்ந்தெடுத்த மொழிக்கு ஆதரவு உள்ளது."
+
+#: searx/templates/simple/preferences.html:118
+msgid "User interface"
+msgstr "பயனர் இடைமுகப்பு"
+
+#: searx/templates/simple/preferences.html:154
+msgid "Privacy"
+msgstr "தனியுரிமை"
diff --git a/searx/translations/te/LC_MESSAGES/messages.mo b/searx/translations/te/LC_MESSAGES/messages.mo
index 57488bf0b..f32870e9a 100644
--- a/searx/translations/te/LC_MESSAGES/messages.mo
+++ b/searx/translations/te/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/te/LC_MESSAGES/messages.po b/searx/translations/te/LC_MESSAGES/messages.po
index 8da1506cc..20df5b791 100644
--- a/searx/translations/te/LC_MESSAGES/messages.po
+++ b/searx/translations/te/LC_MESSAGES/messages.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-03-08 16:40+0000\n"
-"Last-Translator: Joseph Nuthalapati <njoseph@thoughtworks.com>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: Noémi Ványi <sitbackandwait@gmail.com>\n"
"Language-Team: Telugu (http://www.transifex.com/asciimoo/searx/language/te/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -31,63 +31,63 @@ msgstr ""
msgid "unexpected crash"
msgstr ""
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "ఫైళ్ళు"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "సాధారణ"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "సంగీతం"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "సోషల్ మీడియా"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "చిత్రాలు"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "వీడియోలు"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "ఐటి"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "వార్తలు"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "పటము"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "విజ్ఞానశాస్త్రం"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr ""
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "చెల్లని అమరికలు"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "శోధనలో దోషము"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} నిమిషము(ల) క్రిందట"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr ""
@@ -107,29 +107,28 @@ msgstr "సాంఖ్యకశాస్త్ర ప్రమేయాలు"
msgid "Compute {functions} of the arguments"
msgstr ""
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr ""
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr ""
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "ఫలితముల సంఖ్య"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr ""
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr ""
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "దోషములు"
@@ -141,8 +140,14 @@ msgstr ""
msgid "This entry has been superseded by"
msgstr ""
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
msgstr ""
#: searx/plugins/https_rewrite.py:32
@@ -157,16 +162,6 @@ msgstr ""
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr ""
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr ""
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr ""
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -329,8 +324,8 @@ msgstr "విధానం"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -402,8 +397,8 @@ msgstr "ప్రస్తుతం ఉపయోగించబడుతున
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -418,8 +413,8 @@ msgstr "వర్గము"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -437,7 +432,7 @@ msgstr "అడ్డగించు"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -447,7 +442,7 @@ msgstr ""
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -457,7 +452,7 @@ msgstr ""
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -465,14 +460,14 @@ msgstr "దాచు"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "నిష్క్రియాలకు అమర్చు"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -643,23 +638,23 @@ msgid "General"
msgstr "సాధారణ"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "యంత్రాలు"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "ప్లగిన్లు"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "జవాబులు"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "కుకీలు"
@@ -710,88 +705,78 @@ msgstr ""
msgid "Style"
msgstr "శైలి"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr ""
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr ""
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "సత్వరమార్గం"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "ఎంచుకున్న భాష"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "కాల శ్రేణి"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "సగటు సమయం"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "గరిష్ఠ సమయం"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr ""
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "పేరు"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr ""
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "వర్ణన"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "ఉదాహరణలు"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr ""
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr ""
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "కుకీ పేరు"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "విలువ"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr ""
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/tr/LC_MESSAGES/messages.mo b/searx/translations/tr/LC_MESSAGES/messages.mo
index ec47020aa..8698157bd 100644
--- a/searx/translations/tr/LC_MESSAGES/messages.mo
+++ b/searx/translations/tr/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/tr/LC_MESSAGES/messages.po b/searx/translations/tr/LC_MESSAGES/messages.po
index a15c85609..5217849ea 100644
--- a/searx/translations/tr/LC_MESSAGES/messages.po
+++ b/searx/translations/tr/LC_MESSAGES/messages.po
@@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-12-06 17:22+0000\n"
-"Last-Translator: Arda Kılıçdağı <ardakilicdagi@gmail.com>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: Noémi Ványi <sitbackandwait@gmail.com>\n"
"Language-Team: Turkish (http://www.transifex.com/asciimoo/searx/language/tr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -33,63 +33,63 @@ msgstr "istekte bir hata oluştu"
msgid "unexpected crash"
msgstr "beklenmmeyen hata"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "dosyalar"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "genel"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "müzik"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "sosyal medya"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "görseller"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "videolar"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "bilişim"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "haberler"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "harita"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "bilim"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Hatalı ayar girildi, lütfen ayarlarınızı kontrol edin"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Hatalı ayar"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "arama hatası"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} dakika() önce"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} saat(), {minutes} dakika() önce"
@@ -109,29 +109,28 @@ msgstr "İstatistik fonksiyonları"
msgid "Compute {functions} of the arguments"
msgstr "Argümanların {functions} değerlerini hesapla"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Motor cevap süresi (sn)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Sayfa yüklenmesi (sn)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Sonuç sayısı"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Skor"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Sonuç başına skor"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Hatalar"
@@ -143,8 +142,14 @@ msgstr "{title}&nbsp;(GEÇERSİZ)"
msgid "This entry has been superseded by"
msgstr ""
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
msgstr ""
#: searx/plugins/https_rewrite.py:32
@@ -159,16 +164,6 @@ msgstr ""
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr ""
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr ""
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr ""
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -331,8 +326,8 @@ msgstr "Sorgu gönderim yöntemi"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -404,8 +399,8 @@ msgstr "Şu anda kullanılan arama motorları"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -420,8 +415,8 @@ msgstr "Türü"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -439,7 +434,7 @@ msgstr "Engelle"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -449,7 +444,7 @@ msgstr "Ayarlar çerezlerinizde saklanır. Verdiğiniz izinler, sizin hakkınız
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -459,7 +454,7 @@ msgstr "Bu çerezler size kolaylık sağlar. Sizi takip etmek için kullanılmaz
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -467,14 +462,14 @@ msgstr "kaydet"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Varsayılanları sıfırla"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -645,23 +640,23 @@ msgid "General"
msgstr "Genel"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Motorlar"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Eklentiler"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr ""
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr ""
@@ -712,88 +707,78 @@ msgstr ""
msgid "Style"
msgstr ""
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr ""
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr ""
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr ""
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr ""
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr ""
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr ""
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr ""
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr ""
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr ""
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr ""
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr ""
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr ""
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr ""
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr ""
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr ""
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr ""
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr ""
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/uk/LC_MESSAGES/messages.mo b/searx/translations/uk/LC_MESSAGES/messages.mo
index 6610dfaa7..91b533456 100644
--- a/searx/translations/uk/LC_MESSAGES/messages.mo
+++ b/searx/translations/uk/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/uk/LC_MESSAGES/messages.po b/searx/translations/uk/LC_MESSAGES/messages.po
index 7c6ac5aac..bd4b294c2 100644
--- a/searx/translations/uk/LC_MESSAGES/messages.po
+++ b/searx/translations/uk/LC_MESSAGES/messages.po
@@ -5,14 +5,15 @@
# Translators:
# pvhn4 <pvhn4@protonmail.com>, 2017
# pvhn4 <pvhn4@protonmail.com>, 2017
+# pvhn4 <pvhn4@protonmail.com>, 2017
# zubr139, 2016-2017
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2017-11-01 20:31+0000\n"
-"Last-Translator: Adam Tauber <asciimoo@gmail.com>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: zubr139\n"
"Language-Team: Ukrainian (http://www.transifex.com/asciimoo/searx/language/uk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -33,63 +34,63 @@ msgstr ""
msgid "unexpected crash"
msgstr ""
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "файли"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "загальні"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "музика"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "соцмережі"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "зображення"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "відео"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "IT"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "новини"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "карти"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "наука"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Невірні налаштування, будь ласка, зробіть зміни в налаштуваннях"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr ""
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "помилка пошуку"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} хвилин тому"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} годин, {minutes} хвилин тому"
@@ -109,29 +110,28 @@ msgstr "Функції статистики"
msgid "Compute {functions} of the arguments"
msgstr "Розрахувати {functions} аргументів"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Час пошуку (сек)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Час завантадення (сек)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Число результатів"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Влучань"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Влучань за результат"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Помилок"
@@ -143,9 +143,15 @@ msgstr "{title}&nbsp;(OBSOLETE)"
msgid "This entry has been superseded by"
msgstr "Цей запис був змінений"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr ""
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "Переписати DOAI"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Уникайте платіжних каналів шляхом переадресації на версії публікацій з відкритим доступом, коли це можливо"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -159,16 +165,6 @@ msgstr "Нескінченна прокрутка"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Автоматично завантажувати наступну сторінку при прокрутці поточної до кінця"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr ""
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Уникайте платіжних каналів шляхом переадресації на версії публікацій з відкритим доступом, коли це можливо"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -331,8 +327,8 @@ msgstr "Метод"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -404,8 +400,8 @@ msgstr "Пошукові системи, які використовуються
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -420,8 +416,8 @@ msgstr "Категорія"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -439,7 +435,7 @@ msgstr "Заблокувати"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -449,7 +445,7 @@ msgstr "Налаштування зберігаються в ваших cookie-
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -459,7 +455,7 @@ msgstr "Ці cookie-файли необхідні винятково для ва
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -467,14 +463,14 @@ msgstr "зберегти"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Відновити стандартні налаштування"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -645,23 +641,23 @@ msgid "General"
msgstr "Загальні"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Пошукові системи"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Плагіни"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Відповідачі"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cookie-файли"
@@ -712,88 +708,78 @@ msgstr "Обрати стиль для цієї теми"
msgid "Style"
msgstr "Стиль"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr ""
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr ""
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Гарячі клавіші"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr ""
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Часовий діапазон"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Середній час"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Максимальний час"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Список модулів миттєвих відповідей searx."
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Назва"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Ключові слова"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Опис"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Приклади"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Це список cookie-файлів та їх значень, які searx зберігає на вашому комп'ютері."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "По цьому списку ви можете оцінити відкритість searx."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Ім'я cookie"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Значення"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr ""
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/vi/LC_MESSAGES/messages.mo b/searx/translations/vi/LC_MESSAGES/messages.mo
index 07dc309ea..687a93d6c 100644
--- a/searx/translations/vi/LC_MESSAGES/messages.mo
+++ b/searx/translations/vi/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/vi/LC_MESSAGES/messages.po b/searx/translations/vi/LC_MESSAGES/messages.po
index d8a1a0c94..4ad30d0b0 100644
--- a/searx/translations/vi/LC_MESSAGES/messages.po
+++ b/searx/translations/vi/LC_MESSAGES/messages.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-02-28 17:27+0000\n"
-"Last-Translator: dd721411 <dd721411@gmail.com>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-02-23 17:39+0000\n"
+"Last-Translator: Noémi Ványi <sitbackandwait@gmail.com>\n"
"Language-Team: Vietnamese (http://www.transifex.com/asciimoo/searx/language/vi/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -31,63 +31,63 @@ msgstr "ngoại lệ yêu cầu"
msgid "unexpected crash"
msgstr "lỗi bất ngờ"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "các tập tin"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "tổng quát"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "âm nhạc"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "mạng xã hội"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "hình ảnh"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "phim"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "CNTT"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "tin tức"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "bản đồ"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "khoa học"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "Cài đặt không hợp lệ, xin xem lại tuỳ chỉnh"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "Cài đặt không hợp lệ"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "lỗi tìm kiếm"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} phút() trước"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} giờ(), {minutes} phút() trước"
@@ -107,29 +107,28 @@ msgstr "Các hàm thống kê"
msgid "Compute {functions} of the arguments"
msgstr "Tính toán {functions} của các đối số"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "Thời gian trình tìm kiếm (giây)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "Tải trang (giây)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "Số lượng kết quả"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "Điểm số"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "Điểm số cho từng kết quả"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "Các lỗi"
@@ -141,9 +140,15 @@ msgstr "{title}&nbsp;(LỖI THỜI)"
msgid "This entry has been superseded by"
msgstr "Mục này đã được thay thế bởi"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "Không có bản tóm tắt nào cho ấn phẩm này."
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr ""
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "Tránh việc trả phí bằng cách chuyển hướng đến các phiên bản truy cập miễn phí của ấn phẩm khi có thể"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -157,16 +162,6 @@ msgstr "Cuộn liên tục"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "Tự động tải trang kế tiếp khi cuộn đến cuối trang hiện tại"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "Viết lại DOI Truy Cập Miễn Phí"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "Tránh việc trả phí bằng cách chuyển hướng đến các phiên bản truy cập miễn phí của ấn phẩm khi có thể"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -329,8 +324,8 @@ msgstr "Phương pháp"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -402,8 +397,8 @@ msgstr "Các trình tìm kiếm đang được dùng"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -418,8 +413,8 @@ msgstr "Danh mục"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -437,7 +432,7 @@ msgstr "Chặn"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -447,7 +442,7 @@ msgstr "Những cài đặt này được lưu trữ trong các cookie, điều
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -457,7 +452,7 @@ msgstr "Những cookie này chỉ phục vụ cho chính bạn, chúng tôi khô
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -465,14 +460,14 @@ msgstr "lưu"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "Đưa về mặc định"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -643,23 +638,23 @@ msgid "General"
msgstr "Tổng quát"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "Các trình tìm kiếm"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "Các phần mở rộng"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "Trình trả lời nhanh"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Các cookie"
@@ -710,88 +705,78 @@ msgstr "Chọn phong cách cho nền này"
msgid "Style"
msgstr "Phong cách"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "Trình xử lý DOI Truy Cập Miễn Phí"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "Chuyển hướng đến các phiên bản truy cập miễn phí của ấn phẩm khi có thể (yêu cầu phần mở rộng)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "Lối tắt"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "Ngôn ngữ được chọn"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "Khoảng thời gian"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "Thời gian trung bình"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "Thời gian tối đa"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "Đây là danh sách các module trả lời nhanh của searx"
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "Tên"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "Các từ khoá"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "Mô tả"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "Các ví dụ"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "Đây là danh sách các cookie và giá trị của chúng mà searx đang lưu trữ trên máy tính của bạn."
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "Với danh sách này, bạn có thể đánh giá tính minh bạch của searx."
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Tên cookie"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "Giá trị"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "URL tìm kiếm của tuỳ chỉnh được lưu hiện tại"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/zh_CN/LC_MESSAGES/messages.mo b/searx/translations/zh_CN/LC_MESSAGES/messages.mo
index c2006aca1..081fc8818 100644
--- a/searx/translations/zh_CN/LC_MESSAGES/messages.mo
+++ b/searx/translations/zh_CN/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/zh_CN/LC_MESSAGES/messages.po b/searx/translations/zh_CN/LC_MESSAGES/messages.po
index 78acb2d40..c37c65114 100644
--- a/searx/translations/zh_CN/LC_MESSAGES/messages.po
+++ b/searx/translations/zh_CN/LC_MESSAGES/messages.po
@@ -4,7 +4,9 @@
#
# Translators:
# Crystal RainSlide, 2018
+# Jsthon, 2019
# Mingye Wang <arthur200126@gmail.com>, 2018
+# Noémi Ványi <sitbackandwait@gmail.com>, 2019
# Sion Kazama, 2018
# wenke, 2015
# wenke, 2015-2018
@@ -12,9 +14,9 @@ msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-12-10 08:32+0000\n"
-"Last-Translator: Crystal RainSlide\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-03-23 07:45+0000\n"
+"Last-Translator: Jsthon\n"
"Language-Team: Chinese (China) (http://www.transifex.com/asciimoo/searx/language/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -35,63 +37,63 @@ msgstr "请求异常"
msgid "unexpected crash"
msgstr "意外崩溃"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "文件"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "全部"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "音乐"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
-msgstr "社交媒体"
+msgstr "社交"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "图片"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "视频"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
-msgstr "IT"
+msgstr "技术"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "新闻"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "地图"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "学术"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "设置无效,请编辑您的首选项"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "设置无效"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "搜索错误"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} 分钟前"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} 小时 {minutes} 分钟前"
@@ -111,29 +113,28 @@ msgstr "统计功能"
msgid "Compute {functions} of the arguments"
msgstr "计算 {functions} 参数"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "搜索引擎时间(秒)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "页面加载(秒)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "结果数"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "得分"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "每个结果的分数"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "错误"
@@ -145,9 +146,15 @@ msgstr "{title}&nbsp;(过时)"
msgid "This entry has been superseded by"
msgstr "此条目已被取代"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "本出版物没有摘要。"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "DOAI改写"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "尽量重定向到开放访问的文章以避免付费墙(如果可用)"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -161,16 +168,6 @@ msgstr "无限滚动"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "滚动到当前页面底部时自动加载下一页"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "开放访问 DOI 重定向"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "尽量重定向到开放访问的文章以避免付费墙(如果可用)"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -333,8 +330,8 @@ msgstr "方法"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -406,8 +403,8 @@ msgstr "目前使用的搜索引擎"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -422,8 +419,8 @@ msgstr "类别"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -441,7 +438,7 @@ msgstr "阻止"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -451,7 +448,7 @@ msgstr "这些设置被存储在您的 cookie 中,这种保存设置的方式
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -461,7 +458,7 @@ msgstr "这些 Cookie 信息可辅助您便捷地使用服务,我们不会利
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -469,14 +466,14 @@ msgstr "保存"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "恢复默认"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -647,23 +644,23 @@ msgid "General"
msgstr "常规"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "搜索引擎"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "插件"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "智能答复"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cookies"
@@ -692,7 +689,7 @@ msgid ""
"Change how forms are submited, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>"
-msgstr "更改提交表单时使用的请求方法,<a href=\"https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE#%E8%AF%B7%E6%B1%82%E6%96%B9%E6%B3%95\" rel=\"external\">深入了解请求方法</a>"
+msgstr "更改提交表单时使用的请求方法,<a href=\"https://zh.wikipedia.org/wiki/超文本传输协议#请求方法\" rel=\"external\">深入了解请求方法</a>"
#: searx/templates/oscar/preferences.html:87
#: searx/templates/simple/preferences.html:71
@@ -714,88 +711,78 @@ msgstr "选择此主题的样式"
msgid "Style"
msgstr "样式"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "开放访问 DOI 解析器"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "尽可能重定向到出版物的开放访问版本(需要插件)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "快捷键"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "选择语言"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "时间范围"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "平均时间"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "最大时间"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "这是 searx 的即时回答模块列表。"
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "名称"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "关键词"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "描述"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "示例"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "此列表展示了 searx 在您设备上存储的 cookie 信息。"
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "您可以基于此表格来评估 searx 的透明度。"
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Cookie 名称"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "值"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "当前保存选项的搜索链接"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/translations/zh_Hant_TW/LC_MESSAGES/messages.mo b/searx/translations/zh_Hant_TW/LC_MESSAGES/messages.mo
index 0b2a3c921..54e063875 100644
--- a/searx/translations/zh_Hant_TW/LC_MESSAGES/messages.mo
+++ b/searx/translations/zh_Hant_TW/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/zh_TW/LC_MESSAGES/messages.mo b/searx/translations/zh_TW/LC_MESSAGES/messages.mo
index b6d43e2a8..ee24c1e77 100644
--- a/searx/translations/zh_TW/LC_MESSAGES/messages.mo
+++ b/searx/translations/zh_TW/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/searx/translations/zh_TW/LC_MESSAGES/messages.po b/searx/translations/zh_TW/LC_MESSAGES/messages.po
index 0a4796f97..d09317ab2 100644
--- a/searx/translations/zh_TW/LC_MESSAGES/messages.po
+++ b/searx/translations/zh_TW/LC_MESSAGES/messages.po
@@ -4,15 +4,16 @@
#
# Translators:
# FIRST AUTHOR <EMAIL@ADDRESS>, 2016
-# Jeff Huang <s8321414@gmail.com>, 2017
+# 黃柏諺 <s8321414@gmail.com>, 2017,2019
+# Marc Abonce Seguin, 2019
# Mingye Wang <arthur200126@gmail.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: searx\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2017-11-01 21:31+0100\n"
-"PO-Revision-Date: 2018-09-16 00:29+0000\n"
-"Last-Translator: Mingye Wang <arthur200126@gmail.com>\n"
+"POT-Creation-Date: 2017-10-07 19:18+0200\n"
+"PO-Revision-Date: 2019-07-28 05:46+0000\n"
+"Last-Translator: Marc Abonce Seguin\n"
"Language-Team: Chinese (Taiwan) (http://www.transifex.com/asciimoo/searx/language/zh_TW/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -33,63 +34,63 @@ msgstr "請求例外"
msgid "unexpected crash"
msgstr "未預期的當機"
-#: searx/webapp.py:136
+#: searx/webapp.py:135
msgid "files"
msgstr "檔案"
-#: searx/webapp.py:137
+#: searx/webapp.py:136
msgid "general"
msgstr "一般"
-#: searx/webapp.py:138
+#: searx/webapp.py:137
msgid "music"
msgstr "音樂"
-#: searx/webapp.py:139
+#: searx/webapp.py:138
msgid "social media"
msgstr "社群媒體"
-#: searx/webapp.py:140
+#: searx/webapp.py:139
msgid "images"
msgstr "圖片"
-#: searx/webapp.py:141
+#: searx/webapp.py:140
msgid "videos"
msgstr "影片"
-#: searx/webapp.py:142
+#: searx/webapp.py:141
msgid "it"
msgstr "IT"
-#: searx/webapp.py:143
+#: searx/webapp.py:142
msgid "news"
msgstr "新聞"
-#: searx/webapp.py:144
+#: searx/webapp.py:143
msgid "map"
msgstr "地圖"
-#: searx/webapp.py:145
+#: searx/webapp.py:144
msgid "science"
msgstr "科學"
-#: searx/webapp.py:399 searx/webapp.py:658
+#: searx/webapp.py:398 searx/webapp.py:653
msgid "Invalid settings, please edit your preferences"
msgstr "無效的設定,請編輯您的偏好設定"
-#: searx/webapp.py:415
+#: searx/webapp.py:410
msgid "Invalid settings"
msgstr "無效的設定"
-#: searx/webapp.py:449 searx/webapp.py:493
+#: searx/webapp.py:444 searx/webapp.py:488
msgid "search error"
msgstr "搜尋錯誤"
-#: searx/webapp.py:530
+#: searx/webapp.py:525
msgid "{minutes} minute(s) ago"
msgstr "{minutes} 分鐘前"
-#: searx/webapp.py:532
+#: searx/webapp.py:527
msgid "{hours} hour(s), {minutes} minute(s) ago"
msgstr "{hours} 小時 {minutes} 分鐘前"
@@ -109,29 +110,28 @@ msgstr "統計功能"
msgid "Compute {functions} of the arguments"
msgstr "計算 {functions} 參數"
-#: searx/engines/__init__.py:194 searx/engines/flycheck___init__.py:201
+#: searx/engines/__init__.py:194
msgid "Engine time (sec)"
msgstr "引擎時間(秒)"
-#: searx/engines/__init__.py:198 searx/engines/flycheck___init__.py:205
+#: searx/engines/__init__.py:198
msgid "Page loads (sec)"
msgstr "頁面載入(秒)"
-#: searx/engines/__init__.py:202 searx/engines/flycheck___init__.py:209
-#: searx/templates/oscar/results.html:95
+#: searx/engines/__init__.py:202 searx/templates/oscar/results.html:95
#: searx/templates/simple/results.html:20
msgid "Number of results"
msgstr "結果筆數"
-#: searx/engines/__init__.py:206 searx/engines/flycheck___init__.py:213
+#: searx/engines/__init__.py:206
msgid "Scores"
msgstr "分數"
-#: searx/engines/__init__.py:210 searx/engines/flycheck___init__.py:217
+#: searx/engines/__init__.py:210
msgid "Scores per result"
msgstr "每個結果的分數"
-#: searx/engines/__init__.py:214 searx/engines/flycheck___init__.py:221
+#: searx/engines/__init__.py:214
msgid "Errors"
msgstr "錯誤"
@@ -143,9 +143,15 @@ msgstr "{title}&nbsp;(已過時)"
msgid "This entry has been superseded by"
msgstr "此條目已被取代"
-#: searx/engines/pubmed.py:74
-msgid "No abstract is available for this publication."
-msgstr "此出版品無可用摘要。"
+#: searx/plugins/doai_rewrite.py:7
+msgid "DOAI rewrite"
+msgstr "DOAI 重寫"
+
+#: searx/plugins/doai_rewrite.py:8
+msgid ""
+"Avoid paywalls by redirecting to open-access versions of publications when "
+"available"
+msgstr "盡可能重新導向至出版品的開放存取版本,來避免付費牆"
#: searx/plugins/https_rewrite.py:32
msgid "Rewrite HTTP links to HTTPS if possible"
@@ -159,16 +165,6 @@ msgstr "無限捲動"
msgid "Automatically load next page when scrolling to bottom of current page"
msgstr "當捲動至目前頁面的底部時自動載入下一頁"
-#: searx/plugins/oa_doi_rewrite.py:9
-msgid "Open Access DOI rewrite"
-msgstr "開放存取 DOI 重寫"
-
-#: searx/plugins/oa_doi_rewrite.py:10
-msgid ""
-"Avoid paywalls by redirecting to open-access versions of publications when "
-"available"
-msgstr "盡可能重新導向至出版品的開放存取版本,來避免付費牆"
-
#: searx/plugins/open_results_on_new_tab.py:18
#: searx/templates/oscar/preferences.html:114
#: searx/templates/simple/preferences.html:149
@@ -331,8 +327,8 @@ msgstr "方法"
#: searx/templates/courgette/preferences.html:63
#: searx/templates/legacy/preferences.html:64
#: searx/templates/oscar/preferences.html:86
-#: searx/templates/oscar/preferences.html:165
-#: searx/templates/oscar/preferences.html:173
+#: searx/templates/oscar/preferences.html:153
+#: searx/templates/oscar/preferences.html:161
#: searx/templates/simple/preferences.html:63
#: searx/templates/simple/preferences.html:90
msgid "SafeSearch"
@@ -404,8 +400,8 @@ msgstr "目前使用的搜尋引擎"
#: searx/templates/courgette/preferences.html:100
#: searx/templates/legacy/preferences.html:97
-#: searx/templates/oscar/preferences.html:162
-#: searx/templates/oscar/preferences.html:176
+#: searx/templates/oscar/preferences.html:150
+#: searx/templates/oscar/preferences.html:164
#: searx/templates/pix-art/preferences.html:53
#: searx/templates/simple/preferences.html:87
msgid "Engine name"
@@ -420,8 +416,8 @@ msgstr "分類"
#: searx/templates/courgette/preferences.html:113
#: searx/templates/legacy/preferences.html:99
#: searx/templates/legacy/preferences.html:110
-#: searx/templates/oscar/preferences.html:161
-#: searx/templates/oscar/preferences.html:177
+#: searx/templates/oscar/preferences.html:149
+#: searx/templates/oscar/preferences.html:165
#: searx/templates/pix-art/preferences.html:54
#: searx/templates/pix-art/preferences.html:64
#: searx/templates/simple/preferences.html:86
@@ -439,7 +435,7 @@ msgstr "封鎖"
#: searx/templates/courgette/preferences.html:122
#: searx/templates/legacy/preferences.html:119
-#: searx/templates/oscar/preferences.html:297
+#: searx/templates/oscar/preferences.html:285
#: searx/templates/pix-art/preferences.html:73
#: searx/templates/simple/preferences.html:180
msgid ""
@@ -449,7 +445,7 @@ msgstr "這些設定只會儲存在您的 cookies 中,這樣我們無需也不
#: searx/templates/courgette/preferences.html:124
#: searx/templates/legacy/preferences.html:121
-#: searx/templates/oscar/preferences.html:299
+#: searx/templates/oscar/preferences.html:287
#: searx/templates/pix-art/preferences.html:75
#: searx/templates/simple/preferences.html:182
msgid ""
@@ -459,7 +455,7 @@ msgstr "這些 cookies 僅做為提供您方便之用,我們不會使用這些
#: searx/templates/courgette/preferences.html:127
#: searx/templates/legacy/preferences.html:124
-#: searx/templates/oscar/preferences.html:305
+#: searx/templates/oscar/preferences.html:293
#: searx/templates/pix-art/preferences.html:78
#: searx/templates/simple/preferences.html:185
msgid "save"
@@ -467,14 +463,14 @@ msgstr "儲存"
#: searx/templates/courgette/preferences.html:128
#: searx/templates/legacy/preferences.html:125
-#: searx/templates/oscar/preferences.html:307
+#: searx/templates/oscar/preferences.html:295
#: searx/templates/simple/preferences.html:186
msgid "Reset defaults"
msgstr "重設為預設值"
#: searx/templates/courgette/preferences.html:129
#: searx/templates/legacy/preferences.html:126
-#: searx/templates/oscar/preferences.html:306
+#: searx/templates/oscar/preferences.html:294
#: searx/templates/pix-art/preferences.html:79
#: searx/templates/simple/preferences.html:187
msgid "back"
@@ -645,23 +641,23 @@ msgid "General"
msgstr "一般"
#: searx/templates/oscar/preferences.html:14
-#: searx/templates/oscar/preferences.html:146
+#: searx/templates/oscar/preferences.html:134
#: searx/templates/simple/preferences.html:76
msgid "Engines"
msgstr "引擎"
#: searx/templates/oscar/preferences.html:15
-#: searx/templates/oscar/preferences.html:219
+#: searx/templates/oscar/preferences.html:207
msgid "Plugins"
msgstr "外掛程式"
#: searx/templates/oscar/preferences.html:16
-#: searx/templates/oscar/preferences.html:245
+#: searx/templates/oscar/preferences.html:233
msgid "Answerers"
msgstr "答案"
#: searx/templates/oscar/preferences.html:17
-#: searx/templates/oscar/preferences.html:272
+#: searx/templates/oscar/preferences.html:260
msgid "Cookies"
msgstr "Cookies"
@@ -690,7 +686,7 @@ msgid ""
"Change how forms are submited, <a "
"href=\"http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods\""
" rel=\"external\">learn more about request methods</a>"
-msgstr "變更遞交形式,<a href=\"https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE#%E8%AF%B7%E6%B1%82%E6%96%B9%E6%B3%95\" rel=\"external\">看看更多關於請求方法的介紹</a>"
+msgstr "變更遞交形式,<a href=\"https://zh.wikipedia.org/wiki/超文本传输协议#请求方法\" rel=\"external\">看看更多關於請求方法的介紹</a>"
#: searx/templates/oscar/preferences.html:87
#: searx/templates/simple/preferences.html:71
@@ -712,88 +708,78 @@ msgstr "選擇這個主題的樣式"
msgid "Style"
msgstr "樣式"
-#: searx/templates/oscar/preferences.html:122
-msgid "Open Access DOI resolver"
-msgstr "開放存取 DOI 解析器"
-
-#: searx/templates/oscar/preferences.html:123
-msgid ""
-"Redirect to open-access versions of publications when available (plugin "
-"required)"
-msgstr "盡可能重新導向至出版品的開放存取版本(需要外掛程式)"
-
+#: searx/templates/oscar/preferences.html:151
#: searx/templates/oscar/preferences.html:163
-#: searx/templates/oscar/preferences.html:175
#: searx/templates/simple/preferences.html:88
msgid "Shortcut"
msgstr "快捷鍵"
-#: searx/templates/oscar/preferences.html:164
-#: searx/templates/oscar/preferences.html:174
+#: searx/templates/oscar/preferences.html:152
+#: searx/templates/oscar/preferences.html:162
msgid "Selected language"
msgstr "已選取的語言"
-#: searx/templates/oscar/preferences.html:166
-#: searx/templates/oscar/preferences.html:172
+#: searx/templates/oscar/preferences.html:154
+#: searx/templates/oscar/preferences.html:160
#: searx/templates/simple/preferences.html:91
msgid "Time range"
msgstr "時間範圍"
-#: searx/templates/oscar/preferences.html:167
-#: searx/templates/oscar/preferences.html:171
+#: searx/templates/oscar/preferences.html:155
+#: searx/templates/oscar/preferences.html:159
#: searx/templates/simple/preferences.html:92
msgid "Avg. time"
msgstr "平均時間"
-#: searx/templates/oscar/preferences.html:168
-#: searx/templates/oscar/preferences.html:170
+#: searx/templates/oscar/preferences.html:156
+#: searx/templates/oscar/preferences.html:158
#: searx/templates/simple/preferences.html:93
msgid "Max time"
msgstr "最大時間"
-#: searx/templates/oscar/preferences.html:248
+#: searx/templates/oscar/preferences.html:236
msgid "This is the list of searx's instant answering modules."
msgstr "這是 searx 的即時回覆模組清單。"
-#: searx/templates/oscar/preferences.html:252
+#: searx/templates/oscar/preferences.html:240
msgid "Name"
msgstr "名稱"
-#: searx/templates/oscar/preferences.html:253
+#: searx/templates/oscar/preferences.html:241
msgid "Keywords"
msgstr "關鍵字"
-#: searx/templates/oscar/preferences.html:254
+#: searx/templates/oscar/preferences.html:242
msgid "Description"
msgstr "描述"
-#: searx/templates/oscar/preferences.html:255
+#: searx/templates/oscar/preferences.html:243
msgid "Examples"
msgstr "範例"
-#: searx/templates/oscar/preferences.html:275
+#: searx/templates/oscar/preferences.html:263
msgid ""
"This is the list of cookies and their values searx is storing on your "
"computer."
msgstr "這是 searx 儲存在您電腦上的 cookies 與它們的值的清單。"
-#: searx/templates/oscar/preferences.html:276
+#: searx/templates/oscar/preferences.html:264
msgid "With that list, you can assess searx transparency."
msgstr "有了這份清單,您就可以評估 searx 的透明度。"
-#: searx/templates/oscar/preferences.html:281
+#: searx/templates/oscar/preferences.html:269
msgid "Cookie name"
msgstr "Cookie 名稱"
-#: searx/templates/oscar/preferences.html:282
+#: searx/templates/oscar/preferences.html:270
msgid "Value"
msgstr "值"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid "Search URL of the currently saved preferences"
msgstr "目前偏好設定的搜尋 URL"
-#: searx/templates/oscar/preferences.html:301
+#: searx/templates/oscar/preferences.html:289
msgid ""
"Note: specifying custom settings in the search URL can reduce privacy by "
"leaking data to the clicked result sites."
diff --git a/searx/utils.py b/searx/utils.py
index dfa22c5fc..5ea9dc89c 100644
--- a/searx/utils.py
+++ b/searx/utils.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
import csv
import hashlib
import hmac
@@ -12,6 +13,7 @@ from numbers import Number
from os.path import splitext, join
from io import open
from random import choice
+from lxml.etree import XPath
import sys
import json
@@ -44,9 +46,15 @@ logger = logger.getChild('utils')
blocked_tags = ('script',
'style')
+ecma_unescape4_re = re.compile(r'%u([0-9a-fA-F]{4})', re.UNICODE)
+ecma_unescape2_re = re.compile(r'%([0-9a-fA-F]{2})', re.UNICODE)
+
useragents = json.loads(open(os.path.dirname(os.path.realpath(__file__))
+ "/data/useragents.json", 'r', encoding='utf-8').read())
+xpath_cache = dict()
+lang_to_lc_cache = dict()
+
def searx_useragent():
return 'searx/{searx_version} {suffix}'.format(
@@ -183,7 +191,7 @@ def get_resources_directory(searx_directory, subdirectory, resources_directory):
if not resources_directory:
resources_directory = os.path.join(searx_directory, subdirectory)
if not os.path.isdir(resources_directory):
- raise Exception(directory + " is not a directory")
+ raise Exception(resources_directory + " is not a directory")
return resources_directory
@@ -302,18 +310,30 @@ def int_or_zero(num):
def is_valid_lang(lang):
is_abbr = (len(lang) == 2)
+ lang = lang.lower().decode('utf-8')
if is_abbr:
for l in language_codes:
- if l[0][:2] == lang.lower():
+ if l[0][:2] == lang:
return (True, l[0][:2], l[3].lower())
return False
else:
for l in language_codes:
- if l[1].lower() == lang.lower():
+ if l[1].lower() == lang or l[3].lower() == lang:
return (True, l[0][:2], l[3].lower())
return False
+def _get_lang_to_lc_dict(lang_list):
+ key = str(lang_list)
+ value = lang_to_lc_cache.get(key, None)
+ if value is None:
+ value = dict()
+ for lc in lang_list:
+ value.setdefault(lc.split('-')[0], lc)
+ lang_to_lc_cache[key] = value
+ return value
+
+
# auxiliary function to match lang_code in lang_list
def _match_language(lang_code, lang_list=[], custom_aliases={}):
# replace language code with a custom alias if necessary
@@ -334,11 +354,7 @@ def _match_language(lang_code, lang_list=[], custom_aliases={}):
return new_code
# try to get the any supported country for this language
- for lc in lang_list:
- if lang_code == lc.split('-')[0]:
- return lc
-
- return None
+ return _get_lang_to_lc_dict(lang_list).get(lang_code, None)
# get the language code from lang_list that best matches locale_code
@@ -384,10 +400,17 @@ def load_module(filename, module_dir):
def new_hmac(secret_key, url):
+ try:
+ secret_key_bytes = bytes(secret_key, 'utf-8')
+ except TypeError as err:
+ if isinstance(secret_key, bytes):
+ secret_key_bytes = secret_key
+ else:
+ raise err
if sys.version_info[0] == 2:
return hmac.new(bytes(secret_key), url, hashlib.sha256).hexdigest()
else:
- return hmac.new(bytes(secret_key, 'utf-8'), url, hashlib.sha256).hexdigest()
+ return hmac.new(secret_key_bytes, url, hashlib.sha256).hexdigest()
def to_string(obj):
@@ -399,3 +422,46 @@ def to_string(obj):
return obj.__str__()
if hasattr(obj, '__repr__'):
return obj.__repr__()
+
+
+def ecma_unescape(s):
+ """
+ python implementation of the unescape javascript function
+
+ https://www.ecma-international.org/ecma-262/6.0/#sec-unescape-string
+ https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/unescape
+ """
+ # s = unicode(s)
+ # "%u5409" becomes "吉"
+ s = ecma_unescape4_re.sub(lambda e: unichr(int(e.group(1), 16)), s)
+ # "%20" becomes " ", "%F3" becomes "ó"
+ s = ecma_unescape2_re.sub(lambda e: unichr(int(e.group(1), 16)), s)
+ return s
+
+
+def get_engine_from_settings(name):
+ """Return engine configuration from settings.yml of a given engine name"""
+
+ if 'engines' not in settings:
+ return {}
+
+ for engine in settings['engines']:
+ if 'name' not in engine:
+ continue
+ if name == engine['name']:
+ return engine
+
+ return {}
+
+
+def get_xpath(xpath_str):
+ result = xpath_cache.get(xpath_str, None)
+ if result is None:
+ result = XPath(xpath_str)
+ xpath_cache[xpath_str] = result
+ return result
+
+
+def eval_xpath(element, xpath_str):
+ xpath = get_xpath(xpath_str)
+ return xpath(element)
diff --git a/searx/version.py b/searx/version.py
index 4e149722e..3fe3dba82 100644
--- a/searx/version.py
+++ b/searx/version.py
@@ -18,7 +18,7 @@ along with searx. If not, see < http://www.gnu.org/licenses/ >.
# version of searx
VERSION_MAJOR = 0
-VERSION_MINOR = 15
+VERSION_MINOR = 16
VERSION_BUILD = 0
VERSION_STRING = "{0}.{1}.{2}".format(VERSION_MAJOR,
diff --git a/searx/webapp.py b/searx/webapp.py
index 542c2c002..a856c07dd 100644
--- a/searx/webapp.py
+++ b/searx/webapp.py
@@ -41,9 +41,13 @@ except:
logger.critical("cannot import dependency: pygments")
from sys import exit
exit(1)
-from cgi import escape
+try:
+ from cgi import escape
+except:
+ from html import escape
from datetime import datetime, timedelta
-from werkzeug.contrib.fixers import ProxyFix
+from time import time
+from werkzeug.middleware.proxy_fix import ProxyFix
from flask import (
Flask, request, render_template, url_for, Response, make_response,
redirect, send_from_directory
@@ -91,6 +95,8 @@ if sys.version_info[0] == 3:
PY3 = True
else:
PY3 = False
+ logger.warning('\033[1;31m *** Deprecation Warning ***\033[0m')
+ logger.warning('\033[1;31m Python2 is deprecated\033[0m')
# serve pages with HTTP/1.1
from werkzeug.serving import WSGIRequestHandler
@@ -123,6 +129,7 @@ app = Flask(
app.jinja_env.trim_blocks = True
app.jinja_env.lstrip_blocks = True
+app.jinja_env.add_extension('jinja2.ext.loopcontrols')
app.secret_key = settings['server']['secret_key']
if not searx_debug \
@@ -409,6 +416,8 @@ def render(template_name, override_theme=None, **kwargs):
@app.before_request
def pre_request():
+ request.start_time = time()
+ request.timings = []
request.errors = []
preferences = Preferences(themes, list(categories.keys()), engines, plugins)
@@ -451,6 +460,21 @@ def pre_request():
request.user_plugins.append(plugin)
+@app.after_request
+def post_request(response):
+ total_time = time() - request.start_time
+ timings_all = ['total;dur=' + str(round(total_time * 1000, 3))]
+ if len(request.timings) > 0:
+ timings = sorted(request.timings, key=lambda v: v['total'])
+ timings_total = ['total_' + str(i) + '_' + v['engine'] +
+ ';dur=' + str(round(v['total'] * 1000, 3)) for i, v in enumerate(timings)]
+ timings_load = ['load_' + str(i) + '_' + v['engine'] +
+ ';dur=' + str(round(v['load'] * 1000, 3)) for i, v in enumerate(timings)]
+ timings_all = timings_all + timings_total + timings_load
+ response.headers.add('Server-Timing', ', '.join(timings_all))
+ return response
+
+
def index_error(output_format, error_message):
if output_format == 'json':
return Response(json.dumps({'error': error_message}),
@@ -503,9 +527,10 @@ def index():
# search
search_query = None
+ raw_text_query = None
result_container = None
try:
- search_query = get_search_query_from_webapp(request.preferences, request.form)
+ search_query, raw_text_query = get_search_query_from_webapp(request.preferences, request.form)
# search = Search(search_query) # without plugins
search = SearchWithPlugins(search_query, request.user_plugins, request)
result_container = search.search()
@@ -528,19 +553,24 @@ def index():
# UI
advanced_search = request.form.get('advanced_search', None)
+ # Server-Timing header
+ request.timings = result_container.get_timings()
+
# output
for result in results:
if output_format == 'html':
if 'content' in result and result['content']:
result['content'] = highlight_content(escape(result['content'][:1024]), search_query.query)
- result['title'] = highlight_content(escape(result['title'] or u''), search_query.query)
+ if 'title' in result and result['title']:
+ result['title'] = highlight_content(escape(result['title'] or u''), search_query.query)
else:
if result.get('content'):
result['content'] = html_to_text(result['content']).strip()
# removing html content and whitespace duplications
result['title'] = ' '.join(html_to_text(result['title']).strip().split())
- result['pretty_url'] = prettify_url(result['url'])
+ if 'url' in result:
+ result['pretty_url'] = prettify_url(result['url'])
# TODO, check if timezone is calculated right
if 'publishedDate' in result:
@@ -594,6 +624,21 @@ def index():
)
return Response(response_rss, mimetype='text/xml')
+ # HTML output format
+
+ # suggestions: use RawTextQuery to get the suggestion URLs with the same bang
+ suggestion_urls = list(map(lambda suggestion: {
+ 'url': raw_text_query.changeSearchQuery(suggestion).getFullQuery(),
+ 'title': suggestion
+ },
+ result_container.suggestions))
+
+ correction_urls = list(map(lambda correction: {
+ 'url': raw_text_query.changeSearchQuery(correction).getFullQuery(),
+ 'title': correction
+ },
+ result_container.corrections))
+ #
return render(
'results.html',
results=results,
@@ -603,9 +648,9 @@ def index():
time_range=search_query.time_range,
number_of_results=format_decimal(number_of_results),
advanced_search=advanced_search,
- suggestions=result_container.suggestions,
+ suggestions=suggestion_urls,
answers=result_container.answers,
- corrections=result_container.corrections,
+ corrections=correction_urls,
infoboxes=result_container.infoboxes,
paging=result_container.paging,
unresponsive_engines=result_container.unresponsive_engines,
@@ -614,7 +659,8 @@ def index():
fallback=request.preferences.get_value("language")),
base_url=get_base_url(),
theme=get_current_theme_name(),
- favicons=global_favicons[themes.index(get_current_theme_name())]
+ favicons=global_favicons[themes.index(get_current_theme_name())],
+ timeout_limit=request.form.get('timeout_limit', None)
)
@@ -650,8 +696,11 @@ def autocompleter():
# parse searx specific autocompleter results like !bang
raw_results = searx_bang(raw_text_query)
- # normal autocompletion results only appear if max 3 inner results returned
- if len(raw_results) <= 3 and completer:
+ # normal autocompletion results only appear if no inner results returned
+ # and there is a query part besides the engine and language bangs
+ if len(raw_results) == 0 and completer and (len(raw_text_query.query_parts) > 1 or
+ (len(raw_text_query.languages) == 0 and
+ not raw_text_query.specific)):
# get language from cookie
language = request.preferences.get_value('language')
if not language or language == 'all':
@@ -701,8 +750,13 @@ def preferences():
# stats for preferences page
stats = {}
+ engines_by_category = {}
for c in categories:
+ engines_by_category[c] = []
for e in categories[c]:
+ if not request.preferences.validate_token(e):
+ continue
+
stats[e.name] = {'time': None,
'warn_timeout': False,
'warn_time': False}
@@ -710,9 +764,11 @@ def preferences():
stats[e.name]['warn_timeout'] = True
stats[e.name]['supports_selected_language'] = _is_selected_language_supported(e, request.preferences)
+ engines_by_category[c].append(e)
+
# get first element [0], the engine time,
# and then the second element [1] : the time (the first one is the label)
- for engine_stat in get_engines_stats()[0][1]:
+ for engine_stat in get_engines_stats(request.preferences)[0][1]:
stats[engine_stat.get('name')]['time'] = round(engine_stat.get('avg'), 3)
if engine_stat.get('avg') > settings['outgoing']['request_timeout']:
stats[engine_stat.get('name')]['warn_time'] = True
@@ -722,7 +778,7 @@ def preferences():
locales=settings['locales'],
current_locale=request.preferences.get_value("locale"),
image_proxy=image_proxy,
- engines_by_category=categories,
+ engines_by_category=engines_by_category,
stats=stats,
answerers=[{'info': a.self_info(), 'keywords': a.keywords} for a in answerers],
disabled_engines=disabled_engines,
@@ -798,7 +854,7 @@ def image_proxy():
@app.route('/stats', methods=['GET'])
def stats():
"""Render engine statistics page."""
- stats = get_engines_stats()
+ stats = get_engines_stats(request.preferences)
return render(
'stats.html',
stats=stats,
@@ -860,21 +916,21 @@ def clear_cookies():
@app.route('/config')
def config():
- return jsonify({'categories': categories.keys(),
- 'engines': [{'name': engine_name,
+ return jsonify({'categories': list(categories.keys()),
+ 'engines': [{'name': name,
'categories': engine.categories,
'shortcut': engine.shortcut,
'enabled': not engine.disabled,
'paging': engine.paging,
'language_support': engine.language_support,
'supported_languages':
- engine.supported_languages.keys()
+ list(engine.supported_languages.keys())
if isinstance(engine.supported_languages, dict)
else engine.supported_languages,
'safesearch': engine.safesearch,
'time_range_support': engine.time_range_support,
'timeout': engine.timeout}
- for engine_name, engine in engines.items()],
+ for name, engine in engines.items() if request.preferences.validate_token(engine)],
'plugins': [{'name': plugin.name,
'enabled': plugin.default_on}
for plugin in plugins],
@@ -896,7 +952,7 @@ def page_not_found(e):
def run():
- logger.debug('starting webserver on %s:%s', settings['server']['port'], settings['server']['bind_address'])
+ logger.debug('starting webserver on %s:%s', settings['server']['bind_address'], settings['server']['port'])
app.run(
debug=searx_debug,
use_debugger=searx_debug,
diff --git a/setup.py b/setup.py
index 7333551fe..bd3dd5d1c 100644
--- a/setup.py
+++ b/setup.py
@@ -11,14 +11,14 @@ import sys
sys.path.insert(0, './searx')
from version import VERSION_STRING
+with open('README.rst') as f:
+ long_description = f.read()
-def read(*rnames):
- return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
+with open('requirements.txt') as f:
+ requirements = [ l.strip() for l in f.readlines()]
-
-long_description = read('README.rst')
-requirements = map(str.strip, open('requirements.txt').readlines())
-dev_requirements = map(str.strip, open('requirements-dev.txt').readlines())
+with open('requirements-dev.txt') as f:
+ dev_requirements = [ l.strip() for l in f.readlines()]
setup(
name='searx',
diff --git a/tests/unit/engines/__init__.py b/tests/unit/engines/__init__.py
deleted file mode 100644
index e69de29bb..000000000
--- a/tests/unit/engines/__init__.py
+++ /dev/null
diff --git a/tests/unit/engines/pubmed.py b/tests/unit/engines/pubmed.py
deleted file mode 100644
index 370efe067..000000000
--- a/tests/unit/engines/pubmed.py
+++ /dev/null
@@ -1,37 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import pubmed
-from searx.testing import SearxTestCase
-
-
-class TestPubmedEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- params = pubmed.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn('eutils.ncbi.nlm.nih.gov/', params['url'])
- self.assertIn('term', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, pubmed.response, None)
- self.assertRaises(AttributeError, pubmed.response, [])
- self.assertRaises(AttributeError, pubmed.response, '')
- self.assertRaises(AttributeError, pubmed.response, '[]')
-
- response = mock.Mock(text='<PubmedArticleSet></PubmedArticleSet>')
- self.assertEqual(pubmed.response(response), [])
-
- xml_mock = """<eSearchResult><Count>1</Count><RetMax>1</RetMax><RetStart>0</RetStart><IdList>
-<Id>1</Id>
-</IdList></eSearchResult>
-"""
-
- response = mock.Mock(text=xml_mock.encode('utf-8'))
- results = pubmed.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['content'], 'No abstract is available for this publication.')
diff --git a/tests/unit/engines/seedpeer_fixture.html b/tests/unit/engines/seedpeer_fixture.html
deleted file mode 100644
index 28207bfad..000000000
--- a/tests/unit/engines/seedpeer_fixture.html
+++ /dev/null
@@ -1,110 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- </head>
- <body>
- <div id="header">
- <div id="whoIsYou">
- <a href="/lang.php"><small>SeedPeer in your own language?</small></a>&nbsp;&nbsp;&nbsp;<a href="http://www.seedpeer.eu"><img src="/images/flags/uk.gif" width="16px" alt="Torrents EN" /></a> <a href="http://spanish.seedpeer.eu"><img src="/images/flags/es.gif" width="16px" alt="Torrents ES" /></a> <a href="http://german.seedpeer.eu"><img src="/images/flags/de.gif" width="16px" alt="Torrents DE" /></a> <a href="http://french.seedpeer.eu"><img src="/images/flags/fr.gif" width="16px" alt="Torrents FR" /></a> <a href="http://portuguese.seedpeer.eu"><img src="/images/flags/pt.gif" width="16px" alt="Torrents Portuguese" /></a> <a href="http://swedish.seedpeer.eu"><img src="/images/flags/se.gif" width="16px" alt="Torrents Sweden" /></a>
- </div>
-
- <script type="text/javascript">
- whoIsYou();
- </script>
- <div id="search">
- <form action="/search.php" method="get">
- <input id="topsearchbar" name="search" value="narcos season 2" />
- <input type="submit" class="searchbutton" value="Torrents" />
- <input style="color:#000" type="submit" class="searchbutton" name="usenet" value="Usenet Binaries" />
- </form>
- <div id="suggestion"></div>
- </div>
- <div id="logo"><a href="/"><img src="/images/logo2.gif" alt="Seedpeer homepage" width="415" height="143" /></a></div>
- <div id="subtext"><a href="/">Home</a> &gt; <a href="/search.html">Torrent search</a> &gt; Narcos season 2 | page 1</div>
- </div>
- <div id="nav">
- <ul>
- <!--
- <li><font style="color:red;font-size:9px;font-weight:bold;">NEW</font><a title="Download TOP Games for FREE" rel="nofollow" href="http://www.bigrebelads.com/affiliate/index?ref=9301" target="_blank">FREE Games</a></li>
-
- -->
- <li style="border-left:none" id="categories"><a title="Browse Torrent Categories" href="/browse.html">Categories</a>
- <ul>
- <li><a title="Browse Anime Torrents" href="/browse.html#6">Anime</a></li>
- <li><a title="Browse Game Torrents" href="/browse.html#4">Games</a></li>
- <li><a title="Browse Movie Torrents" href="/browse.html#1">Movies</a></li>
- <li><a title="Browse Music Torrents" href="/browse.html#3">Music</a></li>
- <li><a title="Browse Software Torrents" href="/browse.html#5">Software</a></li>
- <li><a title="Browse TV Torrents" href="/browse.html#2">TV Shows</a></li>
- <li><a title="Browse Other Torrents" href="/browse.html#7">Others</a></li>
- </ul>
- </li>
- <li><a title="Upload A Torrents" href="/upload.html">Upload torrent</a></li>
- <li id="verified"><a title="Verified Torrents" href="/verified.html">Verified</a></li>
- <li id="searchoptions"><a title="Search Torrents" href="/search.html">Torrent search</a></li>
- <li id="newsgroups"><a style="color:#212b3e" title="News Groups" href="/usenet.html">Usenet Binaries</a></li>
- <li id="about" style="border-right:none"><a rel="nofollow" href="/faq.html">About Us</a>
- <ul>
- <li><a title="SeedPeer Statistics" href="/stats.html">Statistics</a></li>
- <li><a title="Contact Us" href="/contact.html">Contact</a></li>
- <li><a title="Frequently Asked Questions" href="/faq.html">FAQ</a></li>
- <li><a title="SeedPeer API" href="http://api.seedpeer.eu">Our API</a></li>
- <li><a title="SeedPeer Blog" href="/blog">Blog</a></li>
- </ul>
- </li>
- <!--<li><a href="/toolbar.php">Our Toolbar</a></li>-->
- </ul>
- <div class="clear"></div>
- </div>
- <div id="body"><div id="pageTop"></div>
- <div id="headerbox"><h1>Verified <font class="colored">Narcos season 2</font> torrents</h1></div><table width="100%"><tr><th>
- <span style="float:right">
- <a href="/search/narcos-season-2/8/1.html"><img style="vertical-align:middle" src="/images/comments.gif" alt="comments" /></a> |
- <a href="/search/narcos-season-2/7/1.html"><img style="vertical-align:middle" src="/images/ver.gif" alt="verified" /></a>
- </span>
- <a href="/search/narcos-season-2/1/1.html">Torrent name</a></th><th class="right"><a href="/search/narcos-season-2/2/1.html">Age</a></th><th class="right"><a href="/search/narcos-season-2/3/1.html">Size</a></th><th class="right"><a href="/search/narcos-season-2/4/1.html">Seeds</a></th><th class="right"><a href="/search/narcos-season-2/5/1.html">Peers</a></th><th class="center"><a href="/search/narcos-season-2/6/1.html">Health</a></th><td class="tableAd" rowspan="6"><iframe src="http://creative.wwwpromoter.com/13689?d=300x250" width="300" height="250" style="border: none;" frameborder="0" scrolling="no"></iframe></td></tr><tr class=""><td><a class="pblink" id="pblink_table_item_1" href="" data-tad="431726" data-last-search="narcos+season+2" target="_blank" rel="nofollow"><strong class='colored'>Narcos season 2</strong> Full Version</a></td><td class="right">20 hours</td><td class="right">681.3 MB</td><td class="right"><font color="green">28</font> </td><td class="right"><font color="navy">654</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" /></td></tr><tr class="tdark"><td><a class="pblink" id="pblink_table_item_2" href="" data-tad="431727" data-url="narcos+season+2" target="_blank" rel="nofollow"><strong class='colored'>Narcos season 2</strong> Trusted Source</a></td><td class="right">12 hours</td><td class="right">787.1 MB</td><td class="right"><font color="green">64</font> </td><td class="right"><font color="navy">220</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" /></td></tr><tr class=""><td><a class="pblink" id="pblink_table_item_3" href="" data-tad="431729" data-last-search="narcos+season+2" target="_blank" rel="nofollow"><strong class='colored'>Full Narcos season 2 Download</strong></a> <small><a class="pblink" id="pblink_table_item_4" href="" data-tad="431729" data-last-search="narcos+season+2" target="_blank" rel="nofollow">Usenet</a></small></td><td class="right">24 hours</td><td class="right">775.5 MB</td><td class="right"><font color="green">60</font> </td><td class="right"><font color="navy">236</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" /></td></tr><tr class="tdark"><td><a class="pblink" id="pblink_table_item_5" href="" data-tad="431730" data-last-search="narcos+season+2" target="_blank" rel="nofollow"><strong class='colored'>Narcos season 2</strong> 2014 - DIRECT STREAMING</a> <small><a class="pblink" id="pblink_table_item_6" href="" data-tad="431729" data-last-search="narcos+season+2" target="_blank" rel="nofollow">Movies</a></small></td><td class="right">17 hours</td><td class="right">654.1 MB</td><td class="right"><font color="green">2</font> </td><td class="right"><font color="navy">391</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" /></td></tr><tr class=""><td><a class="pblink" id="pblink_table_item_7" href="" data-tad="431731" data-last-search="narcos+season+2" target="_blank" rel="nofollow"><strong class='colored'>Narcos season 2</strong> 2014</a> <small><a class="pblink" id="pblink_table_item_8" href="" data-tad="431729" data-last-search="narcos+season+2" target="_blank" rel="nofollow">Movies</a></small></td><td class="right">20 hours</td><td class="right">754.5 MB</td><td class="right"><font color="green">21</font> </td><td class="right"><font color="navy">919</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" /></td></tr></table><br /><br /><center><iframe src='http://creative.wwwpromoter.com/13689?d=728x90' width='728' height='90' style='border: none;' frameborder='0' scrolling='no'></iframe><center><span style="float:right;margin:1em .2em 0 0"><a title="Download at the speed of your connection" href="/usenet.php?search=narcos+season+2"><img src="/images/dlf.gif" alt="Search Binaries" /></a></span><div style="margin-bottom:1em;margin-right:290px" id="headerbox"><h1><a href="/searchfeed/narcos+season+2.xml" target="_blank" title="SeedPeer RSS Torrent Search Feed fornarcos season 2"><img src="/images/feedIcon.png" border="0" /></a>&nbsp;2 <font class="colored">Narcos season 2</font> Torrents were found</h1></div><table width="100%"><tr><th>
- <span style="float:right">
- <a href="/search/narcos-season-2/8/1.html"><img style="vertical-align:middle" src="/images/comments.gif" alt="comments" /></a> |
- <a href="/search/narcos-season-2/7/1.html"><img style="vertical-align:middle" src="/images/ver.gif" alt="verified" /></a>
- </span>
- <a href="/search/narcos-season-2/1/1.html">Torrent name</a></th><th class="right"><a href="/search/narcos-season-2/2/1.html">Age</a></th><th class="right"><a href="/search/narcos-season-2/3/1.html">Size</a></th><th class="right"><a href="/search/narcos-season-2/4/1.html">Seeds</a></th><th class="right"><a href="/search/narcos-season-2/5/1.html">Peers</a></th><th class="center"><a href="/search/narcos-season-2/6/1.html">Health</a></th></tr><tr class=""><td><small class="comments"><a href="http://www.facebook.com/sharer.php?t=Download%20<strong class='colored'>Narcos</strong> <strong class='colored'>Season</strong> <strong class='colored'>2</strong> Complete 7<strong class='colored'>2</strong>0p WebRip EN-SUB x<strong class='colored'>2</strong>64-[MULVAcoded] S0<strong class='colored'>2</strong>%20 torrent&u=http://seedpeer.seedpeer.eu/details/11686840/Narcos-Season-2-Complete-720p-WebRip-EN-SUB-x264-[MULVAcoded]-S02.html"><img src="/images/facebook.png" alt="Add to Facebook" width="14" height="14" /></a></small><a href="/details/11686840/Narcos-Season-2-Complete-720p-WebRip-EN-SUB-x264-[MULVAcoded]-S02.html"><strong class='colored'>Narcos</strong> <strong class='colored'>Season</strong> <strong class='colored'>2</strong> Complete 7<strong class='colored'>2</strong>0p WebRip EN-SUB x<strong class='colored'>2</strong>64-[MULVAcoded] S0<strong class='colored'>2</strong> <small><a href="/browse.html#11686840"></a></small></a></td><td class="right">19 hours</td><td class="right">4.39 GB</td><td class="right"><font color="green">715</font> </td><td class="right"><font color="navy">183</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" width="40" height="11" /></td></tr><tr class="tdark"><td><small class="comments"><a href="http://www.facebook.com/sharer.php?t=Download%20<strong class='colored'>Narcos</strong> - <strong class='colored'>Season</strong> <strong class='colored'>2</strong> - 7<strong class='colored'>2</strong>0p WEBRiP - x<strong class='colored'>2</strong>65 HEVC - ShAaNiG%20 torrent&u=http://seedpeer.seedpeer.eu/details/11685972/Narcos---Season-2---720p-WEBRiP---x265-HEVC---ShAaNiG.html"><img src="/images/facebook.png" alt="Add to Facebook" width="14" height="14" /></a></small><a href="/details/11685972/Narcos---Season-2---720p-WEBRiP---x265-HEVC---ShAaNiG.html"><strong class='colored'>Narcos</strong> - <strong class='colored'>Season</strong> <strong class='colored'>2</strong> - 7<strong class='colored'>2</strong>0p WEBRiP - x<strong class='colored'>2</strong>65 HEVC - ShAaNiG <small><a href="/browse.html#11685972"></a></small></a></td><td class="right">1 day</td><td class="right">2.48 GB</td><td class="right"><font color="green">861</font> </td><td class="right"><font color="navy">332</font> </td><td class="center"><img src="/images/h5.gif" alt="Health" width="40" height="11" /></td></tr></table><div id="headerbox"><h1>Related searches for: <font class="colored">Narcos season 2</font></h1></div><div id="search_suggestions"><br />Other suggested searches: </div><br /><a href="http://torrentz2.eu/search?f=narcos-season-2">Search for "narcos-season-2" on Torrentz2.eu</a><br /><a href="http://torrent-finder.info/show.php?q=narcos-season-2">Search for "narcos-season-2" on Torrent-Finder</a><br /><center><iframe src='http://creative.wwwpromoter.com/13689?d=300x250' width='300' height='250' style='border: none;' frameborder='0' scrolling='no'></iframe>&nbsp;<iframe src='http://creative.wwwpromoter.com/13689?d=300x250' width='300' height='250' style='border: none;' frameborder='0' scrolling='no'></iframe>&nbsp;<iframe src='http://creative.wwwpromoter.com/13689?d=300x250' width='300' height='250' style='border: none;' frameborder='0' scrolling='no'></iframe></center><div id="footer">
- <table width="100%">
- <tr>
- <td width="30%">
- <h2>Torrents Download</h2>
- <a href="/">Torrent search</a><br />
- <a href="/browse.html">Browse categories</a><br />
- <a href="/verified.html">Verified Torrents</a><br />
- <a href="/order-date.html">Today's torrents</a><br />
- <a href="/yesterday.html">Yesterday's torrents</a><br />
- <a href="/stats.html">Statistics</a><br />
- <br />
- <a href="/faq.html#copyright"><strong>Copyright & Removal</strong></a>
- </td>
- <td width="30%"><h2>Cool Stuff</h2>
- <a href="/promotional.php">Promotional</a><br />
- <a href="/contact.html">Advertising Information</a><br />
- <strong><a href="/plugins.php" title="Add a search plugin to Firefox or Internet Explorer">Search Plugin <span style="color:red">*</span></a></strong><br />
- <a href="http://www.utorrent.com">&micro;Torrent Client</a><br />
- <a href="/blog">Seedpeer Blog</a><br />
- </td>
- <td width="30%"><h2>Links</h2>
- <a href="http://www.sumotorrent.com" target="_blank"><strong>SumoTorrent</strong></a><br />
- <a href="http://www.torrent-finder.info" target="_blank"><strong>Torrent Finder</strong></a><br />
- <a href="http://www.torrentpond.com" target="_blank"><strong>TorrentPond</strong></a><br />
- <a href="https://www.limetorrents.cc" target="_blank">LimeTorrents.cc</a><br />
- <a href="http://www.torrents.to/" target="_blank">Torrents.to</a><br />
- <a href="http://www.torrentfunk.com" target="_blank">TorrentFunk</a><br />
- <a href="https://monova.org" target="_blank">Monova</a><br />
- <a href="http://www.torrentroom.com" target="_blank">TorrentRoom</a><br />
- <a href="http://www.katcr.co/" target="_blank">Kickass Torrents Community</a><br />
- </td>
- <td width="10%"><div id="bottomlogo"></div></td>
- </tr>
- </table>
- <br />
- <br />
- </div>
- </div>
- </body>
- </html> \ No newline at end of file
diff --git a/tests/unit/engines/test_acgsou.py b/tests/unit/engines/test_acgsou.py
deleted file mode 100644
index c01acf5de..000000000
--- a/tests/unit/engines/test_acgsou.py
+++ /dev/null
@@ -1,78 +0,0 @@
-# coding=utf-8
-from collections import defaultdict
-import mock
-from searx.engines import acgsou
-from searx.testing import SearxTestCase
-
-
-class TestAcgsouEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dic = defaultdict(dict)
- dic['pageno'] = 1
- params = acgsou.request(query, dic)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('acgsou.com' in params['url'])
-
- def test_response(self):
- resp = mock.Mock(text='<html></html>')
- self.assertEqual(acgsou.response(resp), [])
-
- html = u"""
- <html>
-<table id="listTable" class="list_style table_fixed">
- <thead class="tcat">
- <tr>
- <th axis="string" class="l1 tableHeaderOver">test</th>
- <th axis="string" class="l2 tableHeaderOver">test</th>
- <th axis="string" class="l3 tableHeaderOver">test</th>
- <th axis="size" class="l4 tableHeaderOver">test</th>
- <th axis="number" class="l5 tableHeaderOver">test</th>
- <th axis="number" class="l6 tableHeaderOver">test</th>
- <th axis="number" class="l7 tableHeaderOver">test</th>
- <th axis="string" class="l8 tableHeaderOver">test</th>
- </tr>
- </thead>
- <tbody class="tbody" id="data_list">
- <tr class="alt1 ">
- <td nowrap="nowrap">date</td>
- <td><a href="category.html">testcategory テスト</a></td>
- <td style="text-align:left;">
- <a href="show-torrentid.html" target="_blank">torrentname テスト</a>
- </td>
- <td>1MB</td>
- <td nowrap="nowrap">
- <span class="bts_1">
- 29
- </span>
- </td>
- <td nowrap="nowrap">
- <span class="btl_1">
- 211
- </span>
- </td>
- <td nowrap="nowrap">
- <span class="btc_">
- 168
- </span>
- </td>
- <td><a href="random.html">user</a></td>
- </tr>
- </tbody>
-</table>
-</html>
- """
-
- resp = mock.Mock(text=html)
- results = acgsou.response(resp)
-
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
-
- r = results[0]
- self.assertEqual(r['url'], 'http://www.acgsou.com/show-torrentid.html')
- self.assertEqual(r['content'], u'Category: "testcategory テスト".')
- self.assertEqual(r['title'], u'torrentname テスト')
- self.assertEqual(r['filesize'], 1048576)
diff --git a/tests/unit/engines/test_archlinux.py b/tests/unit/engines/test_archlinux.py
deleted file mode 100644
index 062f023bd..000000000
--- a/tests/unit/engines/test_archlinux.py
+++ /dev/null
@@ -1,111 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import archlinux
-from searx.testing import SearxTestCase
-
-domains = {
- 'all': 'https://wiki.archlinux.org',
- 'de': 'https://wiki.archlinux.de',
- 'fr': 'https://wiki.archlinux.fr',
- 'ja': 'https://wiki.archlinuxjp.org',
- 'ro': 'http://wiki.archlinux.ro',
- 'tr': 'http://archtr.org/wiki'
-}
-
-
-class TestArchLinuxEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dic = defaultdict(dict)
- dic['pageno'] = 1
- dic['language'] = 'en-US'
- params = archlinux.request(query, dic)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('wiki.archlinux.org' in params['url'])
-
- for lang, name in archlinux.main_langs:
- dic['language'] = lang
- params = archlinux.request(query, dic)
- self.assertTrue(name in params['url'])
-
- for lang, domain in domains.items():
- dic['language'] = lang
- params = archlinux.request(query, dic)
- self.assertTrue(domain in params['url'])
-
- def test_response(self):
- response = mock.Mock(text='<html></html>',
- search_params={'language': 'en_US'})
- self.assertEqual(archlinux.response(response), [])
-
- html = """
- <ul class="mw-search-results">
- <li>
- <div class="mw-search-result-heading">
- <a href="/index.php/ATI" title="ATI">ATI</a>
- </div>
- <div class="searchresult">
- Lorem ipsum dolor sit amet
- </div>
- <div class="mw-search-result-data">
- 30 KB (4,630 words) - 19:04, 17 March 2016</div>
- </li>
- <li>
- <div class="mw-search-result-heading">
- <a href="/index.php/Frequently_asked_questions" title="Frequently asked questions">
- Frequently asked questions
- </a>
- </div>
- <div class="searchresult">
- CPUs with AMDs instruction set "AMD64"
- </div>
- <div class="mw-search-result-data">
- 17 KB (2,722 words) - 20:13, 21 March 2016
- </div>
- </li>
- <li>
- <div class="mw-search-result-heading">
- <a href="/index.php/CPU_frequency_scaling" title="CPU frequency scaling">CPU frequency scaling</a>
- </div>
- <div class="searchresult">
- ondemand for AMD and older Intel CPU
- </div>
- <div class="mw-search-result-data">
- 15 KB (2,319 words) - 23:46, 16 March 2016
- </div>
- </li>
- </ul>
- """
-
- expected = [
- {
- 'title': 'ATI',
- 'url': 'https://wiki.archlinux.org/index.php/ATI'
- },
- {
- 'title': 'Frequently asked questions',
- 'url': 'https://wiki.archlinux.org/index.php/Frequently_asked_questions'
- },
- {
- 'title': 'CPU frequency scaling',
- 'url': 'https://wiki.archlinux.org/index.php/CPU_frequency_scaling'
- }
- ]
-
- response = mock.Mock(text=html)
- response.search_params = {
- 'language': 'en_US'
- }
- results = archlinux.response(response)
-
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), len(expected))
-
- i = 0
- for exp in expected:
- res = results[i]
- i += 1
- for key, value in exp.items():
- self.assertEqual(res[key], value)
diff --git a/tests/unit/engines/test_arxiv.py b/tests/unit/engines/test_arxiv.py
deleted file mode 100644
index b32c0e605..000000000
--- a/tests/unit/engines/test_arxiv.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import arxiv
-from searx.testing import SearxTestCase
-
-
-class TestBaseEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- params = arxiv.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn('export.arxiv.org/api/', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, arxiv.response, None)
- self.assertRaises(AttributeError, arxiv.response, [])
- self.assertRaises(AttributeError, arxiv.response, '')
- self.assertRaises(AttributeError, arxiv.response, '[]')
-
- response = mock.Mock(content=b'''<?xml version="1.0" encoding="UTF-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom"></feed>''')
- self.assertEqual(arxiv.response(response), [])
-
- xml_mock = b'''<?xml version="1.0" encoding="UTF-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom">
- <title type="html">ArXiv Query: search_query=all:test_query&amp;id_list=&amp;start=0&amp;max_results=1</title>
- <id>http://arxiv.org/api/1</id>
- <updated>2000-01-21T00:00:00-01:00</updated>
- <opensearch:totalResults xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/">1</opensearch:totalResults>
- <opensearch:startIndex xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/">0</opensearch:startIndex>
- <opensearch:itemsPerPage xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/">1</opensearch:itemsPerPage>
- <entry>
- <id>http://arxiv.org/1</id>
- <updated>2000-01-01T00:00:01Z</updated>
- <published>2000-01-01T00:00:01Z</published>
- <title>Mathematical proof.</title>
- <summary>Mathematical formula.</summary>
- <author>
- <name>A. B.</name>
- </author>
- <link href="http://arxiv.org/1" rel="alternate" type="text/html"/>
- <link title="pdf" href="http://arxiv.org/1" rel="related" type="application/pdf"/>
- <category term="math.QA" scheme="http://arxiv.org/schemas/atom"/>
- <category term="1" scheme="http://arxiv.org/schemas/atom"/>
- </entry>
-</feed>
-'''
-
- response = mock.Mock(content=xml_mock)
- results = arxiv.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Mathematical proof.')
- self.assertEqual(results[0]['content'], 'Mathematical formula.')
diff --git a/tests/unit/engines/test_base.py b/tests/unit/engines/test_base.py
deleted file mode 100644
index b5da5bde7..000000000
--- a/tests/unit/engines/test_base.py
+++ /dev/null
@@ -1,91 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import base
-from searx.testing import SearxTestCase
-
-
-class TestBaseEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- params = base.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn('base-search.net', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, base.response, None)
- self.assertRaises(AttributeError, base.response, [])
- self.assertRaises(AttributeError, base.response, '')
- self.assertRaises(AttributeError, base.response, '[]')
-
- response = mock.Mock(content=b'<response></response>')
- self.assertEqual(base.response(response), [])
-
- xml_mock = b"""<?xml version="1.0"?>
-<response>
- <lst name="responseHeader">
- <int name="status">0</int>
- <int name="QTime">1</int>
- </lst>
- <result name="response" numFound="1" start="0">
- <doc>
- <date name="dchdate">2000-01-01T01:01:01Z</date>
- <str name="dcdocid">1</str>
- <str name="dccontinent">cna</str>
- <str name="dccountry">us</str>
- <str name="dccollection">ftciteseerx</str>
- <str name="dcprovider">CiteSeerX</str>
- <str name="dctitle">Science and more</str>
- <arr name="dccreator">
- <str>Someone</str>
- </arr>
- <arr name="dcperson">
- <str>Someone</str>
- </arr>
- <arr name="dcsubject">
- <str>Science and more</str>
- </arr>
- <str name="dcdescription">Science, and even more.</str>
- <arr name="dccontributor">
- <str>The neighbour</str>
- </arr>
- <str name="dcdate">2001</str>
- <int name="dcyear">2001</int>
- <arr name="dctype">
- <str>text</str>
- </arr>
- <arr name="dctypenorm">
- <str>1</str>
- </arr>
- <arr name="dcformat">
- <str>application/pdf</str>
- </arr>
- <arr name="dccontenttype">
- <str>application/pdf</str>
- </arr>
- <arr name="dcidentifier">
- <str>http://example.org/</str>
- </arr>
- <str name="dclink">http://example.org</str>
- <str name="dcsource">http://example.org</str>
- <arr name="dclanguage">
- <str>en</str>
- </arr>
- <str name="dcrights">Under the example.org licence</str>
- <int name="dcoa">1</int>
- <arr name="dclang">
- <str>eng</str>
- </arr>
- </doc>
- </result>
-</response>"""
-
- response = mock.Mock(content=xml_mock)
- results = base.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Science and more')
- self.assertEqual(results[0]['content'], 'Science, and even more.')
diff --git a/tests/unit/engines/test_bing.py b/tests/unit/engines/test_bing.py
deleted file mode 100644
index 21191ff25..000000000
--- a/tests/unit/engines/test_bing.py
+++ /dev/null
@@ -1,121 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import bing
-from searx.testing import SearxTestCase
-
-
-class TestBingEngine(SearxTestCase):
-
- def test_request(self):
- bing.supported_languages = ['en', 'fr', 'zh-CHS', 'zh-CHT', 'pt-PT', 'pt-BR']
- query = u'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- dicto['language'] = 'fr-FR'
- params = bing.request(query.encode('utf-8'), dicto)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('language%3AFR' in params['url'])
- self.assertTrue('bing.com' in params['url'])
-
- dicto['language'] = 'all'
- params = bing.request(query.encode('utf-8'), dicto)
- self.assertTrue('language' in params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, bing.response, None)
- self.assertRaises(AttributeError, bing.response, [])
- self.assertRaises(AttributeError, bing.response, '')
- self.assertRaises(AttributeError, bing.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(bing.response(response), [])
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(bing.response(response), [])
-
- html = """
- <div class="sa_cc" u="0|5109|4755453613245655|UAGjXgIrPH5yh-o5oNHRx_3Zta87f_QO">
- <div Class="sa_mc">
- <div class="sb_tlst">
- <h3>
- <a href="http://this.should.be.the.link/" h="ID=SERP,5124.1">
- <strong>This</strong> should be the title</a>
- </h3>
- </div>
- <div class="sb_meta"><cite><strong>this</strong>.meta.com</cite>
- <span class="c_tlbxTrg">
- <span class="c_tlbxH" H="BASE:CACHEDPAGEDEFAULT" K="SERP,5125.1">
- </span>
- </span>
- </div>
- <p><strong>This</strong> should be the content.</p>
- </div>
- </div>
- """
- response = mock.Mock(text=html)
- results = bing.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This should be the title')
- self.assertEqual(results[0]['url'], 'http://this.should.be.the.link/')
- self.assertEqual(results[0]['content'], 'This should be the content.')
-
- html = """
- <li class="b_algo" u="0|5109|4755453613245655|UAGjXgIrPH5yh-o5oNHRx_3Zta87f_QO">
- <div Class="sa_mc">
- <div class="sb_tlst">
- <h2>
- <a href="http://this.should.be.the.link/" h="ID=SERP,5124.1">
- <strong>This</strong> should be the title</a>
- </h2>
- </div>
- <div class="sb_meta"><cite><strong>this</strong>.meta.com</cite>
- <span class="c_tlbxTrg">
- <span class="c_tlbxH" H="BASE:CACHEDPAGEDEFAULT" K="SERP,5125.1">
- </span>
- </span>
- </div>
- <p><strong>This</strong> should be the content.</p>
- </div>
- </li>
- """
- response = mock.Mock(text=html)
- results = bing.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This should be the title')
- self.assertEqual(results[0]['url'], 'http://this.should.be.the.link/')
- self.assertEqual(results[0]['content'], 'This should be the content.')
-
- def test_fetch_supported_languages(self):
- html = """<html></html>"""
- response = mock.Mock(text=html)
- results = bing._fetch_supported_languages(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- html = """
- <html>
- <body>
- <form>
- <div id="limit-languages">
- <div>
- <div><input id="es" value="es"></input></div>
- </div>
- <div>
- <div><input id="pt_BR" value="pt_BR"></input></div>
- <div><input id="pt_PT" value="pt_PT"></input></div>
- </div>
- </div>
- </form>
- </body>
- </html>
- """
- response = mock.Mock(text=html)
- languages = bing._fetch_supported_languages(response)
- self.assertEqual(type(languages), list)
- self.assertEqual(len(languages), 3)
- self.assertIn('es', languages)
- self.assertIn('pt-BR', languages)
- self.assertIn('pt-PT', languages)
diff --git a/tests/unit/engines/test_bing_images.py b/tests/unit/engines/test_bing_images.py
deleted file mode 100644
index e65e6cc04..000000000
--- a/tests/unit/engines/test_bing_images.py
+++ /dev/null
@@ -1,118 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import bing_images
-from searx.testing import SearxTestCase
-
-
-class TestBingImagesEngine(SearxTestCase):
-
- def test_request(self):
- bing_images.supported_languages = ['fr-FR', 'en-US']
- bing_images.language_aliases = {}
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['language'] = 'fr-FR'
- dicto['safesearch'] = 1
- dicto['time_range'] = ''
- params = bing_images.request(query, dicto)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('bing.com' in params['url'])
- self.assertTrue('SRCHHPGUSR' in params['cookies'])
- self.assertTrue('DEMOTE' in params['cookies']['SRCHHPGUSR'])
- self.assertTrue('_EDGE_S' in params['cookies'])
- self.assertTrue('fr-fr' in params['cookies']['_EDGE_S'])
-
- dicto['language'] = 'fr'
- params = bing_images.request(query, dicto)
- self.assertTrue('_EDGE_S' in params['cookies'])
- self.assertTrue('fr-fr' in params['cookies']['_EDGE_S'])
-
- dicto['language'] = 'all'
- params = bing_images.request(query, dicto)
- self.assertTrue('_EDGE_S' in params['cookies'])
- self.assertTrue('en-us' in params['cookies']['_EDGE_S'])
-
- def test_response(self):
- self.assertRaises(AttributeError, bing_images.response, None)
- self.assertRaises(AttributeError, bing_images.response, [])
- self.assertRaises(AttributeError, bing_images.response, '')
- self.assertRaises(AttributeError, bing_images.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(bing_images.response(response), [])
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(bing_images.response(response), [])
-
- html = """
- <div id="mmComponent_images_1">
- <ul>
- <li>
- <div>
- <div class="imgpt">
- <a m='{"purl":"page_url","murl":"img_url","turl":"thumb_url"}'>
- <img src="" alt="alt text" />
- </a>
- </div>
- <div></div>
- </div>
- <div>
- <div class="imgpt">
- <a m='{"purl":"page_url2","murl":"img_url2","turl":"thumb_url2"}'>
- <img src="" alt="alt text 2" />
- </a>
- </div>
- </div>
- </li>
- </ul>
- <ul>
- <li>
- <div>
- <div class="imgpt">
- <a m='{"purl":"page_url3","murl":"img_url3","turl":"thumb_url3"}'>
- <img src="" alt="alt text 3" />
- </a>
- </div>
- </div>
- </li>
- </ul>
- </div>
- """
- html = html.replace('\r\n', '').replace('\n', '').replace('\r', '')
- response = mock.Mock(text=html)
- results = bing_images.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 3)
- self.assertEqual(results[0]['title'], 'alt text')
- self.assertEqual(results[0]['url'], 'page_url')
- self.assertEqual(results[0]['content'], '')
- self.assertEqual(results[0]['thumbnail_src'], 'thumb_url')
- self.assertEqual(results[0]['img_src'], 'img_url')
-
- def test_fetch_supported_languages(self):
- html = """
- <div>
- <div id="region-section-content">
- <ul class="b_vList">
- <li>
- <a href="https://bing...&setmkt=de-DE&s...">Germany</a>
- <a href="https://bing...&setmkt=nb-NO&s...">Norway</a>
- </li>
- </ul>
- <ul class="b_vList">
- <li>
- <a href="https://bing...&setmkt=es-AR&s...">Argentina</a>
- </li>
- </ul>
- </div>
- </div>
- """
- response = mock.Mock(text=html)
- languages = list(bing_images._fetch_supported_languages(response))
- self.assertEqual(len(languages), 3)
- self.assertIn('de-DE', languages)
- self.assertIn('no-NO', languages)
- self.assertIn('es-AR', languages)
diff --git a/tests/unit/engines/test_bing_news.py b/tests/unit/engines/test_bing_news.py
deleted file mode 100644
index 1155e79c4..000000000
--- a/tests/unit/engines/test_bing_news.py
+++ /dev/null
@@ -1,147 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import bing_news
-from searx.testing import SearxTestCase
-import lxml
-
-
-class TestBingNewsEngine(SearxTestCase):
-
- def test_request(self):
- bing_news.supported_languages = ['en', 'fr']
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['language'] = 'fr-FR'
- dicto['time_range'] = ''
- params = bing_news.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('bing.com', params['url'])
- self.assertIn('fr', params['url'])
-
- dicto['language'] = 'all'
- params = bing_news.request(query, dicto)
- self.assertIn('en', params['url'])
-
- def test_no_url_in_request_year_time_range(self):
- dicto = defaultdict(dict)
- query = 'test_query'
- dicto['time_range'] = 'year'
- params = bing_news.request(query, dicto)
- self.assertEqual({}, params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, bing_news.response, None)
- self.assertRaises(AttributeError, bing_news.response, [])
- self.assertRaises(AttributeError, bing_news.response, '')
- self.assertRaises(AttributeError, bing_news.response, '[]')
-
- response = mock.Mock(content='<html></html>')
- self.assertEqual(bing_news.response(response), [])
-
- response = mock.Mock(content='<html></html>')
- self.assertEqual(bing_news.response(response), [])
-
- html = """<?xml version="1.0" encoding="utf-8" ?>
-<rss version="2.0" xmlns:News="https://www.bing.com:443/news/search?q=python&amp;setmkt=en-US&amp;first=1&amp;format=RSS">
- <channel>
- <title>python - Bing News</title>
- <link>https://www.bing.com:443/news/search?q=python&amp;setmkt=en-US&amp;first=1&amp;format=RSS</link>
- <description>Search results</description>
- <image>
- <url>http://10.53.64.9/rsslogo.gif</url>
- <title>test</title>
- <link>https://www.bing.com:443/news/search?q=test&amp;setmkt=en-US&amp;first=1&amp;format=RSS</link>
- </image>
- <copyright>Copyright</copyright>
- <item>
- <title>Title</title>
- <link>https://www.bing.com/news/apiclick.aspx?ref=FexRss&amp;aid=&amp;tid=c237eccc50bd4758b106a5e3c94fce09&amp;url=http%3a%2f%2furl.of.article%2f&amp;c=xxxxxxxxx&amp;mkt=en-us</link>
- <description>Article Content</description>
- <pubDate>Tue, 02 Jun 2015 13:37:00 GMT</pubDate>
- <News:Source>Infoworld</News:Source>
- <News:Image>http://a1.bing4.com/th?id=ON.13371337133713371337133713371337&amp;pid=News</News:Image>
- <News:ImageSize>w={0}&amp;h={1}&amp;c=7</News:ImageSize>
- <News:ImageKeepOriginalRatio></News:ImageKeepOriginalRatio>
- <News:ImageMaxWidth>620</News:ImageMaxWidth>
- <News:ImageMaxHeight>413</News:ImageMaxHeight>
- </item>
- <item>
- <title>Another Title</title>
- <link>https://www.bing.com/news/apiclick.aspx?ref=FexRss&amp;aid=&amp;tid=c237eccc50bd4758b106a5e3c94fce09&amp;url=http%3a%2f%2fanother.url.of.article%2f&amp;c=xxxxxxxxx&amp;mkt=en-us</link>
- <description>Another Article Content</description>
- <pubDate>Tue, 02 Jun 2015 13:37:00 GMT</pubDate>
- </item>
- </channel>
-</rss>""" # noqa
- response = mock.Mock(content=html.encode('utf-8'))
- results = bing_news.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
- self.assertEqual(results[0]['title'], 'Title')
- self.assertEqual(results[0]['url'], 'http://url.of.article/')
- self.assertEqual(results[0]['content'], 'Article Content')
- self.assertEqual(results[0]['img_src'], 'https://www.bing.com/th?id=ON.13371337133713371337133713371337')
- self.assertEqual(results[1]['title'], 'Another Title')
- self.assertEqual(results[1]['url'], 'http://another.url.of.article/')
- self.assertEqual(results[1]['content'], 'Another Article Content')
- self.assertNotIn('img_src', results[1])
-
- html = """<?xml version="1.0" encoding="utf-8" ?>
-<rss version="2.0" xmlns:News="https://www.bing.com:443/news/search?q=python&amp;setmkt=en-US&amp;first=1&amp;format=RSS">
- <channel>
- <title>python - Bing News</title>
- <link>https://www.bing.com:443/news/search?q=python&amp;setmkt=en-US&amp;first=1&amp;format=RSS</link>
- <description>Search results</description>
- <image>
- <url>http://10.53.64.9/rsslogo.gif</url>
- <title>test</title>
- <link>https://www.bing.com:443/news/search?q=test&amp;setmkt=en-US&amp;first=1&amp;format=RSS</link>
- </image>
- <copyright>Copyright</copyright>
- <item>
- <title>Title</title>
- <link>http://another.url.of.article/</link>
- <description>Article Content</description>
- <pubDate>garbage</pubDate>
- <News:Source>Infoworld</News:Source>
- <News:Image>http://another.bing.com/image</News:Image>
- <News:ImageSize>w={0}&amp;h={1}&amp;c=7</News:ImageSize>
- <News:ImageKeepOriginalRatio></News:ImageKeepOriginalRatio>
- <News:ImageMaxWidth>620</News:ImageMaxWidth>
- <News:ImageMaxHeight>413</News:ImageMaxHeight>
- </item>
- </channel>
-</rss>""" # noqa
- response = mock.Mock(content=html.encode('utf-8'))
- results = bing_news.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Title')
- self.assertEqual(results[0]['url'], 'http://another.url.of.article/')
- self.assertEqual(results[0]['content'], 'Article Content')
- self.assertEqual(results[0]['img_src'], 'http://another.bing.com/image')
-
- html = """<?xml version="1.0" encoding="utf-8" ?>
-<rss version="2.0" xmlns:News="https://www.bing.com:443/news/search?q=python&amp;setmkt=en-US&amp;first=1&amp;format=RSS">
- <channel>
- <title>python - Bing News</title>
- <link>https://www.bing.com:443/news/search?q=python&amp;setmkt=en-US&amp;first=1&amp;format=RSS</link>
- <description>Search results</description>
- <image>
- <url>http://10.53.64.9/rsslogo.gif</url>
- <title>test</title>
- <link>https://www.bing.com:443/news/search?q=test&amp;setmkt=en-US&amp;first=1&amp;format=RSS</link>
- </image>
- </channel>
-</rss>""" # noqa
-
- response = mock.Mock(content=html.encode('utf-8'))
- results = bing_news.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- html = """<?xml version="1.0" encoding="utf-8" ?>gabarge"""
- response = mock.Mock(content=html.encode('utf-8'))
- self.assertRaises(lxml.etree.XMLSyntaxError, bing_news.response, response)
diff --git a/tests/unit/engines/test_bing_videos.py b/tests/unit/engines/test_bing_videos.py
deleted file mode 100644
index 1ae1fad37..000000000
--- a/tests/unit/engines/test_bing_videos.py
+++ /dev/null
@@ -1,100 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import bing_videos
-from searx.testing import SearxTestCase
-
-
-class TestBingVideosEngine(SearxTestCase):
-
- def test_request(self):
- bing_videos.supported_languages = ['fr-FR', 'en-US']
- bing_videos.language_aliases = {}
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['language'] = 'fr-FR'
- dicto['safesearch'] = 0
- dicto['time_range'] = ''
- params = bing_videos.request(query, dicto)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('bing.com' in params['url'])
- self.assertTrue('SRCHHPGUSR' in params['cookies'])
- self.assertTrue('OFF' in params['cookies']['SRCHHPGUSR'])
- self.assertTrue('_EDGE_S' in params['cookies'])
- self.assertTrue('fr-fr' in params['cookies']['_EDGE_S'])
-
- dicto['pageno'] = 2
- dicto['time_range'] = 'day'
- dicto['safesearch'] = 2
- params = bing_videos.request(query, dicto)
- self.assertTrue('first=11' in params['url'])
- self.assertTrue('1440' in params['url'])
- self.assertIn('SRCHHPGUSR', params['cookies'])
- self.assertTrue('STRICT' in params['cookies']['SRCHHPGUSR'])
-
- def test_response(self):
- self.assertRaises(AttributeError, bing_videos.response, None)
- self.assertRaises(AttributeError, bing_videos.response, [])
- self.assertRaises(AttributeError, bing_videos.response, '')
- self.assertRaises(AttributeError, bing_videos.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(bing_videos.response(response), [])
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(bing_videos.response(response), [])
-
- html = """
- <div class="dg_u">
- <div id="mc_vtvc_1" class="mc_vtvc">
- <a class="mc_vtvc_link" href="/video">
- <div class="mc_vtvc_th">
- <div class="cico">
- <img src="thumb_1.jpg" />
- </div>
- <div class="mc_vtvc_ban_lo">
- <div class="vtbc">
- <div class="mc_bc_w b_smText">
- <div class="mc_bc pivot bpi_2">
- <span title="">
- <span class="mv_vtvc_play cipg "></span>
- </span>
- </div>
- <div class="mc_bc items">10:06</div>
- </div>
- </div>
- </div>
- </div>
- <div class="mc_vtvc_meta">
- <div class="mc_vtvc_title" title="Title 1"></div>
- <div class="mc_vtvc_meta_block_area">
- <div class="mc_vtvc_meta_block">
- <div class="mc_vtvc_meta_row">
- <span>65,696,000+ views</span>
- <span>1 year ago</span>
- </div>
- <div class="mc_vtvc_meta_row mc_vtvc_meta_row_channel">Content 1</div>
- <div class="mc_vtvc_meta_row"><span>
- <div class="cico mc_vtvc_src_ico">
- <div></div>
- </div>
- <span>YouTube</span>
- </span></div>
- </div>
- </div>
- </div>
- <div class="vrhdata"></div>
- </a>
- </div>
- </div>
- """
- response = mock.Mock(text=html)
- results = bing_videos.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Title 1')
- self.assertEqual(results[0]['url'], 'https://bing.com/video')
- self.assertEqual(results[0]['content'], 'Content 1')
- self.assertEqual(results[0]['thumbnail'], 'thumb_1.jpg')
diff --git a/tests/unit/engines/test_btdigg.py b/tests/unit/engines/test_btdigg.py
deleted file mode 100644
index 6a88e3f75..000000000
--- a/tests/unit/engines/test_btdigg.py
+++ /dev/null
@@ -1,384 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import btdigg
-from searx.testing import SearxTestCase
-
-
-class TestBtdiggEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- params = btdigg.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('btdigg.org', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, btdigg.response, None)
- self.assertRaises(AttributeError, btdigg.response, [])
- self.assertRaises(AttributeError, btdigg.response, '')
- self.assertRaises(AttributeError, btdigg.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(btdigg.response(response), [])
-
- html = u"""
- <div id="search_res">
- <table>
- <tr>
- <td class="idx">1</td>
- <td>
- <table class="torrent_name_tbl">
- <tr>
- <td class="torrent_name">
- <a href="/url">Should be the title</a>
- </td>
- </tr>
- </table>
- <table class="torrent_name_tbl">
- <tr>
- <td class="ttth">
- <a onclick="fclck(this.href)" href="magnet:?xt=urn:btih:magnet&amp;dn=Test"
- title="Télécharger des liens Magnet">[magnet]</a>
- </td>
- <td class="ttth">
- <a href="https://btcloud.io/manager?cmd=add&amp;info_hash=hash"
- target="_blank" title="Ajouter à BTCloud">[cloud]</a>
- </td>
- <td>
- <span class="attr_name">Taille:</span>
- <span class="attr_val">8 B</span>
- </td>
- <td>
- <span class="attr_name">Fichiers:</span>
- <span class="attr_val">710</span>
- </td>
- <td>
- <span class="attr_name">Téléchargements:</span>
- <span class="attr_val">5</span>
- </td>
- <td>
- <span class="attr_name">Temps:</span>
- <span class="attr_val">417.8&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Dernière&nbsp;mise&nbsp;à&nbsp;jour:</span>
- <span class="attr_val">5.3&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Faux:</span>
- <span class="attr_val">Aucun</span>
- </td>
- </tr>
- </table>
- <pre class="snippet">
- Content
- </pre>
- </td>
- </tr>
- </table>
- </div>
- """
- response = mock.Mock(text=html.encode('utf-8'))
- results = btdigg.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Should be the title')
- self.assertEqual(results[0]['url'], 'https://btdigg.org/url')
- self.assertEqual(results[0]['content'], 'Content')
- self.assertEqual(results[0]['seed'], 5)
- self.assertEqual(results[0]['leech'], 0)
- self.assertEqual(results[0]['filesize'], 8)
- self.assertEqual(results[0]['files'], 710)
- self.assertEqual(results[0]['magnetlink'], 'magnet:?xt=urn:btih:magnet&dn=Test')
-
- html = """
- <div id="search_res">
- <table>
- </table>
- </div>
- """
- response = mock.Mock(text=html.encode('utf-8'))
- results = btdigg.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- html = u"""
- <div id="search_res">
- <table>
- <tr>
- <td class="idx">1</td>
- <td>
- <table class="torrent_name_tbl">
- <tr>
- <td class="torrent_name">
- <a href="/url">Should be the title</a>
- </td>
- </tr>
- </table>
- <table class="torrent_name_tbl">
- <tr>
- <td class="ttth">
- <a onclick="fclck(this.href)" href="magnet:?xt=urn:btih:magnet&amp;dn=Test"
- title="Télécharger des liens Magnet">[magnet]</a>
- </td>
- <td class="ttth">
- <a href="https://btcloud.io/manager?cmd=add&amp;info_hash=hash"
- target="_blank" title="Ajouter à BTCloud">[cloud]</a>
- </td>
- <td>
- <span class="attr_name">Taille:</span>
- <span class="attr_val">1 KB</span>
- </td>
- <td>
- <span class="attr_name">Fichiers:</span>
- <span class="attr_val">710</span>
- </td>
- <td>
- <span class="attr_name">Téléchargements:</span>
- <span class="attr_val">5</span>
- </td>
- <td>
- <span class="attr_name">Temps:</span>
- <span class="attr_val">417.8&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Dernière&nbsp;mise&nbsp;à&nbsp;jour:</span>
- <span class="attr_val">5.3&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Faux:</span>
- <span class="attr_val">Aucun</span>
- </td>
- </tr>
- </table>
- <pre class="snippet">
- Content
- </pre>
- </td>
- </tr>
- <tr>
- <td class="idx">1</td>
- <td>
- <table class="torrent_name_tbl">
- <tr>
- <td class="torrent_name">
- <a href="/url">Should be the title</a>
- </td>
- </tr>
- </table>
- <table class="torrent_name_tbl">
- <tr>
- <td class="ttth">
- <a onclick="fclck(this.href)" href="magnet:?xt=urn:btih:magnet&amp;dn=Test"
- title="Télécharger des liens Magnet">[magnet]</a>
- </td>
- <td class="ttth">
- <a href="https://btcloud.io/manager?cmd=add&amp;info_hash=hash"
- target="_blank" title="Ajouter à BTCloud">[cloud]</a>
- </td>
- <td>
- <span class="attr_name">Taille:</span>
- <span class="attr_val">1 MB</span>
- </td>
- <td>
- <span class="attr_name">Fichiers:</span>
- <span class="attr_val">a</span>
- </td>
- <td>
- <span class="attr_name">Téléchargements:</span>
- <span class="attr_val">4</span>
- </td>
- <td>
- <span class="attr_name">Temps:</span>
- <span class="attr_val">417.8&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Dernière&nbsp;mise&nbsp;à&nbsp;jour:</span>
- <span class="attr_val">5.3&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Faux:</span>
- <span class="attr_val">Aucun</span>
- </td>
- </tr>
- </table>
- <pre class="snippet">
- Content
- </pre>
- </td>
- </tr>
- <tr>
- <td class="idx">1</td>
- <td>
- <table class="torrent_name_tbl">
- <tr>
- <td class="torrent_name">
- <a href="/url">Should be the title</a>
- </td>
- </tr>
- </table>
- <table class="torrent_name_tbl">
- <tr>
- <td class="ttth">
- <a onclick="fclck(this.href)" href="magnet:?xt=urn:btih:magnet&amp;dn=Test"
- title="Télécharger des liens Magnet">[magnet]</a>
- </td>
- <td class="ttth">
- <a href="https://btcloud.io/manager?cmd=add&amp;info_hash=hash"
- target="_blank" title="Ajouter à BTCloud">[cloud]</a>
- </td>
- <td>
- <span class="attr_name">Taille:</span>
- <span class="attr_val">1 GB</span>
- </td>
- <td>
- <span class="attr_name">Fichiers:</span>
- <span class="attr_val">710</span>
- </td>
- <td>
- <span class="attr_name">Téléchargements:</span>
- <span class="attr_val">3</span>
- </td>
- <td>
- <span class="attr_name">Temps:</span>
- <span class="attr_val">417.8&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Dernière&nbsp;mise&nbsp;à&nbsp;jour:</span>
- <span class="attr_val">5.3&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Faux:</span>
- <span class="attr_val">Aucun</span>
- </td>
- </tr>
- </table>
- <pre class="snippet">
- Content
- </pre>
- </td>
- </tr>
- <tr>
- <td class="idx">1</td>
- <td>
- <table class="torrent_name_tbl">
- <tr>
- <td class="torrent_name">
- <a href="/url">Should be the title</a>
- </td>
- </tr>
- </table>
- <table class="torrent_name_tbl">
- <tr>
- <td class="ttth">
- <a onclick="fclck(this.href)" href="magnet:?xt=urn:btih:magnet&amp;dn=Test"
- title="Télécharger des liens Magnet">[magnet]</a>
- </td>
- <td class="ttth">
- <a href="https://btcloud.io/manager?cmd=add&amp;info_hash=hash"
- target="_blank" title="Ajouter à BTCloud">[cloud]</a>
- </td>
- <td>
- <span class="attr_name">Taille:</span>
- <span class="attr_val">1 TB</span>
- </td>
- <td>
- <span class="attr_name">Fichiers:</span>
- <span class="attr_val">710</span>
- </td>
- <td>
- <span class="attr_name">Téléchargements:</span>
- <span class="attr_val">2</span>
- </td>
- <td>
- <span class="attr_name">Temps:</span>
- <span class="attr_val">417.8&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Dernière&nbsp;mise&nbsp;à&nbsp;jour:</span>
- <span class="attr_val">5.3&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Faux:</span>
- <span class="attr_val">Aucun</span>
- </td>
- </tr>
- </table>
- <pre class="snippet">
- Content
- </pre>
- </td>
- </tr>
- <tr>
- <td class="idx">1</td>
- <td>
- <table class="torrent_name_tbl">
- <tr>
- <td class="torrent_name">
- <a href="/url">Should be the title</a>
- </td>
- </tr>
- </table>
- <table class="torrent_name_tbl">
- <tr>
- <td class="ttth">
- <a onclick="fclck(this.href)" href="magnet:?xt=urn:btih:magnet&amp;dn=Test"
- title="Télécharger des liens Magnet">[magnet]</a>
- </td>
- <td class="ttth">
- <a href="https://btcloud.io/manager?cmd=add&amp;info_hash=hash"
- target="_blank" title="Ajouter à BTCloud">[cloud]</a>
- </td>
- <td>
- <span class="attr_name">Taille:</span>
- <span class="attr_val">a TB</span>
- </td>
- <td>
- <span class="attr_name">Fichiers:</span>
- <span class="attr_val">710</span>
- </td>
- <td>
- <span class="attr_name">Téléchargements:</span>
- <span class="attr_val">z</span>
- </td>
- <td>
- <span class="attr_name">Temps:</span>
- <span class="attr_val">417.8&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Dernière&nbsp;mise&nbsp;à&nbsp;jour:</span>
- <span class="attr_val">5.3&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Faux:</span>
- <span class="attr_val">Aucun</span>
- </td>
- </tr>
- </table>
- <pre class="snippet">
- Content
- </pre>
- </td>
- </tr>
- </table>
- </div>
- """
- response = mock.Mock(text=html.encode('utf-8'))
- results = btdigg.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 5)
- self.assertEqual(results[0]['title'], 'Should be the title')
- self.assertEqual(results[0]['url'], 'https://btdigg.org/url')
- self.assertEqual(results[0]['content'], 'Content')
- self.assertEqual(results[0]['seed'], 5)
- self.assertEqual(results[0]['leech'], 0)
- self.assertEqual(results[0]['files'], 710)
- self.assertEqual(results[0]['magnetlink'], 'magnet:?xt=urn:btih:magnet&dn=Test')
- self.assertEqual(results[0]['filesize'], 1024)
- self.assertEqual(results[1]['filesize'], 1048576)
- self.assertEqual(results[2]['filesize'], 1073741824)
- self.assertEqual(results[3]['filesize'], 1099511627776)
diff --git a/tests/unit/engines/test_currency_convert.py b/tests/unit/engines/test_currency_convert.py
deleted file mode 100644
index fec194103..000000000
--- a/tests/unit/engines/test_currency_convert.py
+++ /dev/null
@@ -1,56 +0,0 @@
-from collections import defaultdict
-from datetime import datetime
-import mock
-from searx.engines import currency_convert
-from searx.testing import SearxTestCase
-
-
-class TestCurrencyConvertEngine(SearxTestCase):
-
- def test_request(self):
- query = b'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- params = currency_convert.request(query, dicto)
- self.assertNotIn('url', params)
-
- query = b'convert 10 Pound Sterlings to United States Dollars'
- params = currency_convert.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn('duckduckgo.com', params['url'])
- self.assertIn('GBP', params['url'])
- self.assertIn('USD', params['url'])
-
- def test_response(self):
- dicto = defaultdict(dict)
- dicto['amount'] = float(10)
- dicto['from'] = "GBP"
- dicto['to'] = "USD"
- dicto['from_name'] = "pound sterling"
- dicto['to_name'] = "United States dollar"
- response = mock.Mock(text='a,b,c,d', search_params=dicto)
- self.assertEqual(currency_convert.response(response), [])
- body = """ddg_spice_currency(
- {
- "conversion":{
- "converted-amount": "0.5"
- },
- "topConversions":[
- {
- },
- {
- }
- ]
- }
- );
- """
- response = mock.Mock(text=body, search_params=dicto)
- results = currency_convert.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['answer'], '10.0 GBP = 5.0 USD, 1 GBP (pound sterling)' +
- ' = 0.5 USD (United States dollar)')
-
- target_url = 'https://duckduckgo.com/js/spice/currency/1/{}/{}'.format(
- dicto['from'], dicto['to'])
- self.assertEqual(results[0]['url'], target_url)
diff --git a/tests/unit/engines/test_dailymotion.py b/tests/unit/engines/test_dailymotion.py
deleted file mode 100644
index ad7f3d283..000000000
--- a/tests/unit/engines/test_dailymotion.py
+++ /dev/null
@@ -1,112 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import dailymotion
-from searx.testing import SearxTestCase
-
-
-class TestDailymotionEngine(SearxTestCase):
-
- def test_request(self):
- dailymotion.supported_languages = ['en', 'fr']
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- dicto['language'] = 'fr-FR'
- params = dailymotion.request(query, dicto)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('dailymotion.com' in params['url'])
- self.assertTrue('fr' in params['url'])
-
- dicto['language'] = 'all'
- params = dailymotion.request(query, dicto)
- self.assertTrue('en' in params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, dailymotion.response, None)
- self.assertRaises(AttributeError, dailymotion.response, [])
- self.assertRaises(AttributeError, dailymotion.response, '')
- self.assertRaises(AttributeError, dailymotion.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(dailymotion.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(dailymotion.response(response), [])
-
- json = """
- {
- "page": 1,
- "limit": 5,
- "explicit": false,
- "total": 289487,
- "has_more": true,
- "list": [
- {
- "created_time": 1422173451,
- "title": "Title",
- "description": "Description",
- "duration": 81,
- "url": "http://www.url",
- "thumbnail_360_url": "http://thumbnail",
- "id": "x2fit7q"
- }
- ]
- }
- """
- response = mock.Mock(text=json)
- results = dailymotion.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Title')
- self.assertEqual(results[0]['url'], 'http://www.url')
- self.assertEqual(results[0]['content'], 'Description')
- self.assertIn('x2fit7q', results[0]['embedded'])
-
- json = r"""
- {"toto":[
- {"id":200,"name":"Artist Name",
- "link":"http:\/\/www.dailymotion.com\/artist\/1217","type":"artist"}
- ]}
- """
- response = mock.Mock(text=json)
- results = dailymotion.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- def test_fetch_supported_languages(self):
- json = r"""
- {"list":[{"code":"af","name":"Afrikaans","native_name":"Afrikaans",
- "localized_name":"Afrikaans","display_name":"Afrikaans"},
- {"code":"ar","name":"Arabic","native_name":"\u0627\u0644\u0639\u0631\u0628\u064a\u0629",
- "localized_name":"Arabic","display_name":"Arabic"},
- {"code":"la","name":"Latin","native_name":null,
- "localized_name":"Latin","display_name":"Latin"}
- ]}
- """
- response = mock.Mock(text=json)
- languages = dailymotion._fetch_supported_languages(response)
- self.assertEqual(type(languages), dict)
- self.assertEqual(len(languages), 3)
- self.assertIn('af', languages)
- self.assertIn('ar', languages)
- self.assertIn('la', languages)
-
- self.assertEqual(type(languages['af']), dict)
- self.assertEqual(type(languages['ar']), dict)
- self.assertEqual(type(languages['la']), dict)
-
- self.assertIn('name', languages['af'])
- self.assertIn('name', languages['ar'])
- self.assertNotIn('name', languages['la'])
-
- self.assertIn('english_name', languages['af'])
- self.assertIn('english_name', languages['ar'])
- self.assertIn('english_name', languages['la'])
-
- self.assertEqual(languages['af']['name'], 'Afrikaans')
- self.assertEqual(languages['af']['english_name'], 'Afrikaans')
- self.assertEqual(languages['ar']['name'], u'العربية')
- self.assertEqual(languages['ar']['english_name'], 'Arabic')
- self.assertEqual(languages['la']['english_name'], 'Latin')
diff --git a/tests/unit/engines/test_deezer.py b/tests/unit/engines/test_deezer.py
deleted file mode 100644
index 5b9f55c33..000000000
--- a/tests/unit/engines/test_deezer.py
+++ /dev/null
@@ -1,57 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import deezer
-from searx.testing import SearxTestCase
-
-
-class TestDeezerEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- params = deezer.request(query, dicto)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('deezer.com' in params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, deezer.response, None)
- self.assertRaises(AttributeError, deezer.response, [])
- self.assertRaises(AttributeError, deezer.response, '')
- self.assertRaises(AttributeError, deezer.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(deezer.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(deezer.response(response), [])
-
- json = r"""
- {"data":[
- {"id":100, "title":"Title of track",
- "link":"https:\/\/www.deezer.com\/track\/1094042","duration":232,
- "artist":{"id":200,"name":"Artist Name",
- "link":"https:\/\/www.deezer.com\/artist\/1217","type":"artist"},
- "album":{"id":118106,"title":"Album Title","type":"album"},"type":"track"}
- ]}
- """
- response = mock.Mock(text=json)
- results = deezer.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Title of track')
- self.assertEqual(results[0]['url'], 'https://www.deezer.com/track/1094042')
- self.assertEqual(results[0]['content'], 'Artist Name - Album Title - Title of track')
- self.assertTrue('100' in results[0]['embedded'])
-
- json = r"""
- {"data":[
- {"id":200,"name":"Artist Name",
- "link":"https:\/\/www.deezer.com\/artist\/1217","type":"artist"}
- ]}
- """
- response = mock.Mock(text=json)
- results = deezer.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_deviantart.py b/tests/unit/engines/test_deviantart.py
deleted file mode 100644
index bd2cf182f..000000000
--- a/tests/unit/engines/test_deviantart.py
+++ /dev/null
@@ -1,95 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import deviantart
-from searx.testing import SearxTestCase
-
-
-class TestDeviantartEngine(SearxTestCase):
-
- def test_request(self):
- dicto = defaultdict(dict)
- query = 'test_query'
- dicto['pageno'] = 0
- dicto['time_range'] = ''
- params = deviantart.request(query, dicto)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('deviantart.com' in params['url'])
-
- def test_no_url_in_request_year_time_range(self):
- dicto = defaultdict(dict)
- query = 'test_query'
- dicto['time_range'] = 'year'
- params = deviantart.request(query, dicto)
- self.assertEqual({}, params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, deviantart.response, None)
- self.assertRaises(AttributeError, deviantart.response, [])
- self.assertRaises(AttributeError, deviantart.response, '')
- self.assertRaises(AttributeError, deviantart.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(deviantart.response(response), [])
-
- response = mock.Mock(status_code=302)
- self.assertEqual(deviantart.response(response), [])
-
- html = """
- <div id="page-1-results" class="page-results results-page-thumb torpedo-container">
- <span class="thumb wide" href="http://amai911.deviantart.com/art/Horse-195212845"
- data-super-full-width="900" data-super-full-height="600">
- <a class="torpedo-thumb-link" href="https://url.of.image">
- <img data-sigil="torpedo-img" src="https://url.of.thumbnail" />
- </a>
- <span class="info"><span class="title-wrap"><span class="title">Title of image</span></span>
- </div>
- """
- response = mock.Mock(text=html)
- results = deviantart.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Title of image')
- self.assertEqual(results[0]['url'], 'https://url.of.image')
- self.assertNotIn('content', results[0])
- self.assertEqual(results[0]['thumbnail_src'], 'https://url.of.thumbnail')
-
- html = """
- <span class="tt-fh-tc" style="width: 202px;">
- <span class="tt-bb" style="width: 202px;">
- </span>
- <span class="shadow">
- <a class="thumb" href="http://url.of.result/2nd.part.of.url"
- title="Behoimi BE Animation Test by test-0, Jan 4,
- 2010 in Digital Art &gt; Animation"> <i></i>
- <img width="200" height="200" alt="Test"
- src="http://url.of.thumbnail" data-src="http://th08.deviantart.net/test.jpg">
- </a>
- </span>
- <!-- ^TTT -->
- </span>
- <span class="details">
- <a href="http://test-0.deviantart.com/art/Test" class="t"
- title="Behoimi BE Animation Test by test-0, Jan 4, 2010">
- <span class="tt-fh-oe">Title of image</span> </a>
- <small>
- <span class="category">
- <span class="age">
- 5 years ago
- </span>
- in <a title="Behoimi BE Animation Test by test-0, Jan 4, 2010"
- href="http://www.deviantart.com/browse/all/digitalart/animation/">Animation</a>
- </span>
- <div class="commentcount">
- <a href="http://test-0.deviantart.com/art/Test#comments">
- <span class="iconcommentsstats"></span>9 Comments</a>
- </div>
- <a class="mlt-link" href="http://www.deviantart.com/morelikethis/149167425">
- <span class="mlt-icon"></span> <span class="mlt-text">More Like This</span> </a>
- </span>
- </small> <!-- TTT$ -->
- """
- response = mock.Mock(text=html)
- results = deviantart.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_digbt.py b/tests/unit/engines/test_digbt.py
deleted file mode 100644
index 31c2ecabb..000000000
--- a/tests/unit/engines/test_digbt.py
+++ /dev/null
@@ -1,61 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import digbt
-from searx.testing import SearxTestCase
-
-
-class TestDigBTEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- params = digbt.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('digbt.org', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, digbt.response, None)
- self.assertRaises(AttributeError, digbt.response, [])
- self.assertRaises(AttributeError, digbt.response, '')
- self.assertRaises(AttributeError, digbt.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(digbt.response(response), [])
-
- html = """
- <table class="table">
- <tr><td class="x-item">
- <div>
- <a title="The Big Bang Theory" class="title" href="/The-Big-Bang-Theory-d2.html">
- The Big <span class="highlight">Bang</span> Theory
- </a>
- <span class="ctime"><span style="color:red;">4 hours ago</span></span>
- </div>
- <div class="files">
- <ul>
- <li>The Big Bang Theory 2.9 GB</li>
- <li>....</li>
- </ul>
- </div>
- <div class="tail">
- Files: 1 Size: 2.9 GB Downloads: 1 Updated: <span style="color:red;">4 hours ago</span>
- &nbsp; &nbsp;
- <a class="title" href="magnet:?xt=urn:btih:a&amp;dn=The+Big+Bang+Theory">
- <span class="glyphicon glyphicon-magnet"></span> magnet-link
- </a>
- &nbsp; &nbsp;
- </div>
- </td></tr>
- </table>
- """
- response = mock.Mock(text=html.encode('utf-8'))
- results = digbt.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'The Big Bang Theory')
- self.assertEqual(results[0]['url'], 'https://digbt.org/The-Big-Bang-Theory-d2.html')
- self.assertEqual(results[0]['content'], 'The Big Bang Theory 2.9 GB ....')
- self.assertEqual(results[0]['filesize'], 3113851289)
- self.assertEqual(results[0]['magnetlink'], 'magnet:?xt=urn:btih:a&dn=The+Big+Bang+Theory')
diff --git a/tests/unit/engines/test_digg.py b/tests/unit/engines/test_digg.py
deleted file mode 100644
index 6e7c9cc99..000000000
--- a/tests/unit/engines/test_digg.py
+++ /dev/null
@@ -1,101 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import digg
-from searx.testing import SearxTestCase
-
-
-class TestDiggEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- params = digg.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('digg.com', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, digg.response, None)
- self.assertRaises(AttributeError, digg.response, [])
- self.assertRaises(AttributeError, digg.response, '')
- self.assertRaises(AttributeError, digg.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(digg.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(digg.response(response), [])
-
- json = """
- {
- "status": "ok",
- "num": 10,
- "next_position": 20,
- "html": "<article itemscope itemtype=\\"http://schema.org/Article\\"
- class=\\"story-container digg-story-el hentry entry story-1sRANah col-1\\"
- data-content-id=\\"1sRANah\\" data-contenturl=\\"http://url.of.link\\"
- data-position=\\"0\\" data-diggs=\\"24\\" data-tweets=\\"69\\"
- data-digg-score=\\"1190\\"> <div class=\\"story-image story-image-thumb\\">
- <a data-position=\\"0\\" data-content-id=\\"1sRANah\\"
- class=\\"story-link\\" href=\\"http://www.thedailybeast.com/\\"
- target=\\"_blank\\"><img class=\\"story-image-img\\"
- src=\\"http://url.of.image.jpeg\\" width=\\"312\\" height=\\"170\\"
- alt=\\"\\" /> </a> </div> <div class=\\"story-content\\"><header
- class=\\"story-header\\"> <div itemprop=\\"alternativeHeadline\\"
- class=\\"story-kicker\\" >Kicker</div> <h2 itemprop=\\"headline\\"
- class=\\"story-title entry-title\\"><a class=\\"story-title-link story-link\\"
- rel=\\"bookmark\\" itemprop=\\"url\\" href=\\"http://www.thedailybeast.com/\\"
- target=\\"_blank\\">Title of article</h2> <div class=\\"story-meta\\">
- <div class=\\"story-score \\">
- <div class=\\"story-score-diggscore diggscore-1sRANah\\">1190</div>
- <div class=\\"story-score-details\\"> <div class=\\"arrow\\"></div>
- <ul class=\\"story-score-details-list\\"> <li
- class=\\"story-score-detail story-score-diggs\\"><span
- class=\\"label\\">Diggs:</span> <span class=\\"count diggs-1sRANah\\">24</span>
- </li> <li class=\\"story-score-detail story-score-twitter\\"><span
- class=\\"label\\">Tweets:</span> <span class=\\"count tweets-1sRANah\\">69</span>
- </li> <li class=\\"story-score-detail story-score-facebook\\"><span
- class=\\"label\\">Facebook Shares:</span> <span
- class=\\"count fb_shares-1sRANah\\">1097</span></li> </ul> </div> </div>
- <span class=\\"story-meta-item story-source\\"> <a
- itemprop=\\"publisher copyrightHolder sourceOrganization provider\\"
- class=\\"story-meta-item-link story-source-link\\"
- href=\\"/source/thedailybeast.com\\">The Daily Beast </a> </span>
- <span class=\\"story-meta-item story-tag first-tag\\"> <a
- itemprop=\\"keywords\\" rel=\\"tag\\"
- class=\\"story-meta-item-link story-tag-link\\" href=\\"/tag/news\\">News</a>
- </span> <abbr class=\\"published story-meta-item story-timestamp\\"
- title=\\"2014-10-18 14:53:45\\"> <time datetime=\\"2014-10-18 14:53:45\\">18 Oct 2014</time>
- </abbr> </div> </header> </div> <ul class=\\"story-actions\\"> <li
- class=\\"story-action story-action-digg btn-story-action-container\\">
- <a class=\\"target digg-1sRANah\\" href=\\"#\\">Digg</a></li> <li
- class=\\"story-action story-action-save btn-story-action-container\\">
- <a class=\\"target save-1sRANah\\" href=\\"#\\">Save</a></li> <li
- class=\\"story-action story-action-share\\"><a
- class=\\"target share-facebook\\" href=\\"https://www.facebook.com/\\">Facebook</a></li>
- <li class=\\"story-action story-action-share\\"><a class=\\"target share-twitter\\"
- href=\\"https://twitter.com/\\">Twitter</a></li> </ul> </article>"
- }
- """
- json = json.replace('\r\n', '').replace('\n', '').replace('\r', '')
- response = mock.Mock(text=json)
- results = digg.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Title of article')
- self.assertEqual(results[0]['url'], 'http://url.of.link')
- self.assertEqual(results[0]['thumbnail'], 'http://url.of.image.jpeg')
- self.assertEqual(results[0]['content'], '')
-
- json = """
- {
- "status": "error",
- "num": 10,
- "next_position": 20
- }
- """
- response = mock.Mock(text=json)
- results = digg.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_doku.py b/tests/unit/engines/test_doku.py
deleted file mode 100644
index 22ddb7a7f..000000000
--- a/tests/unit/engines/test_doku.py
+++ /dev/null
@@ -1,79 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import doku
-from searx.testing import SearxTestCase
-
-
-class TestDokuEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- params = doku.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, doku.response, None)
- self.assertRaises(AttributeError, doku.response, [])
- self.assertRaises(AttributeError, doku.response, '')
- self.assertRaises(AttributeError, doku.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(doku.response(response), [])
-
- html = u"""
- <div class="search_quickresult">
- <h3>Pages trouvées :</h3>
- <ul class="search_quickhits">
- <li> <a href="/xfconf-query" class="wikilink1" title="xfconf-query">xfconf-query</a></li>
- </ul>
- <div class="clearer"></div>
- </div>
- """
- response = mock.Mock(text=html)
- results = doku.response(response)
- expected = [{'content': '', 'title': 'xfconf-query', 'url': 'http://localhost:8090/xfconf-query'}]
- self.assertEqual(doku.response(response), expected)
-
- html = u"""
- <dl class="search_results">
- <dt><a href="/xvnc?s[]=query" class="wikilink1" title="xvnc">xvnc</a>: 40 Occurrences trouvées</dt>
- <dd>er = /usr/bin/Xvnc
- server_args = -inetd -<strong class="search_hit">query</strong> localhost -geometry 640x480 ... er = /usr/bin/Xvnc
- server_args = -inetd -<strong class="search_hit">query</strong> localhost -geometry 800x600 ... er = /usr/bin/Xvnc
- server_args = -inetd -<strong class="search_hit">query</strong> localhost -geometry 1024x768 ... er = /usr/bin/Xvnc
- server_args = -inetd -<strong class="search_hit">query</strong> localhost -geometry 1280x1024 -depth 8 -Sec</dd>
- <dt><a href="/postfix_mysql_tls_sasl_1404?s[]=query"
- class="wikilink1"
- title="postfix_mysql_tls_sasl_1404">postfix_mysql_tls_sasl_1404</a>: 14 Occurrences trouvées</dt>
- <dd>tdepasse
- hosts = 127.0.0.1
- dbname = postfix
- <strong class="search_hit">query</strong> = SELECT goto FROM alias WHERE address='%s' AND a... tdepasse
- hosts = 127.0.0.1
- dbname = postfix
- <strong class="search_hit">query</strong> = SELECT domain FROM domain WHERE domain='%s'
- #optional <strong class="search_hit">query</strong> to use when relaying for backup MX
- #<strong class="search_hit">query</strong> = SELECT domain FROM domain WHERE domain='%s' and backupmx =</dd>
- <dt><a href="/bind9?s[]=query" class="wikilink1" title="bind9">bind9</a>: 12 Occurrences trouvées</dt>
- <dd> printcmd
-;; Got answer:
-;; -&gt;&gt;HEADER&lt;&lt;- opcode: <strong class="search_hit">QUERY</strong>, status: NOERROR, id: 13427
-;; flags: qr aa rd ra; <strong class="search_hit">QUERY</strong>: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
-
-[...]
-
-;; <strong class="search_hit">Query</strong> time: 1 msec
-;; SERVER: 127.0.0.1#53(127.0.0.1)
-;... par la requête (<strong class="search_hit">Query</strong> time) , entre la première et la deuxième requête.</dd>
- </dl>
- """
- response = mock.Mock(text=html)
- results = doku.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 3)
- self.assertEqual(results[0]['title'], 'xvnc')
-# FIXME self.assertEqual(results[0]['url'], u'http://this.should.be.the.link/ű')
-# FIXME self.assertEqual(results[0]['content'], 'This should be the content.')
diff --git a/tests/unit/engines/test_duckduckgo.py b/tests/unit/engines/test_duckduckgo.py
deleted file mode 100644
index eb316a404..000000000
--- a/tests/unit/engines/test_duckduckgo.py
+++ /dev/null
@@ -1,106 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import load_engine, duckduckgo
-from searx.testing import SearxTestCase
-
-
-class TestDuckduckgoEngine(SearxTestCase):
-
- def test_request(self):
- duckduckgo = load_engine({'engine': 'duckduckgo', 'name': 'duckduckgo'})
-
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['time_range'] = ''
-
- dicto['language'] = 'de-CH'
- params = duckduckgo.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('duckduckgo.com', params['url'])
- self.assertIn('ch-de', params['url'])
- self.assertIn('s=0', params['url'])
-
- # when ddg uses non standard codes
- dicto['language'] = 'zh-HK'
- params = duckduckgo.request(query, dicto)
- self.assertIn('hk-tzh', params['url'])
-
- dicto['language'] = 'en-GB'
- params = duckduckgo.request(query, dicto)
- self.assertIn('uk-en', params['url'])
-
- # no country given
- dicto['language'] = 'en'
- params = duckduckgo.request(query, dicto)
- self.assertIn('us-en', params['url'])
-
- def test_no_url_in_request_year_time_range(self):
- dicto = defaultdict(dict)
- query = 'test_query'
- dicto['time_range'] = 'year'
- params = duckduckgo.request(query, dicto)
- self.assertEqual({}, params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, duckduckgo.response, None)
- self.assertRaises(AttributeError, duckduckgo.response, [])
- self.assertRaises(AttributeError, duckduckgo.response, '')
- self.assertRaises(AttributeError, duckduckgo.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(duckduckgo.response(response), [])
-
- html = u"""
- <div class="result results_links results_links_deep web-result result--no-result">
- <div class="links_main links_deep result__body">
- <h2 class="result__title">
- </h2>
- <div class="no-results">No results</div>
- <div class="result__extras">
- </div>
- </div>
- </div>
- """
- response = mock.Mock(text=html)
- results = duckduckgo.response(response)
- self.assertEqual(duckduckgo.response(response), [])
-
- html = u"""
- <div class="result results_links results_links_deep web-result ">
- <div class="links_main links_deep result__body">
- <h2 class="result__title">
- <a rel="nofollow" class="result__a" href="http://this.should.be.the.link/ű">
- This <b>is</b> <b>the</b> title
- </a>
- </h2>
- <a class="result__snippet" href="http://this.should.be.the.link/ű">
- <b>This</b> should be the content.
- </a>
- <div class="result__extras">
- </div>
- </div>
- </div>
- """
- response = mock.Mock(text=html)
- results = duckduckgo.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This is the title')
- self.assertEqual(results[0]['url'], u'http://this.should.be.the.link/ű')
- self.assertEqual(results[0]['content'], 'This should be the content.')
-
- def test_fetch_supported_languages(self):
- js = """some code...regions:{
- "wt-wt":"All Results","ar-es":"Argentina","au-en":"Australia","at-de":"Austria","be-fr":"Belgium (fr)"
- }some more code..."""
- response = mock.Mock(text=js)
- languages = list(duckduckgo._fetch_supported_languages(response))
- self.assertEqual(len(languages), 5)
- self.assertIn('wt-WT', languages)
- self.assertIn('es-AR', languages)
- self.assertIn('en-AU', languages)
- self.assertIn('de-AT', languages)
- self.assertIn('fr-BE', languages)
diff --git a/tests/unit/engines/test_duckduckgo_definitions.py b/tests/unit/engines/test_duckduckgo_definitions.py
deleted file mode 100644
index 37587ed8d..000000000
--- a/tests/unit/engines/test_duckduckgo_definitions.py
+++ /dev/null
@@ -1,255 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import duckduckgo_definitions
-from searx.testing import SearxTestCase
-
-
-class TestDDGDefinitionsEngine(SearxTestCase):
-
- def test_result_to_text(self):
- url = ''
- text = 'Text'
- html_result = 'Html'
- result = duckduckgo_definitions.result_to_text(url, text, html_result)
- self.assertEqual(result, text)
-
- html_result = '<a href="url">Text in link</a>'
- result = duckduckgo_definitions.result_to_text(url, text, html_result)
- self.assertEqual(result, 'Text in link')
-
- def test_request(self):
- duckduckgo_definitions.supported_languages = ['en-US', 'es-ES']
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['language'] = 'es'
- params = duckduckgo_definitions.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('duckduckgo.com', params['url'])
- self.assertIn('headers', params)
- self.assertIn('Accept-Language', params['headers'])
- self.assertIn('es', params['headers']['Accept-Language'])
-
- def test_response(self):
- self.assertRaises(AttributeError, duckduckgo_definitions.response, None)
- self.assertRaises(AttributeError, duckduckgo_definitions.response, [])
- self.assertRaises(AttributeError, duckduckgo_definitions.response, '')
- self.assertRaises(AttributeError, duckduckgo_definitions.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(duckduckgo_definitions.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(duckduckgo_definitions.response(response), [])
-
- json = """
- {
- "DefinitionSource": "definition source",
- "Heading": "heading",
- "ImageWidth": 0,
- "RelatedTopics": [
- {
- "Result": "Top-level domains",
- "Icon": {
- "URL": "",
- "Height": "",
- "Width": ""
- },
- "FirstURL": "https://first.url",
- "Text": "text"
- },
- {
- "Topics": [
- {
- "Result": "result topic",
- "Icon": {
- "URL": "",
- "Height": "",
- "Width": ""
- },
- "FirstURL": "https://duckduckgo.com/?q=2%2F2",
- "Text": "result topic text"
- }
- ],
- "Name": "name"
- }
- ],
- "Entity": "Entity",
- "Type": "A",
- "Redirect": "",
- "DefinitionURL": "http://definition.url",
- "AbstractURL": "https://abstract.url",
- "Definition": "this is the definition",
- "AbstractSource": "abstract source",
- "Infobox": {
- "content": [
- {
- "data_type": "string",
- "value": "1999",
- "label": "Introduced",
- "wiki_order": 0
- }
- ],
- "meta": [
- {
- "data_type": "string",
- "value": ".test",
- "label": "article_title"
- }
- ]
- },
- "Image": "image.png",
- "ImageIsLogo": 0,
- "Abstract": "abstract",
- "AbstractText": "abstract text",
- "AnswerType": "",
- "ImageHeight": 0,
- "Results": [{
- "Result" : "result title",
- "Icon" : {
- "URL" : "result url",
- "Height" : 16,
- "Width" : 16
- },
- "FirstURL" : "result first url",
- "Text" : "result text"
- }
- ],
- "Answer": "answer"
- }
- """
- response = mock.Mock(text=json)
- results = duckduckgo_definitions.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 4)
- self.assertEqual(results[0]['answer'], 'answer')
- self.assertEqual(results[1]['title'], 'heading')
- self.assertEqual(results[1]['url'], 'result first url')
- self.assertEqual(results[2]['suggestion'], 'text')
- self.assertEqual(results[3]['infobox'], 'heading')
- self.assertEqual(results[3]['id'], 'https://definition.url')
- self.assertEqual(results[3]['entity'], 'Entity')
- self.assertIn('abstract', results[3]['content'])
- self.assertIn('this is the definition', results[3]['content'])
- self.assertEqual(results[3]['img_src'], 'image.png')
- self.assertIn('Introduced', results[3]['attributes'][0]['label'])
- self.assertIn('1999', results[3]['attributes'][0]['value'])
- self.assertIn({'url': 'https://abstract.url', 'title': 'abstract source'}, results[3]['urls'])
- self.assertIn({'url': 'http://definition.url', 'title': 'definition source'}, results[3]['urls'])
- self.assertIn({'name': 'name', 'suggestions': ['result topic text']}, results[3]['relatedTopics'])
-
- json = """
- {
- "DefinitionSource": "definition source",
- "Heading": "heading",
- "ImageWidth": 0,
- "RelatedTopics": [],
- "Entity": "Entity",
- "Type": "A",
- "Redirect": "",
- "DefinitionURL": "",
- "AbstractURL": "https://abstract.url",
- "Definition": "",
- "AbstractSource": "abstract source",
- "Image": "",
- "ImageIsLogo": 0,
- "Abstract": "",
- "AbstractText": "abstract text",
- "AnswerType": "",
- "ImageHeight": 0,
- "Results": [],
- "Answer": ""
- }
- """
- response = mock.Mock(text=json)
- results = duckduckgo_definitions.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['url'], 'https://abstract.url')
- self.assertEqual(results[0]['title'], 'heading')
- self.assertEqual(results[0]['content'], '')
-
- json = """
- {
- "DefinitionSource": "definition source",
- "Heading": "heading",
- "ImageWidth": 0,
- "RelatedTopics": [
- {
- "Result": "Top-level domains",
- "Icon": {
- "URL": "",
- "Height": "",
- "Width": ""
- },
- "FirstURL": "https://first.url",
- "Text": "heading"
- },
- {
- "Name": "name"
- },
- {
- "Topics": [
- {
- "Result": "result topic",
- "Icon": {
- "URL": "",
- "Height": "",
- "Width": ""
- },
- "FirstURL": "https://duckduckgo.com/?q=2%2F2",
- "Text": "heading"
- }
- ],
- "Name": "name"
- }
- ],
- "Entity": "Entity",
- "Type": "A",
- "Redirect": "",
- "DefinitionURL": "http://definition.url",
- "AbstractURL": "https://abstract.url",
- "Definition": "this is the definition",
- "AbstractSource": "abstract source",
- "Infobox": {
- "meta": [
- {
- "data_type": "string",
- "value": ".test",
- "label": "article_title"
- }
- ]
- },
- "Image": "image.png",
- "ImageIsLogo": 0,
- "Abstract": "abstract",
- "AbstractText": "abstract text",
- "AnswerType": "",
- "ImageHeight": 0,
- "Results": [{
- "Result" : "result title",
- "Icon" : {
- "URL" : "result url",
- "Height" : 16,
- "Width" : 16
- },
- "Text" : "result text"
- }
- ],
- "Answer": ""
- }
- """
- response = mock.Mock(text=json)
- results = duckduckgo_definitions.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['infobox'], 'heading')
- self.assertEqual(results[0]['id'], 'https://definition.url')
- self.assertEqual(results[0]['entity'], 'Entity')
- self.assertIn('abstract', results[0]['content'])
- self.assertIn('this is the definition', results[0]['content'])
- self.assertEqual(results[0]['img_src'], 'image.png')
- self.assertIn({'url': 'https://abstract.url', 'title': 'abstract source'}, results[0]['urls'])
- self.assertIn({'url': 'http://definition.url', 'title': 'definition source'}, results[0]['urls'])
- self.assertIn({'name': 'name', 'suggestions': []}, results[0]['relatedTopics'])
diff --git a/tests/unit/engines/test_duckduckgo_images.py b/tests/unit/engines/test_duckduckgo_images.py
deleted file mode 100644
index 0d152bec1..000000000
--- a/tests/unit/engines/test_duckduckgo_images.py
+++ /dev/null
@@ -1,75 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import duckduckgo_images
-from searx.testing import SearxTestCase
-
-
-class TestDuckduckgoImagesEngine(SearxTestCase):
-
- def test_request(self):
- duckduckgo_images.supported_languages = ['de-CH', 'en-US']
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['is_test'] = True
- dicto['pageno'] = 1
- dicto['safesearch'] = 0
- dicto['language'] = 'all'
- params = duckduckgo_images.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('duckduckgo.com', params['url'])
- self.assertIn('s=0', params['url'])
- self.assertIn('p=-1', params['url'])
- self.assertIn('vqd=12345', params['url'])
-
- # test paging, safe search and language
- dicto['pageno'] = 2
- dicto['safesearch'] = 2
- dicto['language'] = 'de'
- params = duckduckgo_images.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('s=50', params['url'])
- self.assertIn('p=1', params['url'])
- self.assertIn('ch-de', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, duckduckgo_images.response, None)
- self.assertRaises(AttributeError, duckduckgo_images.response, [])
- self.assertRaises(AttributeError, duckduckgo_images.response, '')
- self.assertRaises(AttributeError, duckduckgo_images.response, '[]')
-
- response = mock.Mock(text='If this error persists, please let us know: ops@duckduckgo.com')
- self.assertRaises(Exception, duckduckgo_images.response, response)
-
- json = u"""
- {
- "query": "test_query",
- "results": [
- {
- "title": "Result 1",
- "url": "https://site1.url",
- "thumbnail": "https://thumb1.nail",
- "image": "https://image1"
- },
- {
- "title": "Result 2",
- "url": "https://site2.url",
- "thumbnail": "https://thumb2.nail",
- "image": "https://image2"
- }
- ]
- }
- """
- response = mock.Mock(text=json)
- results = duckduckgo_images.response(response)
- self.assertEqual(len(results), 2)
- self.assertEqual(results[0]['title'], 'Result 1')
- self.assertEqual(results[0]['url'], 'https://site1.url')
- self.assertEqual(results[0]['thumbnail_src'], 'https://thumb1.nail')
- self.assertEqual(results[0]['img_src'], 'https://image1')
- self.assertEqual(results[1]['title'], 'Result 2')
- self.assertEqual(results[1]['url'], 'https://site2.url')
- self.assertEqual(results[1]['thumbnail_src'], 'https://thumb2.nail')
- self.assertEqual(results[1]['img_src'], 'https://image2')
diff --git a/tests/unit/engines/test_duden.py b/tests/unit/engines/test_duden.py
deleted file mode 100644
index d9bbfef8b..000000000
--- a/tests/unit/engines/test_duden.py
+++ /dev/null
@@ -1,41 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import duden
-from searx.testing import SearxTestCase
-from datetime import datetime
-
-
-class TestDudenEngine(SearxTestCase):
-
- def test_request(self):
- query = 'Haus'
- dic = defaultdict(dict)
- dic['pageno'] = 1
- params = duden.request(query, dic)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('duden.de' in params['url'])
-
- def test_response(self):
- resp = mock.Mock(text='<html></html>')
- self.assertEqual(duden.response(resp), [])
-
- html = """
- <section class="wide">
- <h2><a href="https://this.is.the.url/" class="hidden-link"><strong>This is the title</strong> also here</a></h2>
- <p>This is the <strong>content</strong></p>
- <a href="https://this.is.the.url/">Zum vollst&auml;ndigen Artikel</a>
- </section>
- """
-
- resp = mock.Mock(text=html)
- results = duden.response(resp)
-
- self.assertEqual(len(results), 1)
- self.assertEqual(type(results), list)
-
- # testing result (dictionary entry)
- r = results[0]
- self.assertEqual(r['url'], 'https://this.is.the.url/')
- self.assertEqual(r['title'], 'This is the title also here')
- self.assertEqual(r['content'], 'This is the content')
diff --git a/tests/unit/engines/test_dummy.py b/tests/unit/engines/test_dummy.py
deleted file mode 100644
index 9399beaaf..000000000
--- a/tests/unit/engines/test_dummy.py
+++ /dev/null
@@ -1,26 +0,0 @@
-from searx.engines import dummy
-from searx.testing import SearxTestCase
-
-
-class TestDummyEngine(SearxTestCase):
-
- def test_request(self):
- test_params = [
- [1, 2, 3],
- ['a'],
- [],
- 1
- ]
- for params in test_params:
- self.assertEqual(dummy.request(None, params), params)
-
- def test_response(self):
- responses = [
- None,
- [],
- True,
- dict(),
- tuple()
- ]
- for response in responses:
- self.assertEqual(dummy.response(response), [])
diff --git a/tests/unit/engines/test_faroo.py b/tests/unit/engines/test_faroo.py
deleted file mode 100644
index 1bd9f51c3..000000000
--- a/tests/unit/engines/test_faroo.py
+++ /dev/null
@@ -1,113 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import faroo
-from searx.testing import SearxTestCase
-
-
-class TestFarooEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['language'] = 'fr-FR'
- dicto['category'] = 'general'
- params = faroo.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('faroo.com', params['url'])
- self.assertIn('en', params['url'])
- self.assertIn('web', params['url'])
-
- dicto['language'] = 'all'
- params = faroo.request(query, dicto)
- self.assertIn('en', params['url'])
-
- dicto['language'] = 'de-DE'
- params = faroo.request(query, dicto)
- self.assertIn('de', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, faroo.response, None)
- self.assertRaises(AttributeError, faroo.response, [])
- self.assertRaises(AttributeError, faroo.response, '')
- self.assertRaises(AttributeError, faroo.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(faroo.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(faroo.response(response), [])
-
- response = mock.Mock(text='{"data": []}', status_code=429)
- self.assertRaises(Exception, faroo.response, response)
-
- json = """
- {
- "results": [
- {
- "title": "This is the title",
- "kwic": "This is the content",
- "content": "",
- "url": "http://this.is.the.url/",
- "iurl": "",
- "domain": "css3test.com",
- "author": "Jim Dalrymple",
- "news": true,
- "votes": "10",
- "date": 1360622563000,
- "related": []
- },
- {
- "title": "This is the title2",
- "kwic": "This is the content2",
- "content": "",
- "url": "http://this.is.the.url2/",
- "iurl": "",
- "domain": "css3test.com",
- "author": "Jim Dalrymple",
- "news": false,
- "votes": "10",
- "related": []
- },
- {
- "title": "This is the title3",
- "kwic": "This is the content3",
- "content": "",
- "url": "http://this.is.the.url3/",
- "iurl": "http://upload.wikimedia.org/optimized.jpg",
- "domain": "css3test.com",
- "author": "Jim Dalrymple",
- "news": false,
- "votes": "10",
- "related": []
- }
- ],
- "query": "test",
- "suggestions": [],
- "count": 100,
- "start": 1,
- "length": 10,
- "time": "15"
- }
- """
- response = mock.Mock(text=json)
- results = faroo.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 3)
- self.assertEqual(results[0]['title'], 'This is the title')
- self.assertEqual(results[0]['url'], 'http://this.is.the.url/')
- self.assertEqual(results[0]['content'], 'This is the content')
- self.assertEqual(results[1]['title'], 'This is the title2')
- self.assertEqual(results[1]['url'], 'http://this.is.the.url2/')
- self.assertEqual(results[1]['content'], 'This is the content2')
- self.assertEqual(results[2]['thumbnail'], 'http://upload.wikimedia.org/optimized.jpg')
-
- json = """
- {}
- """
- response = mock.Mock(text=json)
- results = faroo.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_fdroid.py b/tests/unit/engines/test_fdroid.py
deleted file mode 100644
index d75f4f0b4..000000000
--- a/tests/unit/engines/test_fdroid.py
+++ /dev/null
@@ -1,49 +0,0 @@
-import mock
-from collections import defaultdict
-from searx.engines import fdroid
-from searx.testing import SearxTestCase
-
-
-class TestFdroidEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dic = defaultdict(dict)
- dic['pageno'] = 1
- params = fdroid.request(query, dic)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('f-droid.org' in params['url'])
-
- def test_response(self):
- resp = mock.Mock(text='<html></html>')
- self.assertEqual(fdroid.response(resp), [])
-
- html = """
- <a href="https://google.com/qwerty">
- <div id="appheader">
- <div style="float:left;padding-right:10px;">
- <img src="http://example.com/image.png"
- style="width:48px;border:none;">
- </div>
- <div style="float:right;">
- <p>Details...</p>
- </div>
- <p style="color:#000000;">
- <span style="font-size:20px;">Sample title</span>
- <br>
- Sample content
- </p>
- </div>
- </a>
- """
-
- resp = mock.Mock(text=html)
- results = fdroid.response(resp)
-
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['url'], 'https://google.com/qwerty')
- self.assertEqual(results[0]['title'], 'Sample title')
- self.assertEqual(results[0]['content'], 'Sample content')
- self.assertEqual(results[0]['img_src'], 'http://example.com/image.png')
diff --git a/tests/unit/engines/test_flickr.py b/tests/unit/engines/test_flickr.py
deleted file mode 100644
index be97647ce..000000000
--- a/tests/unit/engines/test_flickr.py
+++ /dev/null
@@ -1,142 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import flickr
-from searx.testing import SearxTestCase
-
-
-class TestFlickrEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- params = flickr.request(query, dicto)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('flickr.com' in params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, flickr.response, None)
- self.assertRaises(AttributeError, flickr.response, [])
- self.assertRaises(AttributeError, flickr.response, '')
- self.assertRaises(AttributeError, flickr.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(flickr.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(flickr.response(response), [])
-
- json = r"""
- { "photos": { "page": 1, "pages": "41001", "perpage": 100, "total": "4100032",
- "photo": [
- { "id": "15751017054", "owner": "66847915@N08",
- "secret": "69c22afc40", "server": "7285", "farm": 8,
- "title": "Photo title", "ispublic": 1,
- "isfriend": 0, "isfamily": 0,
- "description": { "_content": "Description" },
- "ownername": "Owner",
- "url_o": "https:\/\/farm8.staticflickr.com\/7285\/15751017054_9178e0f963_o.jpg",
- "height_o": "2100", "width_o": "2653",
- "url_n": "https:\/\/farm8.staticflickr.com\/7285\/15751017054_69c22afc40_n.jpg",
- "height_n": "253", "width_n": "320",
- "url_z": "https:\/\/farm8.staticflickr.com\/7285\/15751017054_69c22afc40_z.jpg",
- "height_z": "507", "width_z": "640" }
- ] }, "stat": "ok" }
- """
- response = mock.Mock(text=json)
- results = flickr.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Photo title')
- self.assertEqual(results[0]['url'], 'https://www.flickr.com/photos/66847915@N08/15751017054')
- self.assertTrue('o.jpg' in results[0]['img_src'])
- self.assertTrue('n.jpg' in results[0]['thumbnail_src'])
- self.assertTrue('Owner' in results[0]['author'])
- self.assertTrue('Description' in results[0]['content'])
-
- json = r"""
- { "photos": { "page": 1, "pages": "41001", "perpage": 100, "total": "4100032",
- "photo": [
- { "id": "15751017054", "owner": "66847915@N08",
- "secret": "69c22afc40", "server": "7285", "farm": 8,
- "title": "Photo title", "ispublic": 1,
- "isfriend": 0, "isfamily": 0,
- "description": { "_content": "Description" },
- "ownername": "Owner",
- "url_z": "https:\/\/farm8.staticflickr.com\/7285\/15751017054_69c22afc40_z.jpg",
- "height_z": "507", "width_z": "640" }
- ] }, "stat": "ok" }
- """
- response = mock.Mock(text=json)
- results = flickr.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Photo title')
- self.assertEqual(results[0]['url'], 'https://www.flickr.com/photos/66847915@N08/15751017054')
- self.assertTrue('z.jpg' in results[0]['img_src'])
- self.assertTrue('z.jpg' in results[0]['thumbnail_src'])
- self.assertTrue('Owner' in results[0]['author'])
- self.assertTrue('Description' in results[0]['content'])
-
- json = r"""
- { "photos": { "page": 1, "pages": "41001", "perpage": 100, "total": "4100032",
- "photo": [
- { "id": "15751017054", "owner": "66847915@N08",
- "secret": "69c22afc40", "server": "7285", "farm": 8,
- "title": "Photo title", "ispublic": 1,
- "isfriend": 0, "isfamily": 0,
- "description": { "_content": "Description" },
- "ownername": "Owner",
- "url_o": "https:\/\/farm8.staticflickr.com\/7285\/15751017054_9178e0f963_o.jpg",
- "height_o": "2100", "width_o": "2653" }
- ] }, "stat": "ok" }
- """
- response = mock.Mock(text=json)
- results = flickr.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Photo title')
- self.assertEqual(results[0]['url'], 'https://www.flickr.com/photos/66847915@N08/15751017054')
- self.assertTrue('o.jpg' in results[0]['img_src'])
- self.assertTrue('o.jpg' in results[0]['thumbnail_src'])
- self.assertTrue('Owner' in results[0]['author'])
- self.assertTrue('Description' in results[0]['content'])
-
- json = r"""
- { "photos": { "page": 1, "pages": "41001", "perpage": 100, "total": "4100032",
- "photo": [
- { "id": "15751017054", "owner": "66847915@N08",
- "secret": "69c22afc40", "server": "7285", "farm": 8,
- "title": "Photo title", "ispublic": 1,
- "isfriend": 0, "isfamily": 0,
- "description": { "_content": "Description" },
- "ownername": "Owner",
- "url_n": "https:\/\/farm8.staticflickr.com\/7285\/15751017054_69c22afc40_n.jpg",
- "height_n": "253", "width_n": "320" }
- ] }, "stat": "ok" }
- """
- response = mock.Mock(text=json)
- results = flickr.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- json = """
- { "photos": { "page": 1, "pages": "41001", "perpage": 100, "total": "4100032",
- "toto": [] }, "stat": "ok" }
- """
- response = mock.Mock(text=json)
- results = flickr.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- json = r"""
- {"toto":[
- {"id":200,"name":"Artist Name",
- "link":"http:\/\/www.flickr.com\/artist\/1217","type":"artist"}
- ]}
- """
- response = mock.Mock(text=json)
- results = flickr.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_flickr_noapi.py b/tests/unit/engines/test_flickr_noapi.py
deleted file mode 100644
index 5f8b069e3..000000000
--- a/tests/unit/engines/test_flickr_noapi.py
+++ /dev/null
@@ -1,329 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import flickr_noapi
-from searx.testing import SearxTestCase
-
-
-class TestFlickrNoapiEngine(SearxTestCase):
-
- def test_build_flickr_url(self):
- url = flickr_noapi.build_flickr_url("uid", "pid")
- self.assertIn("uid", url)
- self.assertIn("pid", url)
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['time_range'] = ''
- params = flickr_noapi.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('flickr.com', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, flickr_noapi.response, None)
- self.assertRaises(AttributeError, flickr_noapi.response, [])
- self.assertRaises(AttributeError, flickr_noapi.response, '')
- self.assertRaises(AttributeError, flickr_noapi.response, '[]')
-
- response = mock.Mock(text='"search-photos-lite-models","photos":{},"totalItems":')
- self.assertEqual(flickr_noapi.response(response), [])
-
- response = mock.Mock(text='search-photos-lite-models","photos":{"data": []},"totalItems":')
- self.assertEqual(flickr_noapi.response(response), [])
-
- # everthing is ok test
- json = """
- "search-photos-lite-models","photos":
- {
- "_data": [
- {
- "_flickrModelRegistry": "photo-lite-models",
- "title": "This is the title",
- "username": "Owner",
- "pathAlias": "klink692",
- "realname": "Owner",
- "license": 0,
- "ownerNsid": "59729010@N00",
- "canComment": false,
- "commentCount": 14,
- "faveCount": 21,
- "id": "14001294434",
- "sizes": {
- "c": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_c.jpg",
- "width": 541,
- "height": 800,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_c.jpg",
- "key": "c"
- },
- "h": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_761d32237a_h.jpg",
- "width": 1081,
- "height": 1600,
- "url": "//c4.staticflickr.com/8/7246/14001294434_761d32237a_h.jpg",
- "key": "h"
- },
- "k": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_f145a2c11a_k.jpg",
- "width": 1383,
- "height": 2048,
- "url": "//c4.staticflickr.com/8/7246/14001294434_f145a2c11a_k.jpg",
- "key": "k"
- },
- "l": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_b.jpg",
- "width": 692,
- "height": 1024,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_b.jpg",
- "key": "l"
- },
- "m": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777.jpg",
- "width": 338,
- "height": 500,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777.jpg",
- "key": "m"
- },
- "n": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_n.jpg",
- "width": 216,
- "height": 320,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_n.jpg",
- "key": "n"
- },
- "q": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_q.jpg",
- "width": 150,
- "height": 150,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_q.jpg",
- "key": "q"
- },
- "s": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_m.jpg",
- "width": 162,
- "height": 240,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_m.jpg",
- "key": "s"
- },
- "sq": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_s.jpg",
- "width": 75,
- "height": 75,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_s.jpg",
- "key": "sq"
- },
- "t": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_t.jpg",
- "width": 68,
- "height": 100,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_t.jpg",
- "key": "t"
- },
- "z": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_z.jpg",
- "width": 433,
- "height": 640,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_z.jpg",
- "key": "z"
- }
- }
- }
- ],
- "fetchedStart": true,
- "fetchedEnd": false,
- "totalItems": "4386039"
- },"totalItems":
- """
- json = json.replace('\r\n', '').replace('\n', '').replace('\r', '')
- response = mock.Mock(text=json)
- results = flickr_noapi.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This is the title')
- self.assertEqual(results[0]['url'], 'https://www.flickr.com/photos/59729010@N00/14001294434')
- self.assertIn('k.jpg', results[0]['img_src'])
- self.assertIn('n.jpg', results[0]['thumbnail_src'])
- self.assertIn('Owner', results[0]['author'])
-
- # no n size, only the z size
- json = """
- "search-photos-lite-models","photos":
- {
- "_data": [
- {
- "_flickrModelRegistry": "photo-lite-models",
- "title": "This is the title",
- "username": "Owner",
- "pathAlias": "klink692",
- "realname": "Owner",
- "license": 0,
- "ownerNsid": "59729010@N00",
- "canComment": false,
- "commentCount": 14,
- "faveCount": 21,
- "id": "14001294434",
- "sizes": {
- "z": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_z.jpg",
- "width": 433,
- "height": 640,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_z.jpg",
- "key": "z"
- }
- }
- }
- ],
- "fetchedStart": true,
- "fetchedEnd": false,
- "totalItems": "4386039"
- },"totalItems":
- """
- response = mock.Mock(text=json)
- results = flickr_noapi.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This is the title')
- self.assertEqual(results[0]['url'], 'https://www.flickr.com/photos/59729010@N00/14001294434')
- self.assertIn('z.jpg', results[0]['img_src'])
- self.assertIn('z.jpg', results[0]['thumbnail_src'])
- self.assertIn('Owner', results[0]['author'])
-
- # no z or n size
- json = """
- "search-photos-lite-models","photos":
- {
- "_data": [
- {
- "_flickrModelRegistry": "photo-lite-models",
- "title": "This is the title",
- "username": "Owner",
- "pathAlias": "klink692",
- "realname": "Owner",
- "license": 0,
- "ownerNsid": "59729010@N00",
- "canComment": false,
- "commentCount": 14,
- "faveCount": 21,
- "id": "14001294434",
- "sizes": {
- "o": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_o.jpg",
- "width": 433,
- "height": 640,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_o.jpg",
- "key": "o"
- }
- }
- }
- ],
- "fetchedStart": true,
- "fetchedEnd": false,
- "totalItems": "4386039"
- },"totalItems":
- """
- response = mock.Mock(text=json)
- results = flickr_noapi.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This is the title')
- self.assertEqual(results[0]['url'], 'https://www.flickr.com/photos/59729010@N00/14001294434')
- self.assertIn('o.jpg', results[0]['img_src'])
- self.assertIn('o.jpg', results[0]['thumbnail_src'])
- self.assertIn('Owner', results[0]['author'])
-
- # no image test
- json = """
- "search-photos-lite-models","photos":
- {
- "_data": [
- {
- "_flickrModelRegistry": "photo-lite-models",
- "title": "This is the title",
- "username": "Owner",
- "pathAlias": "klink692",
- "realname": "Owner",
- "license": 0,
- "ownerNsid": "59729010@N00",
- "canComment": false,
- "commentCount": 14,
- "faveCount": 21,
- "id": "14001294434",
- "sizes": {
- }
- }
- ],
- "fetchedStart": true,
- "fetchedEnd": false,
- "totalItems": "4386039"
- },"totalItems":
- """
- response = mock.Mock(text=json)
- results = flickr_noapi.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- # null test
- json = """
- "search-photos-models","photos":
- {
- "_data": [null],
- "fetchedStart": true,
- "fetchedEnd": false,
- "totalItems": "4386039"
- },"totalItems":
- """
- response = mock.Mock(text=json)
- results = flickr_noapi.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- # no ownerNsid test
- json = """
- "search-photos-lite-models","photos":
- {
- "_data": [
- {
- "_flickrModelRegistry": "photo-lite-models",
- "title": "This is the title",
- "username": "Owner",
- "pathAlias": "klink692",
- "realname": "Owner",
- "license": 0,
- "canComment": false,
- "commentCount": 14,
- "faveCount": 21,
- "id": "14001294434",
- "sizes": {
- "o": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_o.jpg",
- "width": 433,
- "height": 640,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_o.jpg",
- "key": "o"
- }
- }
- }
- ],
- "fetchedStart": true,
- "fetchedEnd": false,
- "totalItems": "4386039"
- },"totalItems":
- """
- response = mock.Mock(text=json)
- results = flickr_noapi.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- # garbage test
- json = r"""
- {"toto":[
- {"id":200,"name":"Artist Name",
- "link":"http:\/\/www.flickr.com\/artist\/1217","type":"artist"}
- ]}
- """
- response = mock.Mock(text=json)
- results = flickr_noapi.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_framalibre.py b/tests/unit/engines/test_framalibre.py
deleted file mode 100644
index 850996372..000000000
--- a/tests/unit/engines/test_framalibre.py
+++ /dev/null
@@ -1,103 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import framalibre
-from searx.testing import SearxTestCase
-
-
-class TestFramalibreEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- params = framalibre.request(query, dicto)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('framalibre.org' in params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, framalibre.response, None)
- self.assertRaises(AttributeError, framalibre.response, [])
- self.assertRaises(AttributeError, framalibre.response, '')
- self.assertRaises(AttributeError, framalibre.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(framalibre.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(framalibre.response(response), [])
-
- html = u"""
- <div class="nodes-list-row">
- <div id="node-431"
- class="node node-logiciel-annuaires node-promoted node-teaser node-teaser node-sheet clearfix nodes-list"
- about="/content/gogs" typeof="sioc:Item foaf:Document">
- <header class="media">
- <div class="media-left">
- <div class="field field-name-field-logo field-type-image field-label-hidden">
- <div class="field-items">
- <div class="field-item even">
- <a href="/content/gogs">
- <img class="media-object img-responsive" typeof="foaf:Image"
- src="https://framalibre.org/sites/default/files/styles/teaser_logo/public/leslogos/gogs-lg.png?itok=rrCxKKBy"
- width="70" height="70" alt="" />
- </a>
- </div>
- </div>
- </div>
- </div>
- <div class="media-body">
- <h3 class="node-title"><a href="/content/gogs">Gogs</a></h3>
- <span property="dc:title" content="Gogs" class="rdf-meta element-hidden"></span>
- <div class="field field-name-field-annuaires field-type-taxonomy-term-reference field-label-hidden">
- <div class="field-items">
- <div class="field-item even">
- <a href="/annuaires/cloudwebapps"
- typeof="skos:Concept" property="rdfs:label skos:prefLabel"
- datatype="" class="label label-primary">Cloud/webApps</a>
- </div>
- </div>
- </div>
- </div>
- </header>
- <div class="content">
- <div class="field field-name-field-votre-appr-ciation field-type-fivestar field-label-hidden">
- <div class="field-items">
- <div class="field-item even">
- </div>
- </div>
- </div>
- <div class="field field-name-body field-type-text-with-summary field-label-hidden">
- <div class="field-items">
- <div class="field-item even" property="content:encoded">
- <p>Gogs est une interface web basée sur git et une bonne alternative à GitHub.</p>
- </div>
- </div>
- </div>
- </div>
- <footer>
- <a href="/content/gogs" class="read-more btn btn-default btn-sm">Voir la notice</a>
- <div class="field field-name-field-lien-officiel field-type-link-field field-label-hidden">
- <div class="field-items">
- <div class="field-item even">
- <a href="https://gogs.io/" target="_blank" title="Voir le site officiel">
- <span class="glyphicon glyphicon-globe"></span>
- <span class="sr-only">Lien officiel</span>
- </a>
- </div>
- </div>
- </div>
- </footer>
- </div>
- </div>
- """
- response = mock.Mock(text=html)
- results = framalibre.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Gogs')
- self.assertEqual(results[0]['url'],
- 'https://framalibre.org/content/gogs')
- self.assertEqual(results[0]['content'],
- u"Gogs est une interface web basée sur git et une bonne alternative à GitHub.")
diff --git a/tests/unit/engines/test_frinkiac.py b/tests/unit/engines/test_frinkiac.py
deleted file mode 100644
index 5ea220cd3..000000000
--- a/tests/unit/engines/test_frinkiac.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import frinkiac
-from searx.testing import SearxTestCase
-
-
-class TestFrinkiacEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- request_dict = defaultdict(dict)
- params = frinkiac.request(query, request_dict)
- self.assertTrue('url' in params)
-
- def test_response(self):
- self.assertRaises(AttributeError, frinkiac.response, None)
- self.assertRaises(AttributeError, frinkiac.response, [])
- self.assertRaises(AttributeError, frinkiac.response, '')
- self.assertRaises(AttributeError, frinkiac.response, '[]')
-
- text = """
-[{"Id":770931,
- "Episode":"S06E18",
- "Timestamp":534616,
- "Filename":""},
- {"Id":1657080,
- "Episode":"S12E14",
- "Timestamp":910868,
- "Filename":""},
- {"Id":1943753,
- "Episode":"S14E21",
- "Timestamp":773439,
- "Filename":""},
- {"Id":107835,
- "Episode":"S02E03",
- "Timestamp":531709,
- "Filename":""}]
- """
-
- response = mock.Mock(text=text)
- results = frinkiac.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 4)
- self.assertEqual(results[0]['title'], u'S06E18')
- self.assertIn('p=caption', results[0]['url'])
- self.assertIn('e=S06E18', results[0]['url'])
- self.assertIn('t=534616', results[0]['url'])
- self.assertEqual(results[0]['thumbnail_src'], 'https://frinkiac.com/img/S06E18/534616/medium.jpg')
- self.assertEqual(results[0]['img_src'], 'https://frinkiac.com/img/S06E18/534616.jpg')
diff --git a/tests/unit/engines/test_genius.py b/tests/unit/engines/test_genius.py
deleted file mode 100644
index ea721943a..000000000
--- a/tests/unit/engines/test_genius.py
+++ /dev/null
@@ -1,231 +0,0 @@
-from collections import defaultdict
-import mock
-from datetime import datetime
-from searx.engines import genius
-from searx.testing import SearxTestCase
-
-
-class TestGeniusEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- params = genius.request(query, dicto)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('genius.com' in params['url'])
-
- def test_response(self):
-
- json_empty = """
- {
- "meta": {
- "status": 200
- },
- "response": {
- "sections": [
- {
- "type": "top_hit",
- "hits": []
- },
- {
- "type": "song",
- "hits": []
- },
- {
- "type": "lyric",
- "hits": []
- },
- {
- "type": "artist",
- "hits": []
- },
- {
- "type": "album",
- "hits": []
- },
- {
- "type": "tag",
- "hits": []
- },
- {
- "type": "video",
- "hits": []
- },
- {
- "type": "article",
- "hits": []
- },
- {
- "type": "user",
- "hits": []
- }
- ]
- }
- }
- """
-
- resp = mock.Mock(text=json_empty)
- self.assertEqual(genius.response(resp), [])
-
- json = """
- {
- "meta": {
- "status": 200
- },
- "response": {
- "sections": [
- {
- "type": "lyric",
- "hits": [
- {
- "highlights": [
- {
- "property": "lyrics",
- "value": "Sample lyrics",
- "snippet": true,
- "ranges": []
- }
- ],
- "index": "lyric",
- "type": "song",
- "result": {
- "_type": "song",
- "annotation_count": 45,
- "api_path": "/songs/52916",
- "full_title": "J't'emmerde by MC Jean Gab'1",
- "header_image_thumbnail_url": "https://images.genius.com/xxx.300x300x1.jpg",
- "header_image_url": "https://images.genius.com/ef9f736a86df3c3b1772f3fb7fbdb21c.1000x1000x1.jpg",
- "id": 52916,
- "instrumental": false,
- "lyrics_owner_id": 15586,
- "lyrics_state": "complete",
- "lyrics_updated_at": 1498744545,
- "path": "/Mc-jean-gab1-jtemmerde-lyrics",
- "pyongs_count": 4,
- "song_art_image_thumbnail_url": "https://images.genius.com/xxx.300x300x1.jpg",
- "stats": {
- "hot": false,
- "unreviewed_annotations": 0,
- "pageviews": 62490
- },
- "title": "J't'emmerde",
- "title_with_featured": "J't'emmerde",
- "updated_by_human_at": 1498744546,
- "url": "https://genius.com/Mc-jean-gab1-jtemmerde-lyrics",
- "primary_artist": {
- "_type": "artist",
- "api_path": "/artists/12691",
- "header_image_url": "https://images.genius.com/c7847662a58f8c2b0f02a6e217d60907.960x657x1.jpg",
- "id": 12691,
- "image_url": "https://s3.amazonaws.com/rapgenius/Mc-jean-gab1.jpg",
- "index_character": "m",
- "is_meme_verified": false,
- "is_verified": false,
- "name": "MC Jean Gab'1",
- "slug": "Mc-jean-gab1",
- "url": "https://genius.com/artists/Mc-jean-gab1"
- }
- }
- }
- ]
- },
- {
- "type": "artist",
- "hits": [
- {
- "highlights": [],
- "index": "artist",
- "type": "artist",
- "result": {
- "_type": "artist",
- "api_path": "/artists/191580",
- "header_image_url": "https://assets.genius.com/images/default_avatar_300.png?1503090542",
- "id": 191580,
- "image_url": "https://assets.genius.com/images/default_avatar_300.png?1503090542",
- "index_character": "a",
- "is_meme_verified": false,
- "is_verified": false,
- "name": "ASDF Guy",
- "slug": "Asdf-guy",
- "url": "https://genius.com/artists/Asdf-guy"
- }
- }
- ]
- },
- {
- "type": "album",
- "hits": [
- {
- "highlights": [],
- "index": "album",
- "type": "album",
- "result": {
- "_type": "album",
- "api_path": "/albums/132332",
- "cover_art_thumbnail_url": "https://images.genius.com/xxx.300x300x1.jpg",
- "cover_art_url": "https://images.genius.com/xxx.600x600x1.jpg",
- "full_title": "ASD by A Skylit Drive",
- "id": 132332,
- "name": "ASD",
- "name_with_artist": "ASD (artist: A Skylit Drive)",
- "release_date_components": {
- "year": 2015,
- "month": null,
- "day": null
- },
- "url": "https://genius.com/albums/A-skylit-drive/Asd",
- "artist": {
- "_type": "artist",
- "api_path": "/artists/48712",
- "header_image_url": "https://images.genius.com/814c1551293172c56306d0e310c6aa89.620x400x1.jpg",
- "id": 48712,
- "image_url": "https://images.genius.com/814c1551293172c56306d0e310c6aa89.620x400x1.jpg",
- "index_character": "s",
- "is_meme_verified": false,
- "is_verified": false,
- "name": "A Skylit Drive",
- "slug": "A-skylit-drive",
- "url": "https://genius.com/artists/A-skylit-drive"
- }
- }
- }
- ]
- }
- ]
- }
- }
- """
-
- resp = mock.Mock(text=json)
- results = genius.response(resp)
-
- self.assertEqual(len(results), 3)
- self.assertEqual(type(results), list)
-
- # check lyric parsing
- r = results[0]
- self.assertEqual(r['url'], 'https://genius.com/Mc-jean-gab1-jtemmerde-lyrics')
- self.assertEqual(r['title'], "J't'emmerde by MC Jean Gab'1")
- self.assertEqual(r['content'], "Sample lyrics")
- self.assertEqual(r['template'], 'videos.html')
- self.assertEqual(r['thumbnail'], 'https://images.genius.com/xxx.300x300x1.jpg')
- created = datetime.fromtimestamp(1498744545)
- self.assertEqual(r['publishedDate'], created)
-
- # check artist parsing
- r = results[1]
- self.assertEqual(r['url'], 'https://genius.com/artists/Asdf-guy')
- self.assertEqual(r['title'], "ASDF Guy")
- self.assertEqual(r['content'], None)
- self.assertEqual(r['template'], 'videos.html')
- self.assertEqual(r['thumbnail'], 'https://assets.genius.com/images/default_avatar_300.png?1503090542')
-
- # check album parsing
- r = results[2]
- self.assertEqual(r['url'], 'https://genius.com/albums/A-skylit-drive/Asd')
- self.assertEqual(r['title'], "ASD by A Skylit Drive")
- self.assertEqual(r['content'], "Released: 2015")
- self.assertEqual(r['template'], 'videos.html')
- self.assertEqual(r['thumbnail'], 'https://images.genius.com/xxx.600x600x1.jpg')
diff --git a/tests/unit/engines/test_gigablast.py b/tests/unit/engines/test_gigablast.py
deleted file mode 100644
index 6b2d26458..000000000
--- a/tests/unit/engines/test_gigablast.py
+++ /dev/null
@@ -1,119 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import gigablast
-from searx.testing import SearxTestCase
-
-
-class TestGigablastEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- dicto['safesearch'] = 0
- dicto['language'] = 'all'
- params = gigablast.request(query, dicto)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('gigablast.com' in params['url'])
- self.assertTrue('xx' in params['url'])
-
- dicto['language'] = 'en-US'
- params = gigablast.request(query, dicto)
- self.assertTrue('en' in params['url'])
- self.assertFalse('en-US' in params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, gigablast.response, None)
- self.assertRaises(AttributeError, gigablast.response, [])
- self.assertRaises(AttributeError, gigablast.response, '')
- self.assertRaises(AttributeError, gigablast.response, '[]')
-
- response = mock.Mock(text='{"results": []}')
- self.assertEqual(gigablast.response(response), [])
-
- json = """{"results": [
- {
- "title":"South by Southwest 2016",
- "dmozEntry":{
- "dmozCatId":1041152,
- "directCatId":1,
- "dmozCatStr":"Top: Regional: North America: United States",
- "dmozTitle":"South by Southwest (SXSW)",
- "dmozSum":"Annual music, film, and interactive conference.",
- "dmozAnchor":""
- },
- "dmozEntry":{
- "dmozCatId":763945,
- "directCatId":1,
- "dmozCatStr":"Top: Regional: North America: United States",
- "dmozTitle":"South by Southwest (SXSW)",
- "dmozSum":"",
- "dmozAnchor":"www.sxsw.com"
- },
- "dmozEntry":{
- "dmozCatId":761446,
- "directCatId":1,
- "dmozCatStr":"Top: Regional: North America: United States",
- "dmozTitle":"South by Southwest (SXSW)",
- "dmozSum":"Music, film, and interactive conference and festival.",
- "dmozAnchor":""
- },
- "indirectDmozCatId":1041152,
- "indirectDmozCatId":763945,
- "indirectDmozCatId":761446,
- "contentType":"html",
- "sum":"This should be the content.",
- "url":"www.sxsw.com",
- "hopCount":0,
- "size":" 102k",
- "sizeInBytes":104306,
- "bytesUsedToComputeSummary":70000,
- "docId":269411794364,
- "docScore":586571136.000000,
- "summaryGenTimeMS":12,
- "summaryTagdbLookupTimeMS":0,
- "summaryTitleRecLoadTimeMS":1,
- "site":"www.sxsw.com",
- "spidered":1452203608,
- "firstIndexedDateUTC":1444167123,
- "contentHash32":2170650347,
- "language":"English",
- "langAbbr":"en"
- }
-]}
- """
- response = mock.Mock(text=json)
- results = gigablast.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'South by Southwest 2016')
- self.assertEqual(results[0]['url'], 'www.sxsw.com')
- self.assertEqual(results[0]['content'], 'This should be the content.')
-
- def test_fetch_supported_languages(self):
- html = """<html></html>"""
- response = mock.Mock(text=html)
- results = gigablast._fetch_supported_languages(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- html = """
- <html>
- <body>
- <span id="menu2">
- <a href="/search?&rxikd=1&qlang=xx"></a>
- <a href="/search?&rxikd=1&qlang=en"></a>
- <a href="/search?&rxikd=1&prepend=gblang%3Aen"></a>
- <a href="/search?&rxikd=1&qlang=zh_"></a>
- <a href="/search?&rxikd=1&prepend=gblang%3Azh_tw"></a>
- </span>
- </body>
- </html>
- """
- response = mock.Mock(text=html)
- languages = gigablast._fetch_supported_languages(response)
- self.assertEqual(type(languages), list)
- self.assertEqual(len(languages), 2)
- self.assertIn('en', languages)
- self.assertIn('zh-TW', languages)
diff --git a/tests/unit/engines/test_github.py b/tests/unit/engines/test_github.py
deleted file mode 100644
index 460be8c3d..000000000
--- a/tests/unit/engines/test_github.py
+++ /dev/null
@@ -1,61 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import github
-from searx.testing import SearxTestCase
-
-
-class TestGitHubEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- params = github.request(query, defaultdict(dict))
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('github.com' in params['url'])
- self.assertEqual(params['headers']['Accept'], github.accept_header)
-
- def test_response(self):
- self.assertRaises(AttributeError, github.response, None)
- self.assertRaises(AttributeError, github.response, [])
- self.assertRaises(AttributeError, github.response, '')
- self.assertRaises(AttributeError, github.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(github.response(response), [])
-
- response = mock.Mock(text='{"items": []}')
- self.assertEqual(github.response(response), [])
-
- json = """
- {
- "items": [
- {
- "name": "title",
- "html_url": "url",
- "description": ""
- }
- ]
- }
- """
- response = mock.Mock(text=json)
- results = github.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'title')
- self.assertEqual(results[0]['url'], 'url')
- self.assertEqual(results[0]['content'], '')
-
- json = """
- {
- "items": [
- {
- "name": "title",
- "html_url": "url",
- "description": "desc"
- }
- ]
- }
- """
- response = mock.Mock(text=json)
- results = github.response(response)
- self.assertEqual(results[0]['content'], "desc")
diff --git a/tests/unit/engines/test_google.py b/tests/unit/engines/test_google.py
deleted file mode 100644
index a73e9d2be..000000000
--- a/tests/unit/engines/test_google.py
+++ /dev/null
@@ -1,237 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-import lxml
-from searx.engines import google
-from searx.testing import SearxTestCase
-
-
-class TestGoogleEngine(SearxTestCase):
-
- def mock_response(self, text):
- response = mock.Mock(text=text, url='https://www.google.com/search?q=test&start=0&gbv=1&gws_rd=cr')
- response.search_params = mock.Mock()
- response.search_params.get = mock.Mock(return_value='www.google.com')
- return response
-
- def test_request(self):
- google.supported_languages = ['en', 'fr', 'zh-CN', 'iw']
- google.language_aliases = {'he': 'iw'}
-
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['language'] = 'fr-FR'
- dicto['time_range'] = ''
- params = google.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('google.fr', params['url'])
- self.assertIn('fr', params['url'])
- self.assertIn('fr', params['headers']['Accept-Language'])
-
- dicto['language'] = 'en-US'
- params = google.request(query, dicto)
- self.assertIn('google.com', params['url'])
- self.assertIn('en', params['url'])
- self.assertIn('en', params['headers']['Accept-Language'])
-
- dicto['language'] = 'zh'
- params = google.request(query, dicto)
- self.assertIn('google.com', params['url'])
- self.assertIn('zh-CN', params['url'])
- self.assertIn('zh-CN', params['headers']['Accept-Language'])
-
- dicto['language'] = 'he'
- params = google.request(query, dicto)
- self.assertIn('google.com', params['url'])
- self.assertIn('iw', params['url'])
- self.assertIn('iw', params['headers']['Accept-Language'])
-
- def test_response(self):
- self.assertRaises(AttributeError, google.response, None)
- self.assertRaises(AttributeError, google.response, [])
- self.assertRaises(AttributeError, google.response, '')
- self.assertRaises(AttributeError, google.response, '[]')
-
- response = self.mock_response('<html></html>')
- self.assertEqual(google.response(response), [])
-
- html = """
- <div class="g">
- <h3 class="r">
- <a href="http://this.should.be.the.link/">
- <b>This</b> is <b>the</b> title
- </a>
- </h3>
- <div class="s">
- <div class="kv" style="margin-bottom:2px">
- <cite>
- <b>test</b>.psychologies.com/
- </cite>
- <div class="_nBb">‎
- <div style="display:inline" onclick="google.sham(this);" aria-expanded="false"
- aria-haspopup="true" tabindex="0" data-ved="0CBUQ7B0wAA">
- <span class="_O0">
- </span>
- </div>
- <div style="display:none" class="am-dropdown-menu" role="menu" tabindex="-1">
- <ul>
- <li class="_Ykb">
- <a class="_Zkb" href="http://www.google.fr/url?url=http://webcache.googleusercontent
- .com/search%3Fcache:R1Z_4pGXjuIJ:http://test.psychologies.com/">
- En cache
- </a>
- </li>
- <li class="_Ykb">
- <a class="_Zkb" href="/search?safe=off&amp;q=related:test.psy.com/">
- Pages similaires
- </a>
- </li>
- </ul>
- </div>
- </div>
- </div>
- <span class="st">
- This should be the content.
- </span>
- <br>
- <div class="osl">‎
- <a href="http://www.google.fr/url?url=http://test.psychologies.com/tests/">
- Test Personnalité
- </a> - ‎
- <a href="http://www.google.fr/url?url=http://test.psychologies.com/test/">
- Tests - Moi
- </a> - ‎
- <a href="http://www.google.fr/url?url=http://test.psychologies.com/test/tests-couple">
- Test Couple
- </a>
- - ‎
- <a href="http://www.google.fr/url?url=http://test.psychologies.com/tests/tests-amour">
- Test Amour
- </a>
- </div>
- </div>
- </div>
- <div class="g">
- <h3 class="r">
- <a href="http://www.google.com/images?q=toto">
- <b>This</b>
- </a>
- </h3>
- </div>
- <div class="g">
- <h3 class="r">
- <a href="http://www.google.com/search?q=toto">
- <b>This</b> is
- </a>
- </h3>
- </div>
- <div class="g">
- <h3 class="r">
- <a href="€">
- <b>This</b> is <b>the</b>
- </a>
- </h3>
- </div>
- <div class="g">
- <h3 class="r">
- <a href="/url?q=url">
- <b>This</b> is <b>the</b>
- </a>
- </h3>
- </div>
- <p class="_Bmc" style="margin:3px 8px">
- <a href="/search?num=20&amp;safe=off&amp;q=t&amp;revid=1754833769&amp;sa=X&amp;ei=-&amp;ved=">
- suggestion <b>title</b>
- </a>
- </p>
- """
- response = self.mock_response(html)
- results = google.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
- self.assertEqual(results[0]['title'], 'This is the title')
- self.assertEqual(results[0]['url'], 'http://this.should.be.the.link/')
- self.assertEqual(results[0]['content'], 'This should be the content.')
- self.assertEqual(results[1]['suggestion'], 'suggestion title')
-
- html = """
- <li class="b_algo" u="0|5109|4755453613245655|UAGjXgIrPH5yh-o5oNHRx_3Zta87f_QO">
- </li>
- """
- response = self.mock_response(html)
- results = google.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- response = mock.Mock(text='<html></html>', url='https://sorry.google.com')
- response.search_params = mock.Mock()
- response.search_params.get = mock.Mock(return_value='www.google.com')
- self.assertRaises(RuntimeWarning, google.response, response)
-
- response = mock.Mock(text='<html></html>', url='https://www.google.com/sorry/IndexRedirect')
- response.search_params = mock.Mock()
- response.search_params.get = mock.Mock(return_value='www.google.com')
- self.assertRaises(RuntimeWarning, google.response, response)
-
- def test_parse_images(self):
- html = """
- <li>
- <div>
- <a href="http://www.google.com/url?q=http://this.is.the.url/">
- <img style="margin:3px 0;margin-right:6px;padding:0" height="90"
- src="https://this.is.the.image/image.jpg" width="60" align="middle" alt="" border="0">
- </a>
- </div>
- </li>
- """
- dom = lxml.html.fromstring(html)
- results = google.parse_images(dom, 'www.google.com')
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['url'], 'http://this.is.the.url/')
- self.assertEqual(results[0]['title'], '')
- self.assertEqual(results[0]['content'], '')
- self.assertEqual(results[0]['img_src'], 'https://this.is.the.image/image.jpg')
-
- def test_fetch_supported_languages(self):
- html = """<html></html>"""
- response = mock.Mock(text=html)
- languages = google._fetch_supported_languages(response)
- self.assertEqual(type(languages), dict)
- self.assertEqual(len(languages), 0)
-
- html = u"""
- <html>
- <body>
- <div id="langSec">
- <div>
- <input name="lr" data-name="english" value="lang_en" />
- <input name="lr" data-name="中文 (简体)" value="lang_zh-CN" />
- <input name="lr" data-name="中文 (繁體)" value="lang_zh-TW" />
- </div>
- </div>
- </body>
- </html>
- """
- response = mock.Mock(text=html)
- languages = google._fetch_supported_languages(response)
- self.assertEqual(type(languages), dict)
- self.assertEqual(len(languages), 3)
-
- self.assertIn('en', languages)
- self.assertIn('zh-CN', languages)
- self.assertIn('zh-TW', languages)
-
- self.assertEquals(type(languages['en']), dict)
- self.assertEquals(type(languages['zh-CN']), dict)
- self.assertEquals(type(languages['zh-TW']), dict)
-
- self.assertIn('name', languages['en'])
- self.assertIn('name', languages['zh-CN'])
- self.assertIn('name', languages['zh-TW'])
-
- self.assertEquals(languages['en']['name'], 'English')
- self.assertEquals(languages['zh-CN']['name'], u'中文 (简体)')
- self.assertEquals(languages['zh-TW']['name'], u'中文 (繁體)')
diff --git a/tests/unit/engines/test_google_images.py b/tests/unit/engines/test_google_images.py
deleted file mode 100644
index 8366e1b08..000000000
--- a/tests/unit/engines/test_google_images.py
+++ /dev/null
@@ -1,27 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import google_images
-from searx.testing import SearxTestCase
-
-
-class TestGoogleImagesEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['safesearch'] = 1
- dicto['time_range'] = ''
- params = google_images.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
-
- dicto['safesearch'] = 0
- params = google_images.request(query, dicto)
- self.assertNotIn('safe', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, google_images.response, None)
- self.assertRaises(AttributeError, google_images.response, [])
- self.assertRaises(AttributeError, google_images.response, '')
- self.assertRaises(AttributeError, google_images.response, '[]')
diff --git a/tests/unit/engines/test_google_news.py b/tests/unit/engines/test_google_news.py
deleted file mode 100644
index 0a122ca6d..000000000
--- a/tests/unit/engines/test_google_news.py
+++ /dev/null
@@ -1,102 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from collections import defaultdict
-import mock
-from searx.engines import google_news
-from searx.testing import SearxTestCase
-
-
-class TestGoogleNewsEngine(SearxTestCase):
-
- def test_request(self):
- google_news.supported_languages = ['en-US', 'fr-FR']
- google_news.language_aliases = {}
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['language'] = 'fr-FR'
- dicto['time_range'] = 'w'
- params = google_news.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('fr', params['url'])
-
- dicto['language'] = 'all'
- params = google_news.request(query, dicto)
- self.assertIn('url', params)
- self.assertNotIn('fr', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, google_news.response, None)
- self.assertRaises(AttributeError, google_news.response, [])
- self.assertRaises(AttributeError, google_news.response, '')
- self.assertRaises(AttributeError, google_news.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(google_news.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(google_news.response(response), [])
-
- html = u"""
-<h2 class="hd">Search Results</h2>
-<div data-async-context="query:searx" id="ires">
- <div eid="oC2oWcGXCafR6ASkwoCwDA" id="rso">
- <div class="_NId">
- <!--m-->
- <div class="g _cy">
- <div class="ts _JGs _JHs _tJs _KGs _jHs">
- <div class="_hJs">
- <h3 class="r _gJs">
- <a class="l lLrAF" href="https://example.com/" onmousedown="return rwt(this,'','','','11','AFQjCNEyehpzD5cJK1KUfXBx9RmsbqqG9g','','0ahUKEwjB58OR54HWAhWnKJoKHSQhAMY4ChCpAggiKAAwAA','','',event)">Example title</a>
- </h3>
- <div class="slp">
- <span class="_OHs _PHs">
- Mac &amp; i</span>
- <span class="_QGs">
- -</span>
- <span class="f nsa _QHs">
- Mar 21, 2016</span>
- </div>
- <div class="st">Example description</div>
- </div>
- </div>
- </div>
- <div class="g _cy">
- <div class="ts _JGs _JHs _oGs _KGs _jHs">
- <a class="top _xGs _SHs" href="https://example2.com/" onmousedown="return rwt(this,'','','','12','AFQjCNHObfH7sYmLWI1SC-YhWXKZFRzRjw','','0ahUKEwjB58OR54HWAhWnKJoKHSQhAMY4ChC8iAEIJDAB','','',event)">
- <img class="th _RGs" src="https://example2.com/image.jpg" alt="Story image for searx from Golem.de" onload="typeof google==='object'&&google.aft&&google.aft(this)">
- </a>
- <div class="_hJs">
- <h3 class="r _gJs">
- <a class="l lLrAF" href="https://example2.com/" onmousedown="return rwt(this,'','','','12','AFQjCNHObfH7sYmLWI1SC-YhWXKZFRzRjw','','0ahUKEwjB58OR54HWAhWnKJoKHSQhAMY4ChCpAgglKAAwAQ','','',event)">Example title 2</a>
- </h3>
- <div class="slp">
- <span class="_OHs _PHs">
- Golem.de</span>
- <span class="_QGs">
- -</span>
- <span class="f nsa _QHs">
- Oct 4, 2016</span>
- </div>
- <div class="st">Example description 2</div>
- </div>
- </div>
- </div>
- </div>
- </div>
-</div>
-
-
- """ # noqa
- response = mock.Mock(text=html)
- results = google_news.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
- self.assertEqual(results[0]['title'], u'Example title')
- self.assertEqual(results[0]['url'], 'https://example.com/')
- self.assertEqual(results[0]['content'], 'Example description')
- self.assertEqual(results[1]['title'], u'Example title 2')
- self.assertEqual(results[1]['url'], 'https://example2.com/')
- self.assertEqual(results[1]['content'], 'Example description 2')
- self.assertEqual(results[1]['img_src'], 'https://example2.com/image.jpg')
diff --git a/tests/unit/engines/test_google_videos.py b/tests/unit/engines/test_google_videos.py
deleted file mode 100644
index 3b7edf373..000000000
--- a/tests/unit/engines/test_google_videos.py
+++ /dev/null
@@ -1,79 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import google_videos
-from searx.testing import SearxTestCase
-
-
-class TestGoogleVideosEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['safesearch'] = 1
- dicto['time_range'] = ''
- params = google_videos.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
-
- dicto['safesearch'] = 0
- params = google_videos.request(query, dicto)
- self.assertNotIn('safe', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, google_videos.response, None)
- self.assertRaises(AttributeError, google_videos.response, [])
- self.assertRaises(AttributeError, google_videos.response, '')
- self.assertRaises(AttributeError, google_videos.response, '[]')
-
- html = r"""
- <div>
- <div>
- <div class="g">
- <div class="r">
- <a href="url_1"><h3>Title 1</h3></a>
- </div>
- <div class="s">
- <div>
- <a>
- <g-img>
- <img id="vidthumb1">
- </g-img>
- </a>
- </div>
- </div>
- <div>
- <span class="st">Content 1</span>
- </div>
- </div>
- <div class="g">
- <div class="r">
- <a href="url_2"><h3>Title 2</h3></a>
- </div>
- <div class="s">
- <div>
- <a>
- <g-img>
- <img id="vidthumb2">
- </g-img>
- </a>
- </div>
- </div>
- <div>
- <span class="st">Content 2</span>
- </div>
- </div>
- </div>
- </div>
- <script>function _setImagesSrc(c,d,e){}</script>
- """
- response = mock.Mock(text=html)
- results = google_videos.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
- self.assertEqual(results[0]['url'], u'url_1')
- self.assertEqual(results[0]['title'], u'Title 1')
- self.assertEqual(results[0]['content'], u'Content 1')
- self.assertEqual(results[1]['url'], u'url_2')
- self.assertEqual(results[1]['title'], u'Title 2')
- self.assertEqual(results[1]['content'], u'Content 2')
diff --git a/tests/unit/engines/test_ina.py b/tests/unit/engines/test_ina.py
deleted file mode 100644
index 109a9592d..000000000
--- a/tests/unit/engines/test_ina.py
+++ /dev/null
@@ -1,64 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import ina
-from searx.testing import SearxTestCase
-
-
-class TestInaEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- params = ina.request(query, dicto)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('ina.fr' in params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, ina.response, None)
- self.assertRaises(AttributeError, ina.response, [])
- self.assertRaises(AttributeError, ina.response, '')
- self.assertRaises(AttributeError, ina.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(ina.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(ina.response(response), [])
-
- json = """
- {"content":"\\t<div class=\\"container\\">\\n\\t\\n\
- <!-- DEBUT CONTENU PRINCIPAL -->\\n<div class=\\"row\\">\\n\
- <div class=\\"search-results--list\\"><div class=\\"media\\">\\n\
- \\t\\t\\t\\t<a class=\\"media-left media-video premium xiti_click_action\\" \
- data-xiti-params=\\"recherche_v4::resultats_conference_de_presse_du_general_de_gaulle::N\\" \
- href=\\"\\/video\\/CAF89035682\\/conference-de-presse-du-general-de-gaulle-video.html\\">\\n\
- <img src=\\"https:\\/\\/www.ina.fr\\/images_v2\\/140x105\\/CAF89035682.jpeg\\" \
- alt=\\"Conf\\u00e9rence de presse du G\\u00e9n\\u00e9ral de Gaulle \\">\\n\
- \\t\\t\\t\\t\\t<\\/a>\\n\
- \\t\\t\\t\\t\\t<div class=\\"media-body\\">\\n\\t\\t\\t\\t\\t\\t<h3 class=\\"h3--title media-heading\\">\\n\
- \\t\\t\\t\\t\\t\\t\\t<a class=\\"xiti_click_action\\" \
- data-xiti-params=\\"recherche_v4::resultats_conference_de_presse_du_general_de_gaulle::N\\" \
- href=\\"\\/video\\/CAF89035682\\/conference-de-presse-du-general-de-gaulle-video.html\\">\
- Conf\\u00e9rence de presse du G\\u00e9n\\u00e9ral de Gaulle <\\/a>\\n\
- <\\/h3>\\n\
- <div class=\\"media-body__info\\">\\n<span class=\\"broadcast\\">27\\/11\\/1967<\\/span>\\n\
- <span class=\\"views\\">29321 vues<\\/span>\\n\
- <span class=\\"duration\\">01h 33m 07s<\\/span>\\n\
- <\\/div>\\n\
- <p class=\\"media-body__summary\\">VERSION INTEGRALE DE LA CONFERENCE DE PRESSE DU GENERAL DE GAULLE . \
- - PA le Pr\\u00e9sident DE GAULLE : il ouvre les bras et s'assied. DP journalis...<\\/p>\\n\
- <\\/div>\\n<\\/div><!-- \\/.media -->\\n"
- }
- """
- response = mock.Mock(text=json)
- results = ina.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], u'Conf\xe9rence de presse du G\xe9n\xe9ral de Gaulle')
- self.assertEqual(results[0]['url'],
- 'https://www.ina.fr/video/CAF89035682/conference-de-presse-du-general-de-gaulle-video.html')
- self.assertEqual(results[0]['content'],
- u"VERSION INTEGRALE DE LA CONFERENCE DE PRESSE DU GENERAL DE GAULLE ."
- u" - PA le Pr\u00e9sident DE GAULLE : il ouvre les bras et s'assied. DP journalis...")
diff --git a/tests/unit/engines/test_kickass.py b/tests/unit/engines/test_kickass.py
deleted file mode 100644
index 3a75c6697..000000000
--- a/tests/unit/engines/test_kickass.py
+++ /dev/null
@@ -1,397 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import kickass
-from searx.testing import SearxTestCase
-
-
-class TestKickassEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- params = kickass.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('kickass.cd', params['url'])
- self.assertFalse(params['verify'])
-
- def test_response(self):
- self.assertRaises(AttributeError, kickass.response, None)
- self.assertRaises(AttributeError, kickass.response, [])
- self.assertRaises(AttributeError, kickass.response, '')
- self.assertRaises(AttributeError, kickass.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(kickass.response(response), [])
-
- html = """
- <table cellpadding="0" cellspacing="0" class="data" style="width: 100%">
- <tr class="firstr">
- <th class="width100perc nopad">torrent name</th>
- <th class="center">
- <a href="/search/test/?field=size&sorder=desc" rel="nofollow">size</a>
- </th>
- <th class="center"><span class="files">
- <a href="/search/test/?field=files_count&sorder=desc" rel="nofollow">files</a></span>
- </th>
- <th class="center"><span>
- <a href="/search/test/?field=time_add&sorder=desc" rel="nofollow">age</a></span>
- </th>
- <th class="center"><span class="seed">
- <a href="/search/test/?field=seeders&sorder=desc" rel="nofollow">seed</a></span>
- </th>
- <th class="lasttd nobr center">
- <a href="/search/test/?field=leechers&sorder=desc" rel="nofollow">leech</a>
- </th>
- </tr>
- <tr class="even" id="torrent_test6478745">
- <td>
- <div class="iaconbox center floatright">
- <a rel="6478745,0" class="icommentjs icon16" href="/test-t6478745.html#comment">
- <em style="font-size: 12px; margin: 0 4px 0 4px;" class="iconvalue">3</em>
- <i class="ka ka-comment"></i>
- </a>
- <a class="iverify icon16" href="/test-t6478745.html" title="Verified Torrent">
- <i class="ka ka16 ka-verify ka-green"></i>
- </a>
- <a href="#" onclick="_scq.push([]); return false;" class="partner1Button idownload icon16">
- <i class="ka ka16 ka-arrow-down partner1Button"></i>
- </a>
- <a title="Torrent magnet link"
- href="magnet:?xt=urn:btih:MAGNETURL&dn=test" class="imagnet icon16">
- <i class="ka ka16 ka-magnet"></i>
- </a>
- <a title="Download torrent file"
- href="http://torcache.net/torrent/53917.torrent?title=test" class="idownload icon16">
- <i class="ka ka16 ka-arrow-down"></i>
- </a>
- </div>
- <div class="torrentname">
- <a href="/test-t6478745.html" class="torType txtType"></a>
- <a href="/test-t6478745.html" class="normalgrey font12px plain bold"></a>
- <div class="markeredBlock torType txtType">
- <a href="/url.html" class="cellMainLink">
- <strong class="red">This should be the title</strong>
- </a>
- <span class="font11px lightgrey block">
- Posted by <i class="ka ka-verify" style="font-size: 16px;color:orange;"></i>
- <a class="plain" href="/user/riri/">riri</a> in
- <span id="cat_6478745">
- <strong><a href="/other/">Other</a> > <a href="/unsorted/">Unsorted</a></strong>
- </span>
- </span>
- </div>
- </td>
- <td class="nobr center">449 bytes</td>
- <td class="center">4</td>
- <td class="center">2&nbsp;years</td>
- <td class="green center">10</td>
- <td class="red lasttd center">1</td>
- </tr>
- </table>
- """
- response = mock.Mock(text=html)
- results = kickass.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This should be the title')
- self.assertEqual(results[0]['url'], 'https://kickass.cd/url.html')
- self.assertEqual(results[0]['content'], 'Posted by riri in Other > Unsorted')
- self.assertEqual(results[0]['seed'], 10)
- self.assertEqual(results[0]['leech'], 1)
- self.assertEqual(results[0]['filesize'], 449)
- self.assertEqual(results[0]['files'], 4)
- self.assertEqual(results[0]['magnetlink'], 'magnet:?xt=urn:btih:MAGNETURL&dn=test')
- self.assertEqual(results[0]['torrentfile'], 'http://torcache.net/torrent/53917.torrent?title=test')
-
- html = """
- <table cellpadding="0" cellspacing="0" class="data" style="width: 100%">
- <tr class="firstr">
- <th class="width100perc nopad">torrent name</th>
- <th class="center">
- <a href="/search/test/?field=size&sorder=desc" rel="nofollow">size</a>
- </th>
- <th class="center"><span class="files">
- <a href="/search/test/?field=files_count&sorder=desc" rel="nofollow">files</a></span>
- </th>
- <th class="center"><span>
- <a href="/search/test/?field=time_add&sorder=desc" rel="nofollow">age</a></span>
- </th>
- <th class="center"><span class="seed">
- <a href="/search/test/?field=seeders&sorder=desc" rel="nofollow">seed</a></span>
- </th>
- <th class="lasttd nobr center">
- <a href="/search/test/?field=leechers&sorder=desc" rel="nofollow">leech</a>
- </th>
- </tr>
- </table>
- """
- response = mock.Mock(text=html)
- results = kickass.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- html = """
- <table cellpadding="0" cellspacing="0" class="data" style="width: 100%">
- <tr class="firstr">
- <th class="width100perc nopad">torrent name</th>
- <th class="center">
- <a href="/search/test/?field=size&sorder=desc" rel="nofollow">size</a>
- </th>
- <th class="center"><span class="files">
- <a href="/search/test/?field=files_count&sorder=desc" rel="nofollow">files</a></span>
- </th>
- <th class="center"><span>
- <a href="/search/test/?field=time_add&sorder=desc" rel="nofollow">age</a></span>
- </th>
- <th class="center"><span class="seed">
- <a href="/search/test/?field=seeders&sorder=desc" rel="nofollow">seed</a></span>
- </th>
- <th class="lasttd nobr center">
- <a href="/search/test/?field=leechers&sorder=desc" rel="nofollow">leech</a>
- </th>
- </tr>
- <tr class="even" id="torrent_test6478745">
- <td>
- <div class="iaconbox center floatright">
- <a rel="6478745,0" class="icommentjs icon16" href="/test-t6478745.html#comment">
- <em style="font-size: 12px; margin: 0 4px 0 4px;" class="iconvalue">3</em>
- <i class="ka ka-comment"></i>
- </a>
- <a class="iverify icon16" href="/test-t6478745.html" title="Verified Torrent">
- <i class="ka ka16 ka-verify ka-green"></i>
- </a>
- <a href="#" onclick="_scq.push([]); return false;" class="partner1Button idownload icon16">
- <i class="ka ka16 ka-arrow-down partner1Button"></i>
- </a>
- <a title="Torrent magnet link"
- href="magnet:?xt=urn:btih:MAGNETURL&dn=test" class="imagnet icon16">
- <i class="ka ka16 ka-magnet"></i>
- </a>
- <a title="Download torrent file"
- href="http://torcache.net/torrent/53917.torrent?title=test" class="idownload icon16">
- <i class="ka ka16 ka-arrow-down"></i>
- </a>
- </div>
- <div class="torrentname">
- <a href="/test-t6478745.html" class="torType txtType"></a>
- <a href="/test-t6478745.html" class="normalgrey font12px plain bold"></a>
- <div class="markeredBlock torType txtType">
- <a href="/url.html" class="cellMainLink">
- <strong class="red">This should be the title</strong>
- </a>
- <span class="font11px lightgrey block">
- Posted by <i class="ka ka-verify" style="font-size: 16px;color:orange;"></i>
- <a class="plain" href="/user/riri/">riri</a> in
- <span id="cat_6478745">
- <strong><a href="/other/">Other</a> > <a href="/unsorted/">Unsorted</a></strong>
- </span>
- </span>
- </div>
- </td>
- <td class="nobr center">1 KiB</td>
- <td class="center">4</td>
- <td class="center">2&nbsp;years</td>
- <td class="green center">10</td>
- <td class="red lasttd center">1</td>
- </tr>
- <tr class="even" id="torrent_test6478745">
- <td>
- <div class="iaconbox center floatright">
- <a rel="6478745,0" class="icommentjs icon16" href="/test-t6478745.html#comment">
- <em style="font-size: 12px; margin: 0 4px 0 4px;" class="iconvalue">3</em>
- <i class="ka ka-comment"></i>
- </a>
- <a class="iverify icon16" href="/test-t6478745.html" title="Verified Torrent">
- <i class="ka ka16 ka-verify ka-green"></i>
- </a>
- <a href="#" onclick="_scq.push([]); return false;" class="partner1Button idownload icon16">
- <i class="ka ka16 ka-arrow-down partner1Button"></i>
- </a>
- <a title="Torrent magnet link"
- href="magnet:?xt=urn:btih:MAGNETURL&dn=test" class="imagnet icon16">
- <i class="ka ka16 ka-magnet"></i>
- </a>
- <a title="Download torrent file"
- href="http://torcache.net/torrent/53917.torrent?title=test" class="idownload icon16">
- <i class="ka ka16 ka-arrow-down"></i>
- </a>
- </div>
- <div class="torrentname">
- <a href="/test-t6478745.html" class="torType txtType"></a>
- <a href="/test-t6478745.html" class="normalgrey font12px plain bold"></a>
- <div class="markeredBlock torType txtType">
- <a href="/url.html" class="cellMainLink">
- <strong class="red">This should be the title</strong>
- </a>
- <span class="font11px lightgrey block">
- Posted by <i class="ka ka-verify" style="font-size: 16px;color:orange;"></i>
- <a class="plain" href="/user/riri/">riri</a> in
- <span id="cat_6478745">
- <strong><a href="/other/">Other</a> > <a href="/unsorted/">Unsorted</a></strong>
- </span>
- </span>
- </div>
- </td>
- <td class="nobr center">1 MiB</td>
- <td class="center">4</td>
- <td class="center">2&nbsp;years</td>
- <td class="green center">9</td>
- <td class="red lasttd center">1</td>
- </tr>
- <tr class="even" id="torrent_test6478745">
- <td>
- <div class="iaconbox center floatright">
- <a rel="6478745,0" class="icommentjs icon16" href="/test-t6478745.html#comment">
- <em style="font-size: 12px; margin: 0 4px 0 4px;" class="iconvalue">3</em>
- <i class="ka ka-comment"></i>
- </a>
- <a class="iverify icon16" href="/test-t6478745.html" title="Verified Torrent">
- <i class="ka ka16 ka-verify ka-green"></i>
- </a>
- <a href="#" onclick="_scq.push([]); return false;" class="partner1Button idownload icon16">
- <i class="ka ka16 ka-arrow-down partner1Button"></i>
- </a>
- <a title="Torrent magnet link"
- href="magnet:?xt=urn:btih:MAGNETURL&dn=test" class="imagnet icon16">
- <i class="ka ka16 ka-magnet"></i>
- </a>
- <a title="Download torrent file"
- href="http://torcache.net/torrent/53917.torrent?title=test" class="idownload icon16">
- <i class="ka ka16 ka-arrow-down"></i>
- </a>
- </div>
- <div class="torrentname">
- <a href="/test-t6478745.html" class="torType txtType"></a>
- <a href="/test-t6478745.html" class="normalgrey font12px plain bold"></a>
- <div class="markeredBlock torType txtType">
- <a href="/url.html" class="cellMainLink">
- <strong class="red">This should be the title</strong>
- </a>
- <span class="font11px lightgrey block">
- Posted by <i class="ka ka-verify" style="font-size: 16px;color:orange;"></i>
- <a class="plain" href="/user/riri/">riri</a> in
- <span id="cat_6478745">
- <strong><a href="/other/">Other</a> > <a href="/unsorted/">Unsorted</a></strong>
- </span>
- </span>
- </div>
- </td>
- <td class="nobr center">1 GiB</td>
- <td class="center">4</td>
- <td class="center">2&nbsp;years</td>
- <td class="green center">8</td>
- <td class="red lasttd center">1</td>
- </tr>
- <tr class="even" id="torrent_test6478745">
- <td>
- <div class="iaconbox center floatright">
- <a rel="6478745,0" class="icommentjs icon16" href="/test-t6478745.html#comment">
- <em style="font-size: 12px; margin: 0 4px 0 4px;" class="iconvalue">3</em>
- <i class="ka ka-comment"></i>
- </a>
- <a class="iverify icon16" href="/test-t6478745.html" title="Verified Torrent">
- <i class="ka ka16 ka-verify ka-green"></i>
- </a>
- <a href="#" onclick="_scq.push([]); return false;" class="partner1Button idownload icon16">
- <i class="ka ka16 ka-arrow-down partner1Button"></i>
- </a>
- <a title="Torrent magnet link"
- href="magnet:?xt=urn:btih:MAGNETURL&dn=test" class="imagnet icon16">
- <i class="ka ka16 ka-magnet"></i>
- </a>
- <a title="Download torrent file"
- href="http://torcache.net/torrent/53917.torrent?title=test" class="idownload icon16">
- <i class="ka ka16 ka-arrow-down"></i>
- </a>
- </div>
- <div class="torrentname">
- <a href="/test-t6478745.html" class="torType txtType"></a>
- <a href="/test-t6478745.html" class="normalgrey font12px plain bold"></a>
- <div class="markeredBlock torType txtType">
- <a href="/url.html" class="cellMainLink">
- <strong class="red">This should be the title</strong>
- </a>
- <span class="font11px lightgrey block">
- Posted by <i class="ka ka-verify" style="font-size: 16px;color:orange;"></i>
- <a class="plain" href="/user/riri/">riri</a> in
- <span id="cat_6478745">
- <strong><a href="/other/">Other</a> > <a href="/unsorted/">Unsorted</a></strong>
- </span>
- </span>
- </div>
- </td>
- <td class="nobr center">1 TiB</td>
- <td class="center">4</td>
- <td class="center">2&nbsp;years</td>
- <td class="green center">7</td>
- <td class="red lasttd center">1</td>
- </tr>
- <tr class="even" id="torrent_test6478745">
- <td>
- <div class="iaconbox center floatright">
- <a rel="6478745,0" class="icommentjs icon16" href="/test-t6478745.html#comment">
- <em style="font-size: 12px; margin: 0 4px 0 4px;" class="iconvalue">3</em>
- <i class="ka ka-comment"></i>
- </a>
- <a class="iverify icon16" href="/test-t6478745.html" title="Verified Torrent">
- <i class="ka ka16 ka-verify ka-green"></i>
- </a>
- <a href="#" onclick="_scq.push([]); return false;" class="partner1Button idownload icon16">
- <i class="ka ka16 ka-arrow-down partner1Button"></i>
- </a>
- <a title="Torrent magnet link"
- href="magnet:?xt=urn:btih:MAGNETURL&dn=test" class="imagnet icon16">
- <i class="ka ka16 ka-magnet"></i>
- </a>
- <a title="Download torrent file"
- href="http://torcache.net/torrent/53917.torrent?title=test" class="idownload icon16">
- <i class="ka ka16 ka-arrow-down"></i>
- </a>
- </div>
- <div class="torrentname">
- <a href="/test-t6478745.html" class="torType txtType"></a>
- <a href="/test-t6478745.html" class="normalgrey font12px plain bold"></a>
- <div class="markeredBlock torType txtType">
- <a href="/url.html" class="cellMainLink">
- <strong class="red">This should be the title</strong>
- </a>
- <span class="font11px lightgrey block">
- Posted by <i class="ka ka-verify" style="font-size: 16px;color:orange;"></i>
- <a class="plain" href="/user/riri/">riri</a> in
- <span id="cat_6478745">
- <strong><a href="/other/">Other</a> > <a href="/unsorted/">Unsorted</a></strong>
- </span>
- </span>
- </div>
- </td>
- <td class="nobr center">z bytes</td>
- <td class="center">r</td>
- <td class="center">2&nbsp;years</td>
- <td class="green center">a</td>
- <td class="red lasttd center">t</td>
- </tr>
- </table>
- """
- response = mock.Mock(text=html)
- results = kickass.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 5)
- self.assertEqual(results[0]['title'], 'This should be the title')
- self.assertEqual(results[0]['url'], 'https://kickass.cd/url.html')
- self.assertEqual(results[0]['content'], 'Posted by riri in Other > Unsorted')
- self.assertEqual(results[0]['seed'], 10)
- self.assertEqual(results[0]['leech'], 1)
- self.assertEqual(results[0]['files'], 4)
- self.assertEqual(results[0]['magnetlink'], 'magnet:?xt=urn:btih:MAGNETURL&dn=test')
- self.assertEqual(results[0]['torrentfile'], 'http://torcache.net/torrent/53917.torrent?title=test')
- self.assertEqual(results[0]['filesize'], 1000)
- self.assertEqual(results[1]['filesize'], 1000000)
- self.assertEqual(results[2]['filesize'], 1000000000)
- self.assertEqual(results[3]['filesize'], 1000000000000)
- self.assertEqual(results[4]['seed'], 0)
- self.assertEqual(results[4]['leech'], 0)
- self.assertEqual(results[4]['files'], None)
- self.assertEqual(results[4]['filesize'], None)
diff --git a/tests/unit/engines/test_mediawiki.py b/tests/unit/engines/test_mediawiki.py
deleted file mode 100644
index b86372700..000000000
--- a/tests/unit/engines/test_mediawiki.py
+++ /dev/null
@@ -1,130 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import mediawiki
-from searx.testing import SearxTestCase
-
-
-class TestMediawikiEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['language'] = 'fr_FR'
- params = mediawiki.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('wikipedia.org', params['url'])
- self.assertIn('fr', params['url'])
-
- dicto['language'] = 'all'
- params = mediawiki.request(query, dicto)
- self.assertIn('en', params['url'])
-
- mediawiki.base_url = "http://test.url/"
- mediawiki.search_url = mediawiki.base_url +\
- 'w/api.php?action=query'\
- '&list=search'\
- '&{query}'\
- '&srprop=timestamp'\
- '&format=json'\
- '&sroffset={offset}'\
- '&srlimit={limit}' # noqa
- params = mediawiki.request(query, dicto)
- self.assertIn('test.url', params['url'])
-
- def test_response(self):
- dicto = defaultdict(dict)
- dicto['language'] = 'fr'
- mediawiki.base_url = "https://{language}.wikipedia.org/"
-
- self.assertRaises(AttributeError, mediawiki.response, None)
- self.assertRaises(AttributeError, mediawiki.response, [])
- self.assertRaises(AttributeError, mediawiki.response, '')
- self.assertRaises(AttributeError, mediawiki.response, '[]')
-
- response = mock.Mock(text='{}', search_params=dicto)
- self.assertEqual(mediawiki.response(response), [])
-
- response = mock.Mock(text='{"data": []}', search_params=dicto)
- self.assertEqual(mediawiki.response(response), [])
-
- json = """
- {
- "query-continue": {
- "search": {
- "sroffset": 1
- }
- },
- "query": {
- "searchinfo": {
- "totalhits": 29721
- },
- "search": [
- {
- "ns": 0,
- "title": "This is the title étude",
- "timestamp": "2014-12-19T17:42:52Z"
- }
- ]
- }
- }
- """
- response = mock.Mock(text=json, search_params=dicto)
- results = mediawiki.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], u'This is the title étude')
- self.assertIn('fr.wikipedia.org', results[0]['url'])
- self.assertIn('This_is_the_title', results[0]['url'])
- self.assertIn('%C3%A9tude', results[0]['url'])
- self.assertEqual(results[0]['content'], '')
-
- json = """
- {
- "query-continue": {
- "search": {
- "sroffset": 1
- }
- },
- "query": {
- "searchinfo": {
- "totalhits": 29721
- },
- "search": [
- ]
- }
- }
- """
- response = mock.Mock(text=json, search_params=dicto)
- results = mediawiki.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- json = """
- {
- "query-continue": {
- "search": {
- "sroffset": 1
- }
- },
- "query": {
- }
- }
- """
- response = mock.Mock(text=json, search_params=dicto)
- results = mediawiki.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- json = r"""
- {"toto":[
- {"id":200,"name":"Artist Name",
- "link":"http:\/\/www.mediawiki.com\/artist\/1217","type":"artist"}
- ]}
- """
- response = mock.Mock(text=json, search_params=dicto)
- results = mediawiki.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_mixcloud.py b/tests/unit/engines/test_mixcloud.py
deleted file mode 100644
index 9c79a478e..000000000
--- a/tests/unit/engines/test_mixcloud.py
+++ /dev/null
@@ -1,67 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import mixcloud
-from searx.testing import SearxTestCase
-
-
-class TestMixcloudEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- params = mixcloud.request(query, dicto)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('mixcloud.com' in params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, mixcloud.response, None)
- self.assertRaises(AttributeError, mixcloud.response, [])
- self.assertRaises(AttributeError, mixcloud.response, '')
- self.assertRaises(AttributeError, mixcloud.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(mixcloud.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(mixcloud.response(response), [])
-
- json = """
- {"data":[
- {
- "user": {
- "url": "http://www.mixcloud.com/user/",
- "username": "user",
- "name": "User",
- "key": "/user/"
- },
- "key": "/user/this-is-the-url/",
- "created_time": "2014-11-14T13:30:02Z",
- "audio_length": 3728,
- "slug": "this-is-the-url",
- "name": "Title of track",
- "url": "http://www.mixcloud.com/user/this-is-the-url/",
- "updated_time": "2014-11-14T13:14:10Z"
- }
- ]}
- """
- response = mock.Mock(text=json)
- results = mixcloud.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Title of track')
- self.assertEqual(results[0]['url'], 'http://www.mixcloud.com/user/this-is-the-url/')
- self.assertEqual(results[0]['content'], 'User')
- self.assertTrue('http://www.mixcloud.com/user/this-is-the-url/' in results[0]['embedded'])
-
- json = r"""
- {"toto":[
- {"id":200,"name":"Artist Name",
- "link":"http:\/\/www.mixcloud.com\/artist\/1217","type":"artist"}
- ]}
- """
- response = mock.Mock(text=json)
- results = mixcloud.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_nyaa.py b/tests/unit/engines/test_nyaa.py
deleted file mode 100644
index 6dcafc6b7..000000000
--- a/tests/unit/engines/test_nyaa.py
+++ /dev/null
@@ -1,124 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import nyaa
-from searx.testing import SearxTestCase
-
-
-class TestNyaaEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dic = defaultdict(dict)
- dic['pageno'] = 1
- params = nyaa.request(query, dic)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('nyaa.si' in params['url'])
-
- def test_response(self):
- resp = mock.Mock(text='<html></html>')
- self.assertEqual(nyaa.response(resp), [])
-
- html = """
- <table class="table table-bordered table-hover table-striped torrent-list">
- <thead>
- <tr>
- <th class="hdr-category text-center" style="width:80px;">
- <div>Category</div>
- </th>
- <th class="hdr-name" style="width:auto;">
- <div>Name</div>
- </th>
- <th class="hdr-comments sorting text-center" title="Comments" style="width:50px;">
- <a href="/?f=0&amp;c=0_0&amp;q=Death+Parade&amp;s=comments&amp;o=desc"></a>
- <i class="fa fa-comments-o"></i>
- </th>
- <th class="hdr-link text-center" style="width:70px;">
- <div>Link</div>
- </th>
- <th class="hdr-size sorting text-center" style="width:100px;">
- <a href="/?f=0&amp;c=0_0&amp;q=Death+Parade&amp;s=size&amp;o=desc"></a>
- <div>Size</div>
- </th>
- <th class="hdr-date sorting_desc text-center" title="In local time" style="width:140px;">
- <a href="/?f=0&amp;c=0_0&amp;q=Death+Parade&amp;s=id&amp;o=asc"></a>
- <div>Date</div>
- </th>
- <th class="hdr-seeders sorting text-center" title="Seeders" style="width:50px;">
- <a href="/?f=0&amp;c=0_0&amp;q=Death+Parade&amp;s=seeders&amp;o=desc"></a>
- <i class="fa fa-arrow-up" aria-hidden="true"></i>
- </th>
- <th class="hdr-leechers sorting text-center" title="Leechers" style="width:50px;">
- <a href="/?f=0&amp;c=0_0&amp;q=Death+Parade&amp;s=leechers&amp;o=desc"></a>
- <i class="fa fa-arrow-down" aria-hidden="true"></i>
- </th>
- <th class="hdr-downloads sorting text-center" title="Completed downloads" style="width:50px;">
- <a href="/?f=0&amp;c=0_0&amp;q=Death+Parade&amp;s=downloads&amp;o=desc"></a>
- <i class="fa fa-check" aria-hidden="true"></i>
- </th>
- </tr>
- </thead>
- <tbody>
- <tr class="default">
- <td style="padding:0 4px;">
- <a href="/?c=1_2" title="Anime - English-translated">
- <img src="/static/img/icons/nyaa/1_2.png" alt="Anime - English-translated">
- </a>
- </td>
- <td colspan="2">
- <a href="/view/1" title="Sample title 1">Sample title 1</a>
- </td>
- <td class="text-center" style="white-space: nowrap;">
- <a href="/download/1.torrent"><i class="fa fa-fw fa-download"></i></a>
- <a href="magnet:?xt=urn:btih:2"><i class="fa fa-fw fa-magnet"></i></a>
- </td>
- <td class="text-center">723.7 MiB</td>
- <td class="text-center" data-timestamp="1503307456" title="1 week 3
- days 9 hours 44 minutes 39 seconds ago">2017-08-21 11:24</td>
- <td class="text-center" style="color: green;">1</td>
- <td class="text-center" style="color: red;">3</td>
- <td class="text-center">12</td>
- </tr>
- <tr class="default">
- <td style="padding:0 4px;">
- <a href="/?c=1_2" title="Anime - English-translated">
- <img src="/static/img/icons/nyaa/1_2.png" alt="Anime - English-translated">
- </a>
- </td>
- <td colspan="2">
- <a href="/view/2" title="Sample title 2">Sample title 2</a>
- </td>
- <td class="text-center" style="white-space: nowrap;">
- <a href="magnet:?xt=urn:btih:2"><i class="fa fa-fw fa-magnet"></i></a>
- </td>
- <td class="text-center">8.2 GiB</td>
- <td class="text-center" data-timestamp="1491608400" title="4 months 3
- weeks 4 days 19 hours 28 minutes 55 seconds ago">2017-04-08 01:40</td>
- <td class="text-center" style="color: green;">10</td>
- <td class="text-center" style="color: red;">1</td>
- <td class="text-center">206</td>
- </tr>
- </tbody>
- </table>
- """
-
- resp = mock.Mock(text=html)
- results = nyaa.response(resp)
-
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
-
- r = results[0]
- self.assertTrue(r['url'].find('1') >= 0)
- self.assertTrue(r['torrentfile'].find('1.torrent') >= 0)
- self.assertTrue(r['content'].find('Anime - English-translated') >= 0)
- self.assertTrue(r['content'].find('Downloaded 12 times.') >= 0)
-
- self.assertEqual(r['title'], 'Sample title 1')
- self.assertEqual(r['seed'], 1)
- self.assertEqual(r['leech'], 3)
- self.assertEqual(r['filesize'], 723700000)
-
- r = results[1]
- self.assertTrue(r['url'].find('2') >= 0)
- self.assertTrue(r['magnetlink'].find('magnet:') >= 0)
diff --git a/tests/unit/engines/test_openstreetmap.py b/tests/unit/engines/test_openstreetmap.py
deleted file mode 100644
index 7b7783f04..000000000
--- a/tests/unit/engines/test_openstreetmap.py
+++ /dev/null
@@ -1,199 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import openstreetmap
-from searx.testing import SearxTestCase
-
-
-class TestOpenstreetmapEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- params = openstreetmap.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('openstreetmap.org', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, openstreetmap.response, None)
- self.assertRaises(AttributeError, openstreetmap.response, [])
- self.assertRaises(AttributeError, openstreetmap.response, '')
- self.assertRaises(AttributeError, openstreetmap.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(openstreetmap.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(openstreetmap.response(response), [])
-
- json = """
- [
- {
- "place_id": "127732055",
- "licence": "Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright",
- "osm_type": "relation",
- "osm_id": "7444",
- "boundingbox": [
- "48.8155755",
- "48.902156",
- "2.224122",
- "2.4697602"
- ],
- "lat": "48.8565056",
- "lon": "2.3521334",
- "display_name": "This is the title",
- "class": "place",
- "type": "city",
- "importance": 0.96893459932191,
- "icon": "https://nominatim.openstreetmap.org/images/mapicons/poi_place_city.p.20.png",
- "address": {
- "city": "Paris",
- "county": "Paris",
- "state": "Île-de-France",
- "country": "France",
- "country_code": "fr"
- },
- "geojson": {
- "type": "Polygon",
- "coordinates": [
- [
- [
- 2.224122,
- 48.854199
- ]
- ]
- ]
- }
- }
- ]
- """
- response = mock.Mock(text=json)
- results = openstreetmap.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This is the title')
- self.assertEqual(results[0]['url'], 'https://openstreetmap.org/relation/7444')
- self.assertIn('coordinates', results[0]['geojson'])
- self.assertEqual(results[0]['geojson']['coordinates'][0][0][0], 2.224122)
- self.assertEqual(results[0]['geojson']['coordinates'][0][0][1], 48.854199)
- self.assertEqual(results[0]['address'], None)
- self.assertIn('48.8155755', results[0]['boundingbox'])
- self.assertIn('48.902156', results[0]['boundingbox'])
- self.assertIn('2.224122', results[0]['boundingbox'])
- self.assertIn('2.4697602', results[0]['boundingbox'])
-
- json = """
- [
- {
- "place_id": "127732055",
- "licence": "Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright",
- "osm_type": "relation",
- "osm_id": "7444",
- "boundingbox": [
- "48.8155755",
- "48.902156",
- "2.224122",
- "2.4697602"
- ],
- "lat": "48.8565056",
- "lon": "2.3521334",
- "display_name": "This is the title",
- "class": "tourism",
- "type": "city",
- "importance": 0.96893459932191,
- "icon": "https://nominatim.openstreetmap.org/images/mapicons/poi_place_city.p.20.png",
- "address": {
- "city": "Paris",
- "county": "Paris",
- "state": "Île-de-France",
- "country": "France",
- "country_code": "fr",
- "address29": "Address"
- },
- "geojson": {
- "type": "Polygon",
- "coordinates": [
- [
- [
- 2.224122,
- 48.854199
- ]
- ]
- ]
- }
- },
- {
- "place_id": "127732055",
- "licence": "Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright",
- "osm_type": "relation",
- "osm_id": "7444",
- "boundingbox": [
- "48.8155755",
- "48.902156",
- "2.224122",
- "2.4697602"
- ],
- "lat": "48.8565056",
- "lon": "2.3521334",
- "display_name": "This is the title",
- "class": "tourism",
- "type": "city",
- "importance": 0.96893459932191,
- "icon": "https://nominatim.openstreetmap.org/images/mapicons/poi_place_city.p.20.png",
- "address": {
- "city": "Paris",
- "county": "Paris",
- "state": "Île-de-France",
- "country": "France",
- "postcode": 75000,
- "country_code": "fr"
- },
- "geojson": {
- "type": "Polygon",
- "coordinates": [
- [
- [
- 2.224122,
- 48.854199
- ]
- ]
- ]
- }
- },
- {
- "place_id": "127732055",
- "licence": "Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright",
- "osm_type": "node",
- "osm_id": "7444",
- "boundingbox": [
- "48.8155755",
- "48.902156",
- "2.224122",
- "2.4697602"
- ],
- "lat": "48.8565056",
- "lon": "2.3521334",
- "display_name": "This is the title",
- "class": "tourism",
- "type": "city",
- "importance": 0.96893459932191,
- "icon": "https://nominatim.openstreetmap.org/images/mapicons/poi_place_city.p.20.png",
- "address": {
- "city": "Paris",
- "county": "Paris",
- "state": "Île-de-France",
- "country": "France",
- "country_code": "fr",
- "address29": "Address"
- }
- }
- ]
- """
- response = mock.Mock(text=json)
- results = openstreetmap.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 3)
- self.assertIn('48.8565056', results[2]['geojson']['coordinates'])
- self.assertIn('2.3521334', results[2]['geojson']['coordinates'])
diff --git a/tests/unit/engines/test_pdbe.py b/tests/unit/engines/test_pdbe.py
deleted file mode 100644
index ea5adf9dc..000000000
--- a/tests/unit/engines/test_pdbe.py
+++ /dev/null
@@ -1,109 +0,0 @@
-import mock
-from collections import defaultdict
-from searx.engines import pdbe
-from searx.testing import SearxTestCase
-
-
-class TestPdbeEngine(SearxTestCase):
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- params = pdbe.request(query, dicto)
- self.assertTrue('url' in params)
- self.assertTrue('ebi.ac.uk' in params['url'])
- self.assertTrue('data' in params)
- self.assertTrue('q' in params['data'])
- self.assertTrue(query in params['data']['q'])
- self.assertTrue('wt' in params['data'])
- self.assertTrue('json' in params['data']['wt'])
- self.assertTrue('method' in params)
- self.assertTrue(params['method'] == 'POST')
-
- def test_response(self):
- self.assertRaises(AttributeError, pdbe.response, None)
- self.assertRaises(AttributeError, pdbe.response, [])
- self.assertRaises(AttributeError, pdbe.response, '')
- self.assertRaises(AttributeError, pdbe.response, '[]')
-
- json = """
-{
- "response": {
- "docs": [
- {
- "citation_title": "X-ray crystal structure of ferric Aplysia limacina myoglobin in different liganded states.",
- "citation_year": 1993,
- "entry_author_list": [
- "Conti E, Moser C, Rizzi M, Mattevi A, Lionetti C, Coda A, Ascenzi P, Brunori M, Bolognesi M"
- ],
- "journal": "J. Mol. Biol.",
- "journal_page": "498-508",
- "journal_volume": "233",
- "pdb_id": "2fal",
- "status": "REL",
- "title": "X-RAY CRYSTAL STRUCTURE OF FERRIC APLYSIA LIMACINA MYOGLOBIN IN DIFFERENT LIGANDED STATES"
- }
- ],
- "numFound": 1,
- "start": 0
- },
- "responseHeader": {
- "QTime": 0,
- "params": {
- "q": "2fal",
- "wt": "json"
- },
- "status": 0
- }
-}
-"""
-
- response = mock.Mock(text=json)
- results = pdbe.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'],
- 'X-RAY CRYSTAL STRUCTURE OF FERRIC APLYSIA LIMACINA MYOGLOBIN IN DIFFERENT LIGANDED STATES')
- self.assertEqual(results[0]['url'], pdbe.pdbe_entry_url.format(pdb_id='2fal'))
- self.assertEqual(results[0]['img_src'], pdbe.pdbe_preview_url.format(pdb_id='2fal'))
- self.assertTrue('Conti E' in results[0]['content'])
- self.assertTrue('X-ray crystal structure of ferric Aplysia limacina myoglobin in different liganded states.' in
- results[0]['content'])
- self.assertTrue('1993' in results[0]['content'])
-
- # Testing proper handling of PDB entries marked as obsolete
- json = """
-{
- "response": {
- "docs": [
- {
- "citation_title": "Obsolete entry test",
- "citation_year": 2016,
- "entry_author_list": ["Doe J"],
- "journal": "J. Obs.",
- "journal_page": "1-2",
- "journal_volume": "1",
- "pdb_id": "xxxx",
- "status": "OBS",
- "title": "OBSOLETE ENTRY TEST",
- "superseded_by": "yyyy"
- }
- ],
- "numFound": 1,
- "start": 0
- },
- "responseHeader": {
- "QTime": 0,
- "params": {
- "q": "xxxx",
- "wt": "json"
- },
- "status": 0
- }
-}
-"""
- response = mock.Mock(text=json)
- results = pdbe.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'OBSOLETE ENTRY TEST (OBSOLETE)')
- self.assertTrue(results[0]['content'].startswith('This entry has been superseded by'))
diff --git a/tests/unit/engines/test_photon.py b/tests/unit/engines/test_photon.py
deleted file mode 100644
index 734497884..000000000
--- a/tests/unit/engines/test_photon.py
+++ /dev/null
@@ -1,166 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import photon
-from searx.testing import SearxTestCase
-
-
-class TestPhotonEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['language'] = 'all'
- params = photon.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('photon.komoot.de', params['url'])
-
- dicto['language'] = 'all'
- params = photon.request(query, dicto)
- self.assertNotIn('lang', params['url'])
-
- dicto['language'] = 'al'
- params = photon.request(query, dicto)
- self.assertNotIn('lang', params['url'])
-
- dicto['language'] = 'fr'
- params = photon.request(query, dicto)
- self.assertIn('fr', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, photon.response, None)
- self.assertRaises(AttributeError, photon.response, [])
- self.assertRaises(AttributeError, photon.response, '')
- self.assertRaises(AttributeError, photon.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(photon.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(photon.response(response), [])
-
- json = """
- {
- "features": [
- {
- "properties": {
- "osm_key": "waterway",
- "extent": [
- -1.4508446,
- 51.1614997,
- -1.4408036,
- 51.1525635
- ],
- "name": "This is the title",
- "state": "England",
- "osm_id": 114823817,
- "osm_type": "W",
- "osm_value": "river",
- "city": "Test Valley",
- "country": "United Kingdom"
- },
- "type": "Feature",
- "geometry": {
- "type": "Point",
- "coordinates": [
- -1.4458571,
- 51.1576661
- ]
- }
- },
- {
- "properties": {
- "osm_key": "place",
- "street": "Rue",
- "state": "Ile-de-France",
- "osm_id": 129211377,
- "osm_type": "R",
- "housenumber": "10",
- "postcode": "75011",
- "osm_value": "house",
- "city": "Paris",
- "country": "France"
- },
- "type": "Feature",
- "geometry": {
- "type": "Point",
- "coordinates": [
- 2.3725025,
- 48.8654481
- ]
- }
- },
- {
- "properties": {
- "osm_key": "amenity",
- "street": "Allée",
- "name": "Bibliothèque",
- "state": "Ile-de-France",
- "osm_id": 1028573132,
- "osm_type": "N",
- "postcode": "75001",
- "osm_value": "library",
- "city": "Paris",
- "country": "France"
- },
- "type": "Feature",
- "geometry": {
- "type": "Point",
- "coordinates": [
- 2.3445634,
- 48.862494
- ]
- }
- },
- {
- "properties": {
- "osm_key": "amenity",
- "osm_id": 1028573132,
- "osm_type": "Y",
- "postcode": "75001",
- "osm_value": "library",
- "city": "Paris",
- "country": "France"
- },
- "type": "Feature",
- "geometry": {
- "type": "Point",
- "coordinates": [
- 2.3445634,
- 48.862494
- ]
- }
- },
- {
- }
- ],
- "type": "FeatureCollection"
- }
- """
- response = mock.Mock(text=json)
- results = photon.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 3)
- self.assertEqual(results[0]['title'], 'This is the title')
- self.assertEqual(results[0]['content'], '')
- self.assertEqual(results[0]['longitude'], -1.4458571)
- self.assertEqual(results[0]['latitude'], 51.1576661)
- self.assertIn(-1.4508446, results[0]['boundingbox'])
- self.assertIn(51.1614997, results[0]['boundingbox'])
- self.assertIn(-1.4408036, results[0]['boundingbox'])
- self.assertIn(51.1525635, results[0]['boundingbox'])
- self.assertIn('type', results[0]['geojson'])
- self.assertEqual(results[0]['geojson']['type'], 'Point')
- self.assertEqual(results[0]['address'], None)
- self.assertEqual(results[0]['osm']['type'], 'way')
- self.assertEqual(results[0]['osm']['id'], 114823817)
- self.assertEqual(results[0]['url'], 'https://openstreetmap.org/way/114823817')
- self.assertEqual(results[1]['osm']['type'], 'relation')
- self.assertEqual(results[2]['address']['name'], u'Bibliothèque')
- self.assertEqual(results[2]['address']['house_number'], None)
- self.assertEqual(results[2]['address']['locality'], 'Paris')
- self.assertEqual(results[2]['address']['postcode'], '75001')
- self.assertEqual(results[2]['address']['country'], 'France')
- self.assertEqual(results[2]['osm']['type'], 'node')
diff --git a/tests/unit/engines/test_piratebay.py b/tests/unit/engines/test_piratebay.py
deleted file mode 100644
index 89a78e796..000000000
--- a/tests/unit/engines/test_piratebay.py
+++ /dev/null
@@ -1,166 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import piratebay
-from searx.testing import SearxTestCase
-
-
-class TestPiratebayEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['category'] = 'Toto'
- params = piratebay.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('piratebay.org', params['url'])
- self.assertIn('0', params['url'])
-
- dicto['category'] = 'music'
- params = piratebay.request(query, dicto)
- self.assertIn('100', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, piratebay.response, None)
- self.assertRaises(AttributeError, piratebay.response, [])
- self.assertRaises(AttributeError, piratebay.response, '')
- self.assertRaises(AttributeError, piratebay.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(piratebay.response(response), [])
-
- html = """
- <table id="searchResult">
- <tr>
- </tr>
- <tr>
- <td class="vertTh">
- <center>
- <a href="#" title="More from this category">Anime</a><br/>
- (<a href="#" title="More from this category">Anime</a>)
- </center>
- </td>
- <td>
- <div class="detName">
- <a href="/this.is.the.link" class="detLink" title="Title">
- This is the title
- </a>
- </div>
- <a href="magnet:?xt=urn:btih:MAGNETLINK" title="Download this torrent using magnet">
- <img src="/static/img/icon-magnet.gif" alt="Magnet link"/>
- </a>
- <a href="http://torcache.net/torrent/TORRENTFILE.torrent" title="Download this torrent">
- <img src="/static/img/dl.gif" class="dl" alt="Download"/>
- </a>
- <a href="/user/HorribleSubs">
- <img src="/static/img/vip.gif" alt="VIP" title="VIP" style="width:11px;" border='0'/>
- </a>
- <img src="/static/img/11x11p.png"/>
- <font class="detDesc">
- This is the content <span>and should be</span> OK
- </font>
- </td>
- <td align="right">13</td>
- <td align="right">334</td>
- </tr>
- <tr>
- <td class="vertTh">
- <center>
- <a href="#" title="More from this category">Anime</a><br/>
- (<a href="#" title="More from this category">Anime</a>)
- </center>
- </td>
- <td>
- <div class="detName">
- <a href="/this.is.the.link" class="detLink" title="Title">
- This is the title
- </a>
- </div>
- <a href="magnet:?xt=urn:btih:MAGNETLINK" title="Download this torrent using magnet">
- <img src="/static/img/icon-magnet.gif" alt="Magnet link"/>
- </a>
- <a href="/user/HorribleSubs">
- <img src="/static/img/vip.gif" alt="VIP" title="VIP" style="width:11px;" border='0'/>
- </a>
- <img src="/static/img/11x11p.png"/>
- <font class="detDesc">
- This is the content <span>and should be</span> OK
- </font>
- </td>
- <td align="right">13</td>
- <td align="right">334</td>
- </tr>
- </table>
- """
- response = mock.Mock(text=html)
- results = piratebay.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
- self.assertEqual(results[0]['title'], 'This is the title')
- self.assertEqual(results[0]['url'], 'https://thepiratebay.org/this.is.the.link')
- self.assertEqual(results[0]['content'], 'This is the content and should be OK')
- self.assertEqual(results[0]['seed'], 13)
- self.assertEqual(results[0]['leech'], 334)
- self.assertEqual(results[0]['magnetlink'], 'magnet:?xt=urn:btih:MAGNETLINK')
- self.assertEqual(results[0]['torrentfile'], 'http://torcache.net/torrent/TORRENTFILE.torrent')
-
- self.assertEqual(results[1]['torrentfile'], None)
-
- html = """
- <table id="searchResult">
- <tr>
- </tr>
- <tr>
- <td class="vertTh">
- <center>
- <a href="#" title="More from this category">Anime</a><br/>
- (<a href="#" title="More from this category">Anime</a>)
- </center>
- </td>
- <td>
- <div class="detName">
- <a href="/this.is.the.link" class="detLink" title="Title">
- This is the title
- </a>
- </div>
- <a href="magnet:?xt=urn:btih:MAGNETLINK" title="Download this torrent using magnet">
- <img src="/static/img/icon-magnet.gif" alt="Magnet link"/>
- </a>
- <a href="http://torcache.net/torrent/TORRENTFILE.torrent" title="Download this torrent">
- <img src="/static/img/dl.gif" class="dl" alt="Download"/>
- </a>
- <a href="/user/HorribleSubs">
- <img src="/static/img/vip.gif" alt="VIP" title="VIP" style="width:11px;" border='0'/>
- </a>
- <img src="/static/img/11x11p.png"/>
- <font class="detDesc">
- This is the content <span>and should be</span> OK
- </font>
- </td>
- <td align="right">s</td>
- <td align="right">d</td>
- </tr>
- </table>
- """
- response = mock.Mock(text=html)
- results = piratebay.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This is the title')
- self.assertEqual(results[0]['url'], 'https://thepiratebay.org/this.is.the.link')
- self.assertEqual(results[0]['content'], 'This is the content and should be OK')
- self.assertEqual(results[0]['seed'], 0)
- self.assertEqual(results[0]['leech'], 0)
- self.assertEqual(results[0]['magnetlink'], 'magnet:?xt=urn:btih:MAGNETLINK')
- self.assertEqual(results[0]['torrentfile'], 'http://torcache.net/torrent/TORRENTFILE.torrent')
-
- html = """
- <table id="searchResult">
- </table>
- """
- response = mock.Mock(text=html)
- results = piratebay.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_qwant.py b/tests/unit/engines/test_qwant.py
deleted file mode 100644
index 6611264f8..000000000
--- a/tests/unit/engines/test_qwant.py
+++ /dev/null
@@ -1,339 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import qwant
-from searx.testing import SearxTestCase
-
-
-class TestQwantEngine(SearxTestCase):
-
- def test_request(self):
- qwant.supported_languages = ['en-US', 'fr-CA', 'fr-FR']
- qwant.language_aliases = {}
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- dicto['language'] = 'fr-FR'
- qwant.categories = ['']
- params = qwant.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('web', params['url'])
- self.assertIn('qwant.com', params['url'])
- self.assertIn('fr_fr', params['url'])
-
- dicto['language'] = 'all'
- qwant.categories = ['news']
- params = qwant.request(query, dicto)
- self.assertFalse('fr' in params['url'])
- self.assertIn('news', params['url'])
-
- dicto['language'] = 'fr'
- params = qwant.request(query, dicto)
- self.assertIn('fr_fr', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, qwant.response, None)
- self.assertRaises(AttributeError, qwant.response, [])
- self.assertRaises(AttributeError, qwant.response, '')
- self.assertRaises(AttributeError, qwant.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(qwant.response(response), [])
-
- response = mock.Mock(text='{"data": {}}')
- self.assertEqual(qwant.response(response), [])
-
- json = """
- {
- "status": "success",
- "data": {
- "query": {
- "locale": "en_us",
- "query": "Test",
- "offset": 10
- },
- "result": {
- "items": [
- {
- "title": "Title",
- "score": 9999,
- "url": "http://www.url.xyz",
- "source": "...",
- "desc": "Description",
- "date": "",
- "_id": "db0aadd62c2a8565567ffc382f5c61fa",
- "favicon": "https://s.qwant.com/fav.ico"
- }
- ],
- "filters": []
- },
- "cache": {
- "key": "e66aa864c00147a0e3a16ff7a5efafde",
- "created": 1433092754,
- "expiration": 259200,
- "status": "miss",
- "age": 0
- }
- }
- }
- """
- response = mock.Mock(text=json)
- qwant.categories = ['general']
- results = qwant.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Title')
- self.assertEqual(results[0]['url'], 'http://www.url.xyz')
- self.assertEqual(results[0]['content'], 'Description')
-
- json = """
- {
- "status": "success",
- "data": {
- "query": {
- "locale": "en_us",
- "query": "Test",
- "offset": 10
- },
- "result": {
- "items": [
- {
- "title": "Title",
- "score": 9999,
- "url": "http://www.url.xyz",
- "source": "...",
- "media": "http://image.jpg",
- "desc": "",
- "thumbnail": "http://thumbnail.jpg",
- "date": "",
- "_id": "db0aadd62c2a8565567ffc382f5c61fa",
- "favicon": "https://s.qwant.com/fav.ico"
- }
- ],
- "filters": []
- },
- "cache": {
- "key": "e66aa864c00147a0e3a16ff7a5efafde",
- "created": 1433092754,
- "expiration": 259200,
- "status": "miss",
- "age": 0
- }
- }
- }
- """
- response = mock.Mock(text=json)
- qwant.categories = ['images']
- results = qwant.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Title')
- self.assertEqual(results[0]['url'], 'http://www.url.xyz')
- self.assertEqual(results[0]['content'], '')
- self.assertEqual(results[0]['thumbnail_src'], 'http://thumbnail.jpg')
- self.assertEqual(results[0]['img_src'], 'http://image.jpg')
-
- json = """
- {
- "status": "success",
- "data": {
- "query": {
- "locale": "en_us",
- "query": "Test",
- "offset": 10
- },
- "result": {
- "items": [
- {
- "title": "Title",
- "score": 9999,
- "url": "http://www.url.xyz",
- "source": "...",
- "desc": "Description",
- "date": 1433260920,
- "_id": "db0aadd62c2a8565567ffc382f5c61fa",
- "favicon": "https://s.qwant.com/fav.ico"
- }
- ],
- "filters": []
- },
- "cache": {
- "key": "e66aa864c00147a0e3a16ff7a5efafde",
- "created": 1433092754,
- "expiration": 259200,
- "status": "miss",
- "age": 0
- }
- }
- }
- """
- response = mock.Mock(text=json)
- qwant.categories = ['news']
- results = qwant.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Title')
- self.assertEqual(results[0]['url'], 'http://www.url.xyz')
- self.assertEqual(results[0]['content'], 'Description')
- self.assertIn('publishedDate', results[0])
-
- json = """
- {
- "status": "success",
- "data": {
- "query": {
- "locale": "en_us",
- "query": "Test",
- "offset": 10
- },
- "result": {
- "items": [
- {
- "title": "Title",
- "score": 9999,
- "url": "http://www.url.xyz",
- "source": "...",
- "desc": "Description",
- "date": 1433260920,
- "_id": "db0aadd62c2a8565567ffc382f5c61fa",
- "favicon": "https://s.qwant.com/fav.ico"
- }
- ],
- "filters": []
- },
- "cache": {
- "key": "e66aa864c00147a0e3a16ff7a5efafde",
- "created": 1433092754,
- "expiration": 259200,
- "status": "miss",
- "age": 0
- }
- }
- }
- """
- response = mock.Mock(text=json)
- qwant.categories = ['social media']
- results = qwant.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Title')
- self.assertEqual(results[0]['url'], 'http://www.url.xyz')
- self.assertEqual(results[0]['content'], 'Description')
- self.assertIn('publishedDate', results[0])
-
- json = """
- {
- "status": "success",
- "data": {
- "query": {
- "locale": "en_us",
- "query": "Test",
- "offset": 10
- },
- "result": {
- "items": [
- {
- "title": "Title",
- "score": 9999,
- "url": "http://www.url.xyz",
- "source": "...",
- "desc": "Description",
- "date": 1433260920,
- "_id": "db0aadd62c2a8565567ffc382f5c61fa",
- "favicon": "https://s.qwant.com/fav.ico"
- }
- ],
- "filters": []
- },
- "cache": {
- "key": "e66aa864c00147a0e3a16ff7a5efafde",
- "created": 1433092754,
- "expiration": 259200,
- "status": "miss",
- "age": 0
- }
- }
- }
- """
- response = mock.Mock(text=json)
- qwant.categories = ['']
- results = qwant.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- json = """
- {
- "status": "success",
- "data": {
- "query": {
- "locale": "en_us",
- "query": "Test",
- "offset": 10
- },
- "result": {
- "filters": []
- },
- "cache": {
- "key": "e66aa864c00147a0e3a16ff7a5efafde",
- "created": 1433092754,
- "expiration": 259200,
- "status": "miss",
- "age": 0
- }
- }
- }
- """
- response = mock.Mock(text=json)
- results = qwant.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- json = """
- {
- "status": "success",
- "data": {
- "query": {
- "locale": "en_us",
- "query": "Test",
- "offset": 10
- },
- "cache": {
- "key": "e66aa864c00147a0e3a16ff7a5efafde",
- "created": 1433092754,
- "expiration": 259200,
- "status": "miss",
- "age": 0
- }
- }
- }
- """
- response = mock.Mock(text=json)
- results = qwant.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- json = """
- {
- "status": "success"
- }
- """
- response = mock.Mock(text=json)
- results = qwant.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- def test_fetch_supported_languages(self):
- page = """some code...
- config_set('project.regionalisation', {"continents":{},"languages":
- {"de":{"code":"de","name":"Deutsch","countries":["DE","CH","AT"]},
- "it":{"code":"it","name":"Italiano","countries":["IT","CH"]}}});
- some more code..."""
- response = mock.Mock(text=page)
- languages = qwant._fetch_supported_languages(response)
- self.assertEqual(type(languages), list)
- self.assertEqual(len(languages), 5)
- self.assertIn('de-DE', languages)
- self.assertIn('de-CH', languages)
- self.assertIn('de-AT', languages)
- self.assertIn('it-IT', languages)
- self.assertIn('it-CH', languages)
diff --git a/tests/unit/engines/test_reddit.py b/tests/unit/engines/test_reddit.py
deleted file mode 100644
index 9c94f4e2b..000000000
--- a/tests/unit/engines/test_reddit.py
+++ /dev/null
@@ -1,71 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import reddit
-from searx.testing import SearxTestCase
-from datetime import datetime
-
-
-class TestRedditEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dic = defaultdict(dict)
- params = reddit.request(query, dic)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('reddit.com' in params['url'])
-
- def test_response(self):
- resp = mock.Mock(text='{}')
- self.assertEqual(reddit.response(resp), [])
-
- json = """
- {
- "kind": "Listing",
- "data": {
- "children": [{
- "data": {
- "url": "http://google2.com/",
- "permalink": "http://google.com/",
- "title": "Title number one",
- "selftext": "Sample",
- "created_utc": 1401219957.0,
- "thumbnail": "http://image.com/picture.jpg"
- }
- }, {
- "data": {
- "url": "https://reddit2.com/",
- "permalink": "https://reddit.com/",
- "title": "Title number two",
- "selftext": "Dominus vobiscum",
- "created_utc": 1438792533.0,
- "thumbnail": "self"
- }
- }]
- }
- }
- """
-
- resp = mock.Mock(text=json)
- results = reddit.response(resp)
-
- self.assertEqual(len(results), 2)
- self.assertEqual(type(results), list)
-
- # testing first result (picture)
- r = results[0]
- self.assertEqual(r['url'], 'http://google.com/')
- self.assertEqual(r['title'], 'Title number one')
- self.assertEqual(r['template'], 'images.html')
- self.assertEqual(r['img_src'], 'http://google2.com/')
- self.assertEqual(r['thumbnail_src'], 'http://image.com/picture.jpg')
-
- # testing second result (self-post)
- r = results[1]
- self.assertEqual(r['url'], 'https://reddit.com/')
- self.assertEqual(r['title'], 'Title number two')
- self.assertEqual(r['content'], 'Dominus vobiscum')
- created = datetime.fromtimestamp(1438792533.0)
- self.assertEqual(r['publishedDate'], created)
- self.assertTrue('thumbnail_src' not in r)
- self.assertTrue('img_src' not in r)
diff --git a/tests/unit/engines/test_scanr_structures.py b/tests/unit/engines/test_scanr_structures.py
deleted file mode 100644
index a7b9e9185..000000000
--- a/tests/unit/engines/test_scanr_structures.py
+++ /dev/null
@@ -1,175 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import scanr_structures
-from searx.testing import SearxTestCase
-
-
-class TestScanrStructuresEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- params = scanr_structures.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['data'])
- self.assertIn('scanr.enseignementsup-recherche.gouv.fr', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, scanr_structures.response, None)
- self.assertRaises(AttributeError, scanr_structures.response, [])
- self.assertRaises(AttributeError, scanr_structures.response, '')
- self.assertRaises(AttributeError, scanr_structures.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(scanr_structures.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(scanr_structures.response(response), [])
-
- json = u"""
- {
- "request":
- {
- "query":"test_query",
- "page":1,
- "pageSize":20,
- "sortOrder":"RELEVANCY",
- "sortDirection":"ASC",
- "searchField":"ALL",
- "from":0
- },
- "total":2471,
- "results":[
- {
- "id":"200711886U",
- "label":"Laboratoire d'Informatique de Grenoble",
- "kind":"RNSR",
- "publicEntity":true,
- "address":{"city":"Grenoble","departement":"38"},
- "logo":"/static/logos/200711886U.png",
- "acronym":"LIG",
- "type":{"code":"UR","label":"Unit\xe9 de recherche"},
- "level":2,
- "institutions":[
- {
- "id":"193819125",
- "label":"Grenoble INP",
- "acronym":"IPG",
- "code":"UMR 5217"
- },
- {
- "id":"130021397",
- "label":"Universit\xe9 de Grenoble Alpes",
- "acronym":"UGA",
- "code":"UMR 5217"
- },
- {
- "id":"180089013",
- "label":"Centre national de la recherche scientifique",
- "acronym":"CNRS",
- "code":"UMR 5217"
- },
- {
- "id":"180089047",
- "label":"Institut national de recherche en informatique et en automatique",
- "acronym":"Inria",
- "code":"UMR 5217"
- }
- ],
- "highlights":[
- {
- "type":"projects",
- "value":"linguicielles d\xe9velopp\xe9s jusqu'ici par le GETALP\
- du <strong>LIG</strong> en tant que prototypes op\xe9rationnels.\
-\\r\\nDans le contexte"
- },
- {
- "type":"acronym",
- "value":"<strong>LIG</strong>"
- },
- {
- "type":"websiteContents",
- "value":"S\xe9lection\\nListe structures\\nD\xe9tail\\n\
- Accueil\\n200711886U : <strong>LIG</strong>\
- Laboratoire d'Informatique de Grenoble Unit\xe9 de recherche"},
- {
- "type":"publications",
- "value":"de noms. Nous avons d'abord d\xe9velopp\xe9 LOOV \
- (pour <strong>Lig</strong> Overlaid OCR in Vid\xe9o), \
- un outil d'extraction des"
- }
- ]
- },
- {
- "id":"199511665F",
- "label":"Laboratoire Bordelais de Recherche en Informatique",
- "kind":"RNSR",
- "publicEntity":true,
- "address":{"city":"Talence","departement":"33"},
- "logo":"/static/logos/199511665F.png",
- "acronym":"LaBRI",
- "type":{"code":"UR","label":"Unit\xe9 de recherche"},
- "level":2,
- "institutions":[
- {
- "id":"130006356",
- "label":"Institut polytechnique de Bordeaux",
- "acronym":"IPB",
- "code":"UMR 5800"
- },
- {
- "id":"130018351",
- "label":"Universit\xe9 de Bordeaux",
- "acronym":null,
- "code":"UMR 5800"
- },
- {
- "id":"180089013",
- "label":"Centre national de la recherche scientifique",
- "acronym":"CNRS",
- "code":"UMR 5800"
- },
- {
- "id":"180089047",
- "label":"Institut national de recherche en informatique et en automatique",
- "acronym":"Inria",
- "code":"UMR 5800"
- }
- ],
- "highlights":[
- {
- "type":"websiteContents",
- "value":"Samia Kerdjoudj\\n2016-07-05\\nDouble-exponential\
- and <strong>triple</strong>-exponential bounds for\
- choosability problems parameterized"
- },
- {
- "type":"publications",
- "value":"de cam\xe9ras install\xe9es dans les lieux publiques \
- a <strong>tripl\xe9</strong> en 2009, passant de 20 000 \
- \xe0 60 000. Malgr\xe9 le"
- }
- ]
- }
- ]
- }
- """
- response = mock.Mock(text=json)
- results = scanr_structures.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
- self.assertEqual(results[0]['title'], u"Laboratoire d'Informatique de Grenoble")
- self.assertEqual(results[0]['url'], 'https://scanr.enseignementsup-recherche.gouv.fr/structure/200711886U')
- self.assertEqual(results[0]['content'],
- u"linguicielles d\xe9velopp\xe9s jusqu'ici par le GETALP "
- u"du LIG en tant que prototypes "
- u"op\xe9rationnels. Dans le contexte")
- self.assertEqual(results[1]['img_src'],
- 'https://scanr.enseignementsup-recherche.gouv.fr//static/logos/199511665F.png')
- self.assertEqual(results[1]['content'],
- "Samia Kerdjoudj 2016-07-05 Double-exponential and"
- " triple-exponential bounds for "
- "choosability problems parameterized")
- self.assertEqual(results[1]['url'], 'https://scanr.enseignementsup-recherche.gouv.fr/structure/199511665F')
- self.assertEqual(results[1]['title'], u"Laboratoire Bordelais de Recherche en Informatique")
diff --git a/tests/unit/engines/test_searchcode_code.py b/tests/unit/engines/test_searchcode_code.py
deleted file mode 100644
index 955aea111..000000000
--- a/tests/unit/engines/test_searchcode_code.py
+++ /dev/null
@@ -1,75 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import searchcode_code
-from searx.testing import SearxTestCase
-
-
-class TestSearchcodeCodeEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- params = searchcode_code.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('searchcode.com', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, searchcode_code.response, None)
- self.assertRaises(AttributeError, searchcode_code.response, [])
- self.assertRaises(AttributeError, searchcode_code.response, '')
- self.assertRaises(AttributeError, searchcode_code.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(searchcode_code.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(searchcode_code.response(response), [])
-
- json = """
- {
- "matchterm": "test",
- "previouspage": null,
- "searchterm": "test",
- "query": "test",
- "total": 1000,
- "page": 0,
- "nextpage": 1,
- "results": [
- {
- "repo": "https://repo",
- "linescount": 1044,
- "location": "/tests",
- "name": "Name",
- "url": "https://url",
- "md5hash": "ecac6e479edd2b9406c9e08603cec655",
- "lines": {
- "1": "// Test 011",
- "2": "// Source: "
- },
- "id": 51223527,
- "filename": "File.CPP"
- }
- ]
- }
- """
- response = mock.Mock(text=json)
- results = searchcode_code.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Name - File.CPP')
- self.assertEqual(results[0]['url'], 'https://url')
- self.assertEqual(results[0]['repository'], 'https://repo')
- self.assertEqual(results[0]['code_language'], 'cpp')
-
- json = r"""
- {"toto":[
- {"id":200,"name":"Artist Name",
- "link":"http:\/\/www.searchcode_code.com\/artist\/1217","type":"artist"}
- ]}
- """
- response = mock.Mock(text=json)
- results = searchcode_code.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_searchcode_doc.py b/tests/unit/engines/test_searchcode_doc.py
deleted file mode 100644
index d02bb7a44..000000000
--- a/tests/unit/engines/test_searchcode_doc.py
+++ /dev/null
@@ -1,70 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import searchcode_doc
-from searx.testing import SearxTestCase
-
-
-class TestSearchcodeDocEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- params = searchcode_doc.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('searchcode.com', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, searchcode_doc.response, None)
- self.assertRaises(AttributeError, searchcode_doc.response, [])
- self.assertRaises(AttributeError, searchcode_doc.response, '')
- self.assertRaises(AttributeError, searchcode_doc.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(searchcode_doc.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(searchcode_doc.response(response), [])
-
- json = """
- {
- "matchterm": "test",
- "previouspage": null,
- "searchterm": "test",
- "query": "test",
- "total": 60,
- "page": 0,
- "nextpage": 1,
- "results": [
- {
- "synopsis": "Synopsis",
- "displayname": null,
- "name": "test",
- "url": "http://url",
- "type": "Type",
- "icon": null,
- "namespace": "Namespace",
- "description": "Description"
- }
- ]
- }
- """
- response = mock.Mock(text=json)
- results = searchcode_doc.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], '[Type] Namespace test')
- self.assertEqual(results[0]['url'], 'http://url')
- self.assertIn('Description', results[0]['content'])
-
- json = r"""
- {"toto":[
- {"id":200,"name":"Artist Name",
- "link":"http:\/\/www.searchcode_doc.com\/artist\/1217","type":"artist"}
- ]}
- """
- response = mock.Mock(text=json)
- results = searchcode_doc.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_soundcloud.py b/tests/unit/engines/test_soundcloud.py
deleted file mode 100644
index 3077d3b4b..000000000
--- a/tests/unit/engines/test_soundcloud.py
+++ /dev/null
@@ -1,192 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import soundcloud
-from searx.testing import SearxTestCase
-from searx.url_utils import quote_plus
-
-
-class TestSoundcloudEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- params = soundcloud.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('soundcloud.com', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, soundcloud.response, None)
- self.assertRaises(AttributeError, soundcloud.response, [])
- self.assertRaises(AttributeError, soundcloud.response, '')
- self.assertRaises(AttributeError, soundcloud.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(soundcloud.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(soundcloud.response(response), [])
-
- json = """
- {
- "collection": [
- {
- "kind": "track",
- "id": 159723640,
- "created_at": "2014/07/22 00:51:21 +0000",
- "user_id": 2976616,
- "duration": 303780,
- "commentable": true,
- "state": "finished",
- "original_content_size": 13236349,
- "last_modified": "2015/01/31 15:14:50 +0000",
- "sharing": "public",
- "tag_list": "seekae flume",
- "permalink": "seekae-test-recognise-flume-re-work",
- "streamable": true,
- "embeddable_by": "all",
- "downloadable": true,
- "purchase_url": "http://www.facebook.com/seekaemusic",
- "label_id": null,
- "purchase_title": "Seekae",
- "genre": "freedownload",
- "title": "This is the title",
- "description": "This is the content",
- "label_name": "Future Classic",
- "release": "",
- "track_type": "remix",
- "key_signature": "",
- "isrc": "",
- "video_url": null,
- "bpm": null,
- "release_year": 2014,
- "release_month": 7,
- "release_day": 22,
- "original_format": "mp3",
- "license": "all-rights-reserved",
- "uri": "https://api.soundcloud.com/tracks/159723640",
- "user": {
- "id": 2976616,
- "kind": "user",
- "permalink": "flume",
- "username": "Flume",
- "last_modified": "2014/11/24 19:21:29 +0000",
- "uri": "https://api.soundcloud.com/users/2976616",
- "permalink_url": "http://soundcloud.com/flume",
- "avatar_url": "https://i1.sndcdn.com/avatars-000044475439-4zi7ii-large.jpg"
- },
- "permalink_url": "http://soundcloud.com/this.is.the.url",
- "artwork_url": "https://i1.sndcdn.com/artworks-000085857162-xdxy5c-large.jpg",
- "waveform_url": "https://w1.sndcdn.com/DWrL1lAN8BkP_m.png",
- "stream_url": "https://api.soundcloud.com/tracks/159723640/stream",
- "download_url": "https://api.soundcloud.com/tracks/159723640/download",
- "playback_count": 2190687,
- "download_count": 54856,
- "favoritings_count": 49061,
- "comment_count": 826,
- "likes_count": 49061,
- "reposts_count": 15910,
- "attachments_uri": "https://api.soundcloud.com/tracks/159723640/attachments",
- "policy": "ALLOW"
- }
- ],
- "total_results": 375750,
- "next_href": "https://api.soundcloud.com/search?&q=test",
- "tx_id": ""
- }
- """
- response = mock.Mock(text=json)
- results = soundcloud.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This is the title')
- self.assertEqual(results[0]['url'], 'http://soundcloud.com/this.is.the.url')
- self.assertEqual(results[0]['content'], 'This is the content')
- self.assertIn(quote_plus('https://api.soundcloud.com/tracks/159723640'), results[0]['embedded'])
-
- json = """
- {
- "collection": [
- {
- "kind": "user",
- "id": 159723640,
- "created_at": "2014/07/22 00:51:21 +0000",
- "user_id": 2976616,
- "duration": 303780,
- "commentable": true,
- "state": "finished",
- "original_content_size": 13236349,
- "last_modified": "2015/01/31 15:14:50 +0000",
- "sharing": "public",
- "tag_list": "seekae flume",
- "permalink": "seekae-test-recognise-flume-re-work",
- "streamable": true,
- "embeddable_by": "all",
- "downloadable": true,
- "purchase_url": "http://www.facebook.com/seekaemusic",
- "label_id": null,
- "purchase_title": "Seekae",
- "genre": "freedownload",
- "title": "This is the title",
- "description": "This is the content",
- "label_name": "Future Classic",
- "release": "",
- "track_type": "remix",
- "key_signature": "",
- "isrc": "",
- "video_url": null,
- "bpm": null,
- "release_year": 2014,
- "release_month": 7,
- "release_day": 22,
- "original_format": "mp3",
- "license": "all-rights-reserved",
- "uri": "https://api.soundcloud.com/tracks/159723640",
- "user": {
- "id": 2976616,
- "kind": "user",
- "permalink": "flume",
- "username": "Flume",
- "last_modified": "2014/11/24 19:21:29 +0000",
- "uri": "https://api.soundcloud.com/users/2976616",
- "permalink_url": "http://soundcloud.com/flume",
- "avatar_url": "https://i1.sndcdn.com/avatars-000044475439-4zi7ii-large.jpg"
- },
- "permalink_url": "http://soundcloud.com/this.is.the.url",
- "artwork_url": "https://i1.sndcdn.com/artworks-000085857162-xdxy5c-large.jpg",
- "waveform_url": "https://w1.sndcdn.com/DWrL1lAN8BkP_m.png",
- "stream_url": "https://api.soundcloud.com/tracks/159723640/stream",
- "download_url": "https://api.soundcloud.com/tracks/159723640/download",
- "playback_count": 2190687,
- "download_count": 54856,
- "favoritings_count": 49061,
- "comment_count": 826,
- "likes_count": 49061,
- "reposts_count": 15910,
- "attachments_uri": "https://api.soundcloud.com/tracks/159723640/attachments",
- "policy": "ALLOW"
- }
- ],
- "total_results": 375750,
- "next_href": "https://api.soundcloud.com/search?&q=test",
- "tx_id": ""
- }
- """
- response = mock.Mock(text=json)
- results = soundcloud.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- json = """
- {
- "collection": [],
- "total_results": 375750,
- "next_href": "https://api.soundcloud.com/search?&q=test",
- "tx_id": ""
- }
- """
- response = mock.Mock(text=json)
- results = soundcloud.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_spotify.py b/tests/unit/engines/test_spotify.py
deleted file mode 100644
index e37c344d2..000000000
--- a/tests/unit/engines/test_spotify.py
+++ /dev/null
@@ -1,124 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import spotify
-from searx.testing import SearxTestCase
-
-
-class TestSpotifyEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- params = spotify.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('spotify.com', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, spotify.response, None)
- self.assertRaises(AttributeError, spotify.response, [])
- self.assertRaises(AttributeError, spotify.response, '')
- self.assertRaises(AttributeError, spotify.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(spotify.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(spotify.response(response), [])
-
- json = """
- {
- "tracks": {
- "href": "https://api.spotify.com/v1/search?query=nosfell&offset=0&limit=20&type=track",
- "items": [
- {
- "album": {
- "album_type": "album",
- "external_urls": {
- "spotify": "https://open.spotify.com/album/5c9ap1PBkSGLxT3J73toxA"
- },
- "href": "https://api.spotify.com/v1/albums/5c9ap1PBkSGLxT3J73toxA",
- "id": "5c9ap1PBkSGLxT3J73toxA",
- "name": "Album Title",
- "type": "album",
- "uri": "spotify:album:5c9ap1PBkSGLxT3J73toxA"
- },
- "artists": [
- {
- "external_urls": {
- "spotify": "https://open.spotify.com/artist/0bMc6b75FfZEpQHG1jifKu"
- },
- "href": "https://api.spotify.com/v1/artists/0bMc6b75FfZEpQHG1jifKu",
- "id": "0bMc6b75FfZEpQHG1jifKu",
- "name": "Artist Name",
- "type": "artist",
- "uri": "spotify:artist:0bMc6b75FfZEpQHG1jifKu"
- }
- ],
- "disc_number": 1,
- "duration_ms": 202386,
- "explicit": false,
- "external_ids": {
- "isrc": "FRV640600067"
- },
- "external_urls": {
- "spotify": "https://open.spotify.com/track/2GzvFiedqW8hgqUpWcASZa"
- },
- "href": "https://api.spotify.com/v1/tracks/2GzvFiedqW8hgqUpWcASZa",
- "id": "1000",
- "is_playable": true,
- "name": "Title of track",
- "popularity": 6,
- "preview_url": "https://p.scdn.co/mp3-preview/7b8ecda580965a066b768c2647f877e43f7b1a0a",
- "track_number": 3,
- "type": "track",
- "uri": "spotify:track:2GzvFiedqW8hgqUpWcASZa"
- }
- ],
- "limit": 20,
- "next": "https://api.spotify.com/v1/search?query=nosfell&offset=20&limit=20&type=track",
- "offset": 0,
- "previous": null,
- "total": 107
- }
- }
- """
- response = mock.Mock(text=json)
- results = spotify.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Title of track')
- self.assertEqual(results[0]['url'], 'https://open.spotify.com/track/2GzvFiedqW8hgqUpWcASZa')
- self.assertEqual(results[0]['content'], 'Artist Name - Album Title - Title of track')
- self.assertIn('1000', results[0]['embedded'])
-
- json = """
- {
- "tracks": {
- "href": "https://api.spotify.com/v1/search?query=nosfell&offset=0&limit=20&type=track",
- "items": [
- {
- "href": "https://api.spotify.com/v1/tracks/2GzvFiedqW8hgqUpWcASZa",
- "id": "1000",
- "is_playable": true,
- "name": "Title of track",
- "popularity": 6,
- "preview_url": "https://p.scdn.co/mp3-preview/7b8ecda580965a066b768c2647f877e43f7b1a0a",
- "track_number": 3,
- "type": "album",
- "uri": "spotify:track:2GzvFiedqW8hgqUpWcASZa"
- }
- ],
- "limit": 20,
- "next": "https://api.spotify.com/v1/search?query=nosfell&offset=20&limit=20&type=track",
- "offset": 0,
- "previous": null,
- "total": 107
- }
- }
- """
- response = mock.Mock(text=json)
- results = spotify.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_stackoverflow.py b/tests/unit/engines/test_stackoverflow.py
deleted file mode 100644
index 18a1ff4bd..000000000
--- a/tests/unit/engines/test_stackoverflow.py
+++ /dev/null
@@ -1,106 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import stackoverflow
-from searx.testing import SearxTestCase
-
-
-class TestStackoverflowEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- params = stackoverflow.request(query, dicto)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('stackoverflow.com' in params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, stackoverflow.response, None)
- self.assertRaises(AttributeError, stackoverflow.response, [])
- self.assertRaises(AttributeError, stackoverflow.response, '')
- self.assertRaises(AttributeError, stackoverflow.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(stackoverflow.response(response), [])
-
- html = """
- <div class="question-summary search-result" id="answer-id-1783426">
- <div class="statscontainer">
- <div class="statsarrow"></div>
- <div class="stats">
- <div class="vote">
- <div class="votes answered">
- <span class="vote-count-post "><strong>2583</strong></span>
- <div class="viewcount">votes</div>
- </div>
- </div>
- </div>
- </div>
- <div class="summary">
- <div class="result-link">
- <span>
- <a href="/questions/this.is.the.url"
- data-searchsession="/questions"
- title="Checkout remote Git branch">
- This is the title
- </a>
- </span>
- </div>
- <div class="excerpt">
- This is the content
- </div>
- <div class="tags user-tags t-git t-git-checkout t-remote-branch">
- </div>
- <div class="started fr">
- answered <span title="2009-11-23 14:26:08Z" class="relativetime">nov 23 '09</span> by
- <a href="/users/214090/hallski">hallski</a>
- </div>
- </div>
- </div>
- """
- response = mock.Mock(text=html)
- results = stackoverflow.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This is the title')
- self.assertEqual(results[0]['url'], 'https://stackoverflow.com/questions/this.is.the.url')
- self.assertEqual(results[0]['content'], 'This is the content')
-
- html = """
- <div class="statscontainer">
- <div class="statsarrow"></div>
- <div class="stats">
- <div class="vote">
- <div class="votes answered">
- <span class="vote-count-post "><strong>2583</strong></span>
- <div class="viewcount">votes</div>
- </div>
- </div>
- </div>
- </div>
- <div class="summary">
- <div class="result-link">
- <span>
- <a href="/questions/this.is.the.url"
- data-searchsession="/questions"
- title="Checkout remote Git branch">
- This is the title
- </a>
- </span>
- </div>
- <div class="excerpt">
- This is the content
- </div>
- <div class="tags user-tags t-git t-git-checkout t-remote-branch">
- </div>
- <div class="started fr">
- answered <span title="2009-11-23 14:26:08Z" class="relativetime">nov 23 '09</span> by
- <a href="/users/214090/hallski">hallski</a>
- </div>
- </div>
- """
- response = mock.Mock(text=html)
- results = stackoverflow.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_startpage.py b/tests/unit/engines/test_startpage.py
deleted file mode 100644
index a4704ce22..000000000
--- a/tests/unit/engines/test_startpage.py
+++ /dev/null
@@ -1,140 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import startpage
-from searx.testing import SearxTestCase
-
-
-class TestStartpageEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['language'] = 'fr_FR'
- params = startpage.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn('startpage.com', params['url'])
- self.assertIn('data', params)
- self.assertIn('query', params['data'])
- self.assertIn(query, params['data']['query'])
- self.assertIn('with_language', params['data'])
- self.assertIn('lang_fr', params['data']['with_language'])
-
- dicto['language'] = 'all'
- params = startpage.request(query, dicto)
- self.assertNotIn('with_language', params['data'])
-
- def test_response(self):
- self.assertRaises(AttributeError, startpage.response, None)
- self.assertRaises(AttributeError, startpage.response, [])
- self.assertRaises(AttributeError, startpage.response, '')
- self.assertRaises(AttributeError, startpage.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(startpage.response(response), [])
-
- html = """
- <li class="search-result search-item">
- <h3>
- <a href='http://this.should.be.the.link/' id='title_2' name='title_2' >
- This should be the title
- </a>
- <span id='title_stars_2' name='title_stars_2'> </span>
- </h3>
- <p class="search-item__body">
- This should be the content.
- </p>
- <p>
- <span class='url'>www.speed<b>test</b>.net/fr/
- </span>
- -
- <A class="proxy" id="proxy_link" HREF="https://ixquick-proxy.com/do/spg/proxy?ep=&edata=&ek=&ekdata="
- class='proxy'>
- Navigation avec Ixquick Proxy
- </A>
- -
- <A HREF="https://ixquick-proxy.com/do/spg/highlight.pl?l=francais&c=hf&cat=web&q=test&rl=NONE&rid=
- &hlq=https://startpage.com/do/search&mtabp=-1&mtcmd=process_search&mtlanguage=francais&mtengine0=
- &mtcat=web&u=http:%2F%2Fwww.speedtest.net%2Ffr%2F" class='proxy'>
- Mis en surbrillance
- </A>
- </p>
- </li>
- """
- response = mock.Mock(text=html.encode('utf-8'))
- results = startpage.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This should be the title')
- self.assertEqual(results[0]['url'], 'http://this.should.be.the.link/')
- self.assertEqual(results[0]['content'], 'This should be the content.')
-
- html = """
- <li class="search-result search-item">
- <h3>
- <a href='http://www.google.com/aclk?sa=l&ai=C' id='title_2' name='title_2' >
- This should be the title
- </a>
- <span id='title_stars_2' name='title_stars_2'> </span>
- </h3>
- <p class="search-item__body">
- This should be the content.
- </p>
- <p>
- <span class='url'>www.speed<b>test</b>.net/fr/
- </span>
- -
- <A class="proxy" id="proxy_link" HREF="https://ixquick-proxy.com/do/spg/proxy?ep=&edata=&ek=&ekdata="
- class='proxy'>
- Navigation avec Ixquick Proxy
- </A>
- -
- <A HREF="https://ixquick-proxy.com/do/spg/highlight.pl?l=francais&c=hf&cat=web&q=test&rl=NONE&rid=
- &hlq=https://startpage.com/do/search&mtabp=-1&mtcmd=process_search&mtlanguage=francais&mtengine0=
- &mtcat=web&u=http:%2F%2Fwww.speedtest.net%2Ffr%2F" class='proxy'>
- Mis en surbrillance
- </A>
- </p>
- </li>
- <li class="search-result search-item">
- <h3>
- <span id='title_stars_2' name='title_stars_2'> </span>
- </h3>
- <p class="search-item__body">
- This should be the content.
- </p>
- <p>
- <span class='url'>www.speed<b>test</b>.net/fr/
- </span>
- </p>
- </li>
- <li class="search-result search-item">
- <h3>
- <a href='http://this.should.be.the.link/' id='title_2' name='title_2' >
- This should be the title
- </a>
- <span id='title_stars_2' name='title_stars_2'> </span>
- </h3>
- <p>
- <span class='url'>www.speed<b>test</b>.net/fr/
- </span>
- -
- <A class="proxy" id="proxy_link" HREF="https://ixquick-proxy.com/do/spg/proxy?ep=&edata=&ek=&ekdata="
- class='proxy'>
- Navigation avec Ixquick Proxy
- </A>
- -
- <A HREF="https://ixquick-proxy.com/do/spg/highlight.pl?l=francais&c=hf&cat=web&q=test&rl=NONE&rid=
- &hlq=https://startpage.com/do/search&mtabp=-1&mtcmd=process_search&mtlanguage=francais&mtengine0=
- &mtcat=web&u=http:%2F%2Fwww.speedtest.net%2Ffr%2F" class='proxy'>
- Mis en surbrillance
- </A>
- </p>
- </li>
- """
- response = mock.Mock(text=html.encode('utf-8'))
- results = startpage.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['content'], '')
diff --git a/tests/unit/engines/test_tokyotoshokan.py b/tests/unit/engines/test_tokyotoshokan.py
deleted file mode 100644
index b5c6fad17..000000000
--- a/tests/unit/engines/test_tokyotoshokan.py
+++ /dev/null
@@ -1,110 +0,0 @@
-import mock
-from collections import defaultdict
-from searx.engines import tokyotoshokan
-from searx.testing import SearxTestCase
-from datetime import datetime
-
-
-class TestTokyotoshokanEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dic = defaultdict(dict)
- dic['pageno'] = 1
- params = tokyotoshokan.request(query, dic)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('tokyotosho.info' in params['url'])
-
- def test_response(self):
- resp = mock.Mock(text='<html></html>')
- self.assertEqual(tokyotoshokan.response(resp), [])
-
- html = """
- <table class="listing">
- <tbody>
- <tr class="shade category_0">
- <td rowspan="2">
- <a href="/?cat=7"><span class="sprite_cat-raw"></span></a>
- </td>
- <td class="desc-top">
- <a href="magnet:?xt=urn:btih:4c19eb46b5113685fbd2288ed2531b0b">
- <span class="sprite_magnet"></span>
- </a>
- <a rel="nofollow" type="application/x-bittorrent" href="http://www.nyaa.se/f">
- Koyomimonogatari
- </a>
- </td>
- <td class="web"><a rel="nofollow" href="details.php?id=975700">Details</a></td>
- </tr>
- <tr class="shade category_0">
- <td class="desc-bot">
- Authorized: <span class="auth_ok">Yes</span>
- Submitter: <a href="?username=Ohys">Ohys</a> |
- Size: 10.5MB |
- Date: 2016-03-26 16:41 UTC |
- Comment: sample comment
- </td>
- <td style="color: #BBB; font-family: monospace" class="stats" align="right">
- S: <span style="color: red">53</span>
- L: <span style="color: red">18</span>
- C: <span style="color: red">0</span>
- ID: 975700
- </td>
- </tr>
-
- <tr class="category_0">
- <td rowspan="2">
- <a href="/?cat=7"><span class="sprite_cat-raw"></span></a>
- </td>
- <td class="desc-top">
- <a rel="nofollow" type="application/x-bittorrent" href="http://google.com/q">
- Owarimonogatari
- </a>
- </td>
- <td class="web"><a rel="nofollow" href="details.php?id=975700">Details</a></td>
- </tr>
- <tr class="category_0">
- <td class="desc-bot">
- Submitter: <a href="?username=Ohys">Ohys</a> |
- Size: 932.84EB |
- Date: QWERTY-03-26 16:41 UTC
- </td>
- <td style="color: #BBB; font-family: monospace" class="stats" align="right">
- S: <span style="color: red">0</span>
- </td>
- </tr>
- </tbody>
- </table>
- """
-
- resp = mock.Mock(text=html)
- results = tokyotoshokan.response(resp)
-
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
-
- # testing the first result, which has correct format
- # and should have all information fields filled
- r = results[0]
- self.assertEqual(r['url'], 'http://www.nyaa.se/f')
- self.assertEqual(r['title'], 'Koyomimonogatari')
- self.assertEqual(r['magnetlink'], 'magnet:?xt=urn:btih:4c19eb46b5113685fbd2288ed2531b0b')
- self.assertEqual(r['filesize'], int(1024 * 1024 * 10.5))
- self.assertEqual(r['publishedDate'], datetime(2016, 3, 26, 16, 41))
- self.assertEqual(r['content'], 'Comment: sample comment')
- self.assertEqual(r['seed'], 53)
- self.assertEqual(r['leech'], 18)
-
- # testing the second result, which does not include magnet link,
- # seed & leech info, and has incorrect size & creation date
- r = results[1]
- self.assertEqual(r['url'], 'http://google.com/q')
- self.assertEqual(r['title'], 'Owarimonogatari')
-
- self.assertFalse('magnetlink' in r)
- self.assertFalse('filesize' in r)
- self.assertFalse('content' in r)
- self.assertFalse('publishedDate' in r)
- self.assertFalse('seed' in r)
- self.assertFalse('leech' in r)
diff --git a/tests/unit/engines/test_torrentz.py b/tests/unit/engines/test_torrentz.py
deleted file mode 100644
index f483bf68c..000000000
--- a/tests/unit/engines/test_torrentz.py
+++ /dev/null
@@ -1,87 +0,0 @@
-import mock
-from collections import defaultdict
-from searx.engines import torrentz
-from searx.testing import SearxTestCase
-from datetime import datetime
-
-
-class TestTorrentzEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dic = defaultdict(dict)
- dic['pageno'] = 1
- params = torrentz.request(query, dic)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('torrentz2.eu' in params['url'])
-
- def test_response(self):
- resp = mock.Mock(text='<html></html>')
- self.assertEqual(torrentz.response(resp), [])
-
- html = """
- <div class="results">
- <dl>
- <dt>
- <a href="/4362e08b1d80e1820fb2550b752f9f3126fe76d6">
- Completely valid info
- </a>
- books ebooks
- </dt>
- <dd>
- <span>1</span>
- <span title="1503595924">5 hours</span>
- <span>30 MB</span>
- <span>14</span>
- <span>1</span>
- </dd>
- </dl>
-
- <dl>
- <dt>
- <a href="/poaskdpokaspod">
- Invalid hash and date and filesize
- </a>
- books ebooks
- </dt>
- <dd>
- <span>1</span>
- <span title="1503595924 aaa">5 hours</span>
- <span>30MB</span>
- <span>5,555</span>
- <span>1,234,567</span>
- </dd>
- </dl>
- </div>
- """
-
- resp = mock.Mock(text=html)
- results = torrentz.response(resp)
-
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
-
- # testing against the first result
- r = results[0]
- self.assertEqual(r['url'], 'https://torrentz2.eu/4362e08b1d80e1820fb2550b752f9f3126fe76d6')
- self.assertEqual(r['title'], 'Completely valid info books ebooks')
- # 22 Nov 2015 03:01:42
- self.assertEqual(r['publishedDate'], datetime.fromtimestamp(1503595924))
- self.assertEqual(r['seed'], 14)
- self.assertEqual(r['leech'], 1)
- self.assertEqual(r['filesize'], 30 * 1024 * 1024)
- self.assertEqual(r['magnetlink'], 'magnet:?xt=urn:btih:4362e08b1d80e1820fb2550b752f9f3126fe76d6')
-
- # testing against the second result
- r = results[1]
- self.assertEqual(r['url'], 'https://torrentz2.eu/poaskdpokaspod')
- self.assertEqual(r['title'], 'Invalid hash and date and filesize books ebooks')
- self.assertEqual(r['seed'], 5555)
- self.assertEqual(r['leech'], 1234567)
-
- # in the second result we have invalid hash, creation date & torrent size,
- # so these tests should fail
- self.assertFalse('magnetlink' in r)
- self.assertFalse('filesize' in r)
- self.assertFalse('publishedDate' in r)
diff --git a/tests/unit/engines/test_twitter.py b/tests/unit/engines/test_twitter.py
deleted file mode 100644
index b444b48ee..000000000
--- a/tests/unit/engines/test_twitter.py
+++ /dev/null
@@ -1,502 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import twitter
-from searx.testing import SearxTestCase
-
-
-class TestTwitterEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- dicto['language'] = 'fr_FR'
- params = twitter.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('twitter.com', params['url'])
- self.assertIn('cookies', params)
- self.assertIn('lang', params['cookies'])
- self.assertIn('fr', params['cookies']['lang'])
-
- dicto['language'] = 'all'
- params = twitter.request(query, dicto)
- self.assertIn('cookies', params)
- self.assertIn('lang', params['cookies'])
- self.assertIn('en', params['cookies']['lang'])
-
- def test_response(self):
- self.assertRaises(AttributeError, twitter.response, None)
- self.assertRaises(AttributeError, twitter.response, [])
- self.assertRaises(AttributeError, twitter.response, '')
- self.assertRaises(AttributeError, twitter.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(twitter.response(response), [])
-
- html = """
- <li class="js-stream-item stream-item stream-item expanding-stream-item" data-item-id="563005573290287105"
- id="stream-item-tweet-563005573290287105" data-item-type="tweet">
- <div class="tweet original-tweet js-stream-tweet js-actionable-tweet js-profile-popup-actionable
- js-original-tweet has-cards has-native-media" data-tweet-id="563005573290287105" data-disclosure-type=""
- data-item-id="563005573290287105" data-screen-name="Jalopnik" data-name="Jalopnik"
- data-user-id="3060631" data-has-native-media="true" data-has-cards="true" data-card-type="photo"
- data-expanded-footer="&lt;div class=&quot;js-tweet-details-fixer
- tweet-details-fixer&quot;&gt;&#10;&#10;&#10;
- &lt;div class=&quot;cards-media-container js-media-container&quot;&gt;&lt;div
- data-card-url=&quot;//twitter.com/Jalopnik/status/563005573290287105/photo/1&quot; data-card-type=&quot;
- photo&quot; class=&quot;cards-base cards-multimedia&quot; data-element-context=&quot;platform_photo_card
- &quot;&gt;&#10;&#10;&#10; &lt;a class=&quot;media media-thumbnail twitter-timeline-link is-preview
- &quot; data-url=&quot;https://pbs.twimg.com/media/B9Aylf5IMAAuziP.jpg:large&quot;
- data-resolved-url-large=&quot;https://pbs.twimg.com/media/B9Aylf5IMAAuziP.jpg:large&quot;
- href=&quot;//twitter.com/Jalopnik/status/563005573290287105/photo/1&quot;&gt;&#10;
- &lt;div class=&quot;&quot;&gt;&#10; &lt;img src=&quot;
- https://pbs.twimg.com/media/B9Aylf5IMAAuziP.jpg&quot;
- alt=&quot;Embedded image permalink&quot; width=&quot;636&quot; height=&quot;309&quot;&gt;&#10;
- &lt;/div&gt;&#10;&#10; &lt;/a&gt;&#10;&#10; &lt;div class=&quot;cards-content&quot;&gt;&#10;
- &lt;div class=&quot;byline&quot;&gt;&#10; &#10; &lt;/div&gt;&#10; &#10; &lt;/div&gt;&#10;
- &#10;&lt;/div&gt;&#10;&#10;&#10;&#10;&#10;&lt;/div&gt;&#10;&#10;&#10;&#10; &lt;div
- class=&quot;js-machine-translated-tweet-container&quot;&gt;&lt;/div&gt;&#10; &lt;div
- class=&quot;js-tweet-stats-container tweet-stats-container &quot;&gt;&#10; &lt;/div&gt;&#10;&#10;
- &lt;div class=&quot;client-and-actions&quot;&gt;&#10; &lt;span class=&quot;metadata&quot;&gt;&#10;
- &lt;span&gt;5:06 PM - 4 Feb 2015&lt;/span&gt;&#10;&#10; &amp;middot; &lt;a
- class=&quot;permalink-link js-permalink js-nav&quot; href=&quot;/Jalopnik/status/563005573290287105
- &quot;tabindex=&quot;-1&quot;&gt;Details&lt;/a&gt;&#10; &#10;&#10; &#10; &#10;
- &#10;&#10; &lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&#10;&lt;/div&gt;&#10;" data-you-follow="false"
- data-you-block="false">
- <div class="context">
- </div>
- <div class="content">
- <div class="stream-item-header">
- <a class="account-group js-account-group js-action-profile js-user-profile-link js-nav"
- href="/Jalopnik" data-user-id="3060631">
- <img class="avatar js-action-profile-avatar"
- src="https://pbs.twimg.com/profile_images/2976430168/5cd4a59_bigger.jpeg" alt="">
- <strong class="fullname js-action-profile-name show-popup-with-id" data-aria-label-part>
- Jalopnik
- </strong>
- <span>&rlm;</span>
- <span class="username js-action-profile-name" data-aria-label-part>
- <s>@</s><b>TitleName</b>
- </span>
- </a>
- <small class="time">
- <a href="/this.is.the.url"
- class="tweet-timestamp js-permalink js-nav js-tooltip" title="5:06 PM - 4 Feb 2015" >
- <span class="u-hiddenVisually" data-aria-label-part="last">17 minutes ago</span>
- </a>
- </small>
- </div>
- <p class="js-tweet-text tweet-text" lang="en" data-aria-label-part="0">
- This is the content étude à€
- <a href="http://t.co/nRWsqQAwBL" rel="nofollow" dir="ltr"
- data-expanded-url="http://jalo.ps/ReMENu4" class="twitter-timeline-link"
- target="_blank" title="http://jalo.ps/ReMENu4" >
- <span class="tco-ellipsis">
- </span>
- <span class="invisible">http://</span><span class="js-display-url">link.in.tweet</span>
- <span class="invisible"></span>
- <span class="tco-ellipsis">
- <span class="invisible">&nbsp;</span>
- </span>
- </a>
- <a href="http://t.co/rbFsfeE0l3" class="twitter-timeline-link u-hidden"
- data-pre-embedded="true" dir="ltr">
- pic.twitter.com/rbFsfeE0l3
- </a>
- </p>
- <div class="expanded-content js-tweet-details-dropdown">
- </div>
- <div class="stream-item-footer">
- <a class="details with-icn js-details" href="/Jalopnik/status/563005573290287105">
- <span class="Icon Icon--photo">
- </span>
- <b>
- <span class="expand-stream-item js-view-details">
- View photo
- </span>
- <span class="collapse-stream-item js-hide-details">
- Hide photo
- </span>
- </b>
- </a>
- <span class="ProfileTweet-action--reply u-hiddenVisually">
- <span class="ProfileTweet-actionCount" aria-hidden="true" data-tweet-stat-count="0">
- <span class="ProfileTweet-actionCountForAria" >0 replies</span>
- </span>
- </span>
- <span class="ProfileTweet-action--retweet u-hiddenVisually">
- <span class="ProfileTweet-actionCount" data-tweet-stat-count="8">
- <span class="ProfileTweet-actionCountForAria" data-aria-label-part>8 retweets</span>
- </span>
- </span>
- <span class="ProfileTweet-action--favorite u-hiddenVisually">
- <span class="ProfileTweet-actionCount" data-tweet-stat-count="14">
- <span class="ProfileTweet-actionCountForAria" data-aria-label-part>14 favorites</span>
- </span>
- </span>
- <div role="group" aria-label="Tweet actions" class="ProfileTweet-actionList u-cf js-actions">
- <div class="ProfileTweet-action ProfileTweet-action--reply">
- <button class="ProfileTweet-actionButton u-textUserColorHover js-actionButton
- js-actionReply" data-modal="ProfileTweet-reply" type="button" title="Reply">
- <span class="Icon Icon--reply">
- </span>
- <span class="u-hiddenVisually">Reply</span>
- <span class="ProfileTweet-actionCount u-textUserColorHover
- ProfileTweet-actionCount--isZero">
- <span class="ProfileTweet-actionCountForPresentation" aria-hidden="true">
- </span>
- </span>
- </button>
- </div>
- <div class="ProfileTweet-action ProfileTweet-action--retweet js-toggleState js-toggleRt">
- <button class="ProfileTweet-actionButton js-actionButton js-actionRetweet js-tooltip"
- title="Retweet" data-modal="ProfileTweet-retweet" type="button">
- <span class="Icon Icon--retweet">
- </span>
- <span class="u-hiddenVisually">Retweet</span>
- <span class="ProfileTweet-actionCount">
- <span class="ProfileTweet-actionCountForPresentation">8</span>
- </span>
- </button>
- <button class="ProfileTweet-actionButtonUndo js-actionButton js-actionRetweet"
- data-modal="ProfileTweet-retweet" title="Undo retweet" type="button">
- <span class="Icon Icon--retweet">
- </span>
- <span class="u-hiddenVisually">Retweeted</span>
- <span class="ProfileTweet-actionCount">
- <span class="ProfileTweet-actionCountForPresentation">8</span>
- </span>
- </button>
- </div>
- <div class="ProfileTweet-action ProfileTweet-action--favorite js-toggleState">
- <button class="ProfileTweet-actionButton js-actionButton js-actionFavorite js-tooltip"
- title="Favorite" type="button">
- <span class="Icon Icon--favorite">
- </span>
- <span class="u-hiddenVisually">Favorite</span>
- <span class="ProfileTweet-actionCount">
- <span class="ProfileTweet-actionCountForPresentation">14</span>
- </span>
- </button>
- <button class="ProfileTweet-actionButtonUndo u-linkClean js-actionButton
- js-actionFavorite" title="Undo favorite" type="button">
- <span class="Icon Icon--favorite">
- </span>
- <span class="u-hiddenVisually">Favorited</span>
- <span class="ProfileTweet-actionCount">
- <span class="ProfileTweet-actionCountForPresentation">
- 14
- </span>
- </span>
- </button>
- </div>
- <div class="ProfileTweet-action ProfileTweet-action--more js-more-ProfileTweet-actions">
- <div class="dropdown">
- <button class="ProfileTweet-actionButton u-textUserColorHover dropdown-toggle
- js-tooltip js-dropdown-toggle" type="button" title="More">
- <span class="Icon Icon--dots">
- </span>
- <span class="u-hiddenVisually">More</span>
- </button>
- <div class="dropdown-menu">
- <div class="dropdown-caret">
- <div class="caret-outer">
- </div>
- <div class="caret-inner">
- </div>
- </div>
- <ul>
- <li class="share-via-dm js-actionShareViaDM" data-nav="share_tweet_dm">
- <button type="button" class="dropdown-link">
- Share via Direct Message
- </button>
- </li>
- <li class="embed-link js-actionEmbedTweet" data-nav="embed_tweet">
- <button type="button" class="dropdown-link">
- Embed Tweet
- </button>
- </li>
- <li class="mute-user-item pretty-link">
- <button type="button" class="dropdown-link">
- Mute
- </button>
- </li>
- <li class="unmute-user-item pretty-link">
- <button type="button" class="dropdown-link">
- Unmute
- </button>
- </li>
- <li class="block-or-report-link js-actionBlockOrReport"
- data-nav="block_or_report">
- <button type="button" class="dropdown-link">
- Block or report
- </button>
- </li>
- </ul>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </li>
- """
- response = mock.Mock(text=html)
- results = twitter.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], '@TitleName')
- self.assertEqual(results[0]['url'], 'https://twitter.com/this.is.the.url')
- self.assertIn(u'This is the content', results[0]['content'])
- # self.assertIn(u'This is the content étude à€', results[0]['content'])
-
- html = """
- <li class="js-stream-item stream-item stream-item expanding-stream-item" data-item-id="563005573290287105"
- id="stream-item-tweet-563005573290287105" data-item-type="tweet">
- <div class="tweet original-tweet js-stream-tweet js-actionable-tweet js-profile-popup-actionable
- js-original-tweet has-cards has-native-media" data-tweet-id="563005573290287105" data-disclosure-type=""
- data-item-id="563005573290287105" data-screen-name="Jalopnik" data-name="Jalopnik"
- data-user-id="3060631" data-has-native-media="true" data-has-cards="true" data-card-type="photo"
- data-expanded-footer="&lt;div class=&quot;js-tweet-details-fixer
- tweet-details-fixer&quot;&gt;&#10;&#10;&#10;
- &lt;div class=&quot;cards-media-container js-media-container&quot;&gt;&lt;div
- data-card-url=&quot;//twitter.com/Jalopnik/status/563005573290287105/photo/1&quot; data-card-type=&quot;
- photo&quot; class=&quot;cards-base cards-multimedia&quot; data-element-context=&quot;platform_photo_card
- &quot;&gt;&#10;&#10;&#10; &lt;a class=&quot;media media-thumbnail twitter-timeline-link is-preview
- &quot; data-url=&quot;https://pbs.twimg.com/media/B9Aylf5IMAAuziP.jpg:large&quot;
- data-resolved-url-large=&quot;https://pbs.twimg.com/media/B9Aylf5IMAAuziP.jpg:large&quot;
- href=&quot;//twitter.com/Jalopnik/status/563005573290287105/photo/1&quot;&gt;&#10;
- &lt;div class=&quot;&quot;&gt;&#10; &lt;img src=&quot;
- https://pbs.twimg.com/media/B9Aylf5IMAAuziP.jpg&quot;
- alt=&quot;Embedded image permalink&quot; width=&quot;636&quot; height=&quot;309&quot;&gt;&#10;
- &lt;/div&gt;&#10;&#10; &lt;/a&gt;&#10;&#10; &lt;div class=&quot;cards-content&quot;&gt;&#10;
- &lt;div class=&quot;byline&quot;&gt;&#10; &#10; &lt;/div&gt;&#10; &#10; &lt;/div&gt;&#10;
- &#10;&lt;/div&gt;&#10;&#10;&#10;&#10;&#10;&lt;/div&gt;&#10;&#10;&#10;&#10; &lt;div
- class=&quot;js-machine-translated-tweet-container&quot;&gt;&lt;/div&gt;&#10; &lt;div
- class=&quot;js-tweet-stats-container tweet-stats-container &quot;&gt;&#10; &lt;/div&gt;&#10;&#10;
- &lt;div class=&quot;client-and-actions&quot;&gt;&#10; &lt;span class=&quot;metadata&quot;&gt;&#10;
- &lt;span&gt;5:06 PM - 4 Feb 2015&lt;/span&gt;&#10;&#10; &amp;middot; &lt;a
- class=&quot;permalink-link js-permalink js-nav&quot; href=&quot;/Jalopnik/status/563005573290287105
- &quot;tabindex=&quot;-1&quot;&gt;Details&lt;/a&gt;&#10; &#10;&#10; &#10; &#10;
- &#10;&#10; &lt;/span&gt;&#10;&lt;/div&gt;&#10;&#10;&#10;&lt;/div&gt;&#10;" data-you-follow="false"
- data-you-block="false">
- <div class="context">
- </div>
- <div class="content">
- <div class="stream-item-header">
- <a class="account-group js-account-group js-action-profile js-user-profile-link js-nav"
- href="/Jalopnik" data-user-id="3060631">
- <img class="avatar js-action-profile-avatar"
- src="https://pbs.twimg.com/profile_images/2976430168/5cd4a59_bigger.jpeg" alt="">
- <strong class="fullname js-action-profile-name show-popup-with-id" data-aria-label-part>
- Jalopnik
- </strong>
- <span>&rlm;</span>
- <span class="username js-action-profile-name" data-aria-label-part>
- <s>@</s><b>TitleName</b>
- </span>
- </a>
- <small class="time">
- <a href="/this.is.the.url"
- class="tweet-timestamp js-permalink js-nav js-tooltip" title="5:06 PM - 4 Feb 2015" >
- <span class="_timestamp js-short-timestamp js-relative-timestamp" data-time="1423065963"
- data-time-ms="1423065963000" data-long-form="true" aria-hidden="true">
- 17m
- </span>
- <span class="u-hiddenVisually" data-aria-label-part="last">17 minutes ago</span>
- </a>
- </small>
- </div>
- <p class="js-tweet-text tweet-text" lang="en" data-aria-label-part="0">
- This is the content étude à€
- <a href="http://t.co/nRWsqQAwBL" rel="nofollow" dir="ltr"
- data-expanded-url="http://jalo.ps/ReMENu4" class="twitter-timeline-link"
- target="_blank" title="http://jalo.ps/ReMENu4" >
- <span class="tco-ellipsis">
- </span>
- <span class="invisible">http://</span><span class="js-display-url">link.in.tweet</span>
- <span class="invisible"></span>
- <span class="tco-ellipsis">
- <span class="invisible">&nbsp;</span>
- </span>
- </a>
- <a href="http://t.co/rbFsfeE0l3" class="twitter-timeline-link u-hidden"
- data-pre-embedded="true" dir="ltr">
- pic.twitter.com/rbFsfeE0l3
- </a>
- </p>
- <div class="expanded-content js-tweet-details-dropdown">
- </div>
- <div class="stream-item-footer">
- <a class="details with-icn js-details" href="/Jalopnik/status/563005573290287105">
- <span class="Icon Icon--photo">
- </span>
- <b>
- <span class="expand-stream-item js-view-details">
- View photo
- </span>
- <span class="collapse-stream-item js-hide-details">
- Hide photo
- </span>
- </b>
- </a>
- <span class="ProfileTweet-action--reply u-hiddenVisually">
- <span class="ProfileTweet-actionCount" aria-hidden="true" data-tweet-stat-count="0">
- <span class="ProfileTweet-actionCountForAria" >0 replies</span>
- </span>
- </span>
- <span class="ProfileTweet-action--retweet u-hiddenVisually">
- <span class="ProfileTweet-actionCount" data-tweet-stat-count="8">
- <span class="ProfileTweet-actionCountForAria" data-aria-label-part>8 retweets</span>
- </span>
- </span>
- <span class="ProfileTweet-action--favorite u-hiddenVisually">
- <span class="ProfileTweet-actionCount" data-tweet-stat-count="14">
- <span class="ProfileTweet-actionCountForAria" data-aria-label-part>14 favorites</span>
- </span>
- </span>
- <div role="group" aria-label="Tweet actions" class="ProfileTweet-actionList u-cf js-actions">
- <div class="ProfileTweet-action ProfileTweet-action--reply">
- <button class="ProfileTweet-actionButton u-textUserColorHover js-actionButton
- js-actionReply" data-modal="ProfileTweet-reply" type="button" title="Reply">
- <span class="Icon Icon--reply">
- </span>
- <span class="u-hiddenVisually">Reply</span>
- <span class="ProfileTweet-actionCount u-textUserColorHover
- ProfileTweet-actionCount--isZero">
- <span class="ProfileTweet-actionCountForPresentation" aria-hidden="true">
- </span>
- </span>
- </button>
- </div>
- <div class="ProfileTweet-action ProfileTweet-action--retweet js-toggleState js-toggleRt">
- <button class="ProfileTweet-actionButton js-actionButton js-actionRetweet js-tooltip"
- title="Retweet" data-modal="ProfileTweet-retweet" type="button">
- <span class="Icon Icon--retweet">
- </span>
- <span class="u-hiddenVisually">Retweet</span>
- <span class="ProfileTweet-actionCount">
- <span class="ProfileTweet-actionCountForPresentation">8</span>
- </span>
- </button>
- <button class="ProfileTweet-actionButtonUndo js-actionButton js-actionRetweet"
- data-modal="ProfileTweet-retweet" title="Undo retweet" type="button">
- <span class="Icon Icon--retweet">
- </span>
- <span class="u-hiddenVisually">Retweeted</span>
- <span class="ProfileTweet-actionCount">
- <span class="ProfileTweet-actionCountForPresentation">8</span>
- </span>
- </button>
- </div>
- <div class="ProfileTweet-action ProfileTweet-action--favorite js-toggleState">
- <button class="ProfileTweet-actionButton js-actionButton js-actionFavorite js-tooltip"
- title="Favorite" type="button">
- <span class="Icon Icon--favorite">
- </span>
- <span class="u-hiddenVisually">Favorite</span>
- <span class="ProfileTweet-actionCount">
- <span class="ProfileTweet-actionCountForPresentation">14</span>
- </span>
- </button>
- <button class="ProfileTweet-actionButtonUndo u-linkClean js-actionButton
- js-actionFavorite" title="Undo favorite" type="button">
- <span class="Icon Icon--favorite">
- </span>
- <span class="u-hiddenVisually">Favorited</span>
- <span class="ProfileTweet-actionCount">
- <span class="ProfileTweet-actionCountForPresentation">
- 14
- </span>
- </span>
- </button>
- </div>
- <div class="ProfileTweet-action ProfileTweet-action--more js-more-ProfileTweet-actions">
- <div class="dropdown">
- <button class="ProfileTweet-actionButton u-textUserColorHover dropdown-toggle
- js-tooltip js-dropdown-toggle" type="button" title="More">
- <span class="Icon Icon--dots">
- </span>
- <span class="u-hiddenVisually">More</span>
- </button>
- <div class="dropdown-menu">
- <div class="dropdown-caret">
- <div class="caret-outer">
- </div>
- <div class="caret-inner">
- </div>
- </div>
- <ul>
- <li class="share-via-dm js-actionShareViaDM" data-nav="share_tweet_dm">
- <button type="button" class="dropdown-link">
- Share via Direct Message
- </button>
- </li>
- <li class="embed-link js-actionEmbedTweet" data-nav="embed_tweet">
- <button type="button" class="dropdown-link">
- Embed Tweet
- </button>
- </li>
- <li class="mute-user-item pretty-link">
- <button type="button" class="dropdown-link">
- Mute
- </button>
- </li>
- <li class="unmute-user-item pretty-link">
- <button type="button" class="dropdown-link">
- Unmute
- </button>
- </li>
- <li class="block-or-report-link js-actionBlockOrReport"
- data-nav="block_or_report">
- <button type="button" class="dropdown-link">
- Block or report
- </button>
- </li>
- </ul>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </li>
- """
- response = mock.Mock(text=html)
- results = twitter.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], '@TitleName')
- self.assertEqual(results[0]['url'], 'https://twitter.com/this.is.the.url')
- self.assertIn(u'This is the content', results[0]['content'])
-
- html = """
- <li class="b_algo" u="0|5109|4755453613245655|UAGjXgIrPH5yh-o5oNHRx_3Zta87f_QO">
- <div Class="sa_mc">
- <div class="sb_tlst">
- <h2>
- <a href="http://this.should.be.the.link/" h="ID=SERP,5124.1">
- <strong>This</strong> should be the title</a>
- </h2>
- </div>
- <div class="sb_meta">
- <cite>
- <strong>this</strong>.meta.com</cite>
- <span class="c_tlbxTrg">
- <span class="c_tlbxH" H="BASE:CACHEDPAGEDEFAULT" K="SERP,5125.1">
- </span>
- </span>
- </div>
- <p>
- <strong>This</strong> should be the content.</p>
- </div>
- </li>
- """
- response = mock.Mock(text=html)
- results = twitter.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_unsplash.py b/tests/unit/engines/test_unsplash.py
deleted file mode 100644
index 4501de906..000000000
--- a/tests/unit/engines/test_unsplash.py
+++ /dev/null
@@ -1,38 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.testing import SearxTestCase
-from searx.engines import unsplash
-
-
-class TestUnsplashEngine(SearxTestCase):
- def test_request(self):
- query = 'penguin'
- _dict = defaultdict(dict)
- _dict['pageno'] = 1
- params = unsplash.request(query, _dict)
-
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
-
- def test_response(self):
- resp = mock.Mock(text='{}')
- result = unsplash.response(resp)
- self.assertEqual([], result)
-
- resp.text = '{"results": []}'
- result = unsplash.response(resp)
- self.assertEqual([], result)
-
- # Sourced from https://unsplash.com/napi/search/photos?query=penguin&xp=&per_page=20&page=2
- with open('./tests/unit/engines/unsplash_fixture.json') as fixture:
- resp.text = fixture.read()
-
- result = unsplash.response(resp)
- self.assertEqual(len(result), 2)
- self.assertEqual(result[0]['title'], 'low angle photography of swimming penguin')
- self.assertEqual(result[0]['url'], 'https://unsplash.com/photos/FY8d721UO_4')
- self.assertEqual(result[0]['thumbnail_src'], 'https://images.unsplash.com/photo-1523557148507-1b77641c7e7c?ixlib=rb-0.3.5&q=80\
-&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max')
- self.assertEqual(result[0]['img_src'], 'https://images.unsplash.com/photo-1523557148507-1b77641c7e7c\
-?ixlib=rb-0.3.5')
- self.assertEqual(result[0]['content'], '')
diff --git a/tests/unit/engines/test_vimeo.py b/tests/unit/engines/test_vimeo.py
deleted file mode 100644
index c86b50a14..000000000
--- a/tests/unit/engines/test_vimeo.py
+++ /dev/null
@@ -1,36 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import vimeo
-from searx.testing import SearxTestCase
-
-
-class TestVimeoEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- params = vimeo.request(query, dicto)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('vimeo.com' in params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, vimeo.response, None)
- self.assertRaises(AttributeError, vimeo.response, [])
- self.assertRaises(AttributeError, vimeo.response, '')
- self.assertRaises(AttributeError, vimeo.response, '[]')
-
- json = u"""
-{"filtered":{"total":274641,"page":1,"per_page":18,"paging":{"next":"?sizes=590x332&page=2","previous":null,"first":"?sizes=590x332&page=1","last":"?sizes=590x332&page=15258"},"data":[{"is_staffpick":false,"is_featured":true,"type":"clip","clip":{"uri":"\\/videos\\/106557563","name":"Hot Rod Revue: The South","link":"https:\\/\\/vimeo.com\\/106557563","duration":4069,"created_time":"2014-09-19T03:38:04+00:00","privacy":{"view":"ptv"},"pictures":{"sizes":[{"width":"590","height":"332","link":"https:\\/\\/i.vimeocdn.com\\/video\\/489717884_590x332.jpg?r=pad","link_with_play_button":"https:\\/\\/i.vimeocdn.com\\/filter\\/overlay?src0=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F489717884_590x332.jpg&src1=http%3A%2F%2Ff.vimeocdn.com%2Fp%2Fimages%2Fcrawler_play.png"}]},"stats":{"plays":null},"metadata":{"connections":{"comments":{"total":0},"likes":{"total":5}},"interactions":[]},"user":{"name":"Cal Thorley","link":"https:\\/\\/vimeo.com\\/calthorley","pictures":{"sizes":[{"width":30,"height":30,"link":"https:\\/\\/i.vimeocdn.com\\/portrait\\/2545308_30x30?r=pad"},{"width":75,"height":75,"link":"https:\\/\\/i.vimeocdn.com\\/portrait\\/2545308_75x75?r=pad"},{"width":100,"height":100,"link":"https:\\/\\/i.vimeocdn.com\\/portrait\\/2545308_100x100?r=pad"},{"width":300,"height":300,"link":"https:\\/\\/i.vimeocdn.com\\/portrait\\/2545308_300x300?r=pad"}]}}}}]}};
-
-""" # noqa
- response = mock.Mock(text=json)
- results = vimeo.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], u'Hot Rod Revue: The South')
- self.assertEqual(results[0]['url'], 'https://vimeo.com/106557563')
- self.assertEqual(results[0]['content'], '')
- self.assertEqual(results[0]['thumbnail'], 'https://i.vimeocdn.com/video/489717884_590x332.jpg?r=pad')
diff --git a/tests/unit/engines/test_wikidata.py b/tests/unit/engines/test_wikidata.py
deleted file mode 100644
index 347defb71..000000000
--- a/tests/unit/engines/test_wikidata.py
+++ /dev/null
@@ -1,506 +0,0 @@
-# -*- coding: utf-8 -*-
-from lxml.html import fromstring
-from collections import defaultdict
-import mock
-from searx.engines import wikidata
-from searx.testing import SearxTestCase
-
-
-class TestWikidataEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['language'] = 'all'
- params = wikidata.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('wikidata.org', params['url'])
-
- dicto['language'] = 'es_ES'
- params = wikidata.request(query, dicto)
- self.assertIn(query, params['url'])
-
- # successful cases are not tested here to avoid sending additional requests
- def test_response(self):
- self.assertRaises(AttributeError, wikidata.response, None)
- self.assertRaises(AttributeError, wikidata.response, [])
- self.assertRaises(AttributeError, wikidata.response, '')
- self.assertRaises(AttributeError, wikidata.response, '[]')
-
- wikidata.supported_languages = ['en', 'es']
- wikidata.language_aliases = {}
- response = mock.Mock(text='<html></html>', search_params={"language": "en"})
- self.assertEqual(wikidata.response(response), [])
-
- def test_getDetail(self):
- response = {}
- results = wikidata.getDetail(response, "Q123", "en", "en-US")
- self.assertEqual(results, [])
-
- title_html = '<div><div class="wikibase-title-label">Test</div></div>'
- html = """
- <div>
- <div class="wikibase-entitytermsview-heading-description">
- </div>
- <div>
- <ul class="wikibase-sitelinklistview-listview">
- <li data-wb-siteid="enwiki"><a href="http://en.wikipedia.org/wiki/Test">Test</a></li>
- </ul>
- </div>
- </div>
- """
- response = {"parse": {"displaytitle": title_html, "text": html}}
-
- results = wikidata.getDetail(response, "Q123", "en", "en-US")
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['url'], 'https://en.wikipedia.org/wiki/Test')
-
- title_html = """
- <div>
- <div class="wikibase-title-label">
- <span lang="en">Test</span>
- <sup class="wb-language-fallback-indicator">English</sup>
- </div>
- </div>
- """
- html = """
- <div>
- <div class="wikibase-entitytermsview-heading-description">
- <span lang="en">Description</span>
- <sup class="wb-language-fallback-indicator">English</sup>
- </div>
- <div id="P856">
- <div class="wikibase-statementgroupview-property-label">
- <a href="/wiki/Property:P856">
- <span lang="en">official website</span>
- <sup class="wb-language-fallback-indicator">English</sup>
- </a>
- </div>
- <div class="wikibase-statementview-mainsnak">
- <a class="external free" href="https://officialsite.com">
- https://officialsite.com
- </a>
- </div>
- </div>
- <div>
- <ul class="wikibase-sitelinklistview-listview">
- <li data-wb-siteid="enwiki"><a href="http://en.wikipedia.org/wiki/Test">Test</a></li>
- </ul>
- </div>
- </div>
- """
- response = {"parse": {"displaytitle": title_html, "text": html}}
-
- results = wikidata.getDetail(response, "Q123", "yua", "yua_MX")
- self.assertEqual(len(results), 2)
- self.assertEqual(results[0]['title'], 'Official website')
- self.assertEqual(results[0]['url'], 'https://officialsite.com')
-
- self.assertEqual(results[1]['infobox'], 'Test')
- self.assertEqual(results[1]['id'], None)
- self.assertEqual(results[1]['content'], 'Description')
- self.assertEqual(results[1]['attributes'], [])
- self.assertEqual(results[1]['urls'][0]['title'], 'Official website')
- self.assertEqual(results[1]['urls'][0]['url'], 'https://officialsite.com')
- self.assertEqual(results[1]['urls'][1]['title'], 'Wikipedia (en)')
- self.assertEqual(results[1]['urls'][1]['url'], 'https://en.wikipedia.org/wiki/Test')
-
- def test_add_image(self):
- image_src = wikidata.add_image(fromstring("<div></div>"))
- self.assertEqual(image_src, None)
-
- html = u"""
- <div>
- <div id="P18">
- <div class="wikibase-statementgroupview-property-label">
- <a href="/wiki/Property:P18">
- image
- </a>
- </div>
- <div class="wikibase-statementlistview">
- <div class="wikibase-statementview listview-item">
- <div class="wikibase-statementview-rankselector">
- <span class="wikibase-rankselector-normal"></span>
- </div>
- <div class="wikibase-statementview-mainsnak">
- <div>
- <div class="wikibase-snakview-value">
- <div class="commons-media-caption">
- <a href="https://commons.wikimedia.org/wiki/File:image.png">image.png</a>
- <br/>2,687 &#215; 3,356; 1.22 MB
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- """
- html_etree = fromstring(html)
-
- image_src = wikidata.add_image(html_etree)
- self.assertEqual(image_src,
- "https://commons.wikimedia.org/wiki/Special:FilePath/image.png?width=500&height=400")
-
- html = u"""
- <div>
- <div id="P2910">
- <div class="wikibase-statementgroupview-property-label">
- <a href="/wiki/Property:P2910">
- icon
- </a>
- </div>
- <div class="wikibase-statementlistview">
- <div class="wikibase-statementview listview-item">
- <div class="wikibase-statementview-rankselector">
- <span class="wikibase-rankselector-normal"></span>
- </div>
- <div class="wikibase-statementview-mainsnak">
- <div>
- <div class="wikibase-snakview-value">
- <div class="commons-media-caption">
- <a href="https://commons.wikimedia.org/wiki/File:icon.png">icon.png</a>
- <br/>671 &#215; 671; 18 KB</div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div id="P154">
- <div class="wikibase-statementgroupview-property-label">
- <a href="/wiki/Property:P154">
- logo
- </a>
- </div>
- <div class="wikibase-statementlistview">
- <div class="wikibase-statementview listview-item">
- <div class="wikibase-statementview-rankselector">
- <span class="wikibase-rankselector-normal"></span>
- </div>
- <div class="wikibase-statementview-mainsnak">
- <div>
- <div class="wikibase-snakview-value">
- <div class="commons-media-caption">
- <a href="https://commons.wikimedia.org/wiki/File:logo.png">logo.png</a>
- <br/>170 &#215; 170; 1 KB
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- """
- html_etree = fromstring(html)
-
- image_src = wikidata.add_image(html_etree)
- self.assertEqual(image_src,
- "https://commons.wikimedia.org/wiki/Special:FilePath/logo.png?width=500&height=400")
-
- def test_add_attribute(self):
- html = u"""
- <div>
- <div id="P27">
- <div class="wikibase-statementgroupview-property-label">
- <a href="/wiki/Property:P27">
- country of citizenship
- </a>
- </div>
- <div class="wikibase-statementlistview">
- <div class="wikibase-statementview listview-item">
- <div class="wikibase-statementview-rankselector">
- <span class="wikibase-rankselector-normal"></span>
- </div>
- <div class="wikibase-statementview-mainsnak">
- <div>
- <div class="wikibase-snakview-value">
- <a href="/wiki/Q145">
- United Kingdom
- </a>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- """
- attributes = []
- html_etree = fromstring(html)
-
- wikidata.add_attribute(attributes, html_etree, "Fail")
- self.assertEqual(attributes, [])
-
- wikidata.add_attribute(attributes, html_etree, "P27")
- self.assertEqual(len(attributes), 1)
- self.assertEqual(attributes[0]["label"], "Country of citizenship")
- self.assertEqual(attributes[0]["value"], "United Kingdom")
-
- html = u"""
- <div>
- <div id="P569">
- <div class="wikibase-statementgroupview-property-label">
- <a href="/wiki/Property:P569">
- date of birth
- </a>
- </div>
- <div class="wikibase-statementlistview">
- <div class="wikibase-statementview listview-item">
- <div class="wikibase-statementview-rankselector">
- <span class="wikibase-rankselector-normal"></span>
- </div>
- <div class="wikibase-statementview-mainsnak">
- <div>
- <div class="wikibase-snakview-value">
- 27 January 1832
- <sup class="wb-calendar-name">
- Gregorian
- </sup>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- """
- attributes = []
- html_etree = fromstring(html)
- wikidata.add_attribute(attributes, html_etree, "P569", date=True)
- self.assertEqual(len(attributes), 1)
- self.assertEqual(attributes[0]["label"], "Date of birth")
- self.assertEqual(attributes[0]["value"], "27 January 1832")
-
- html = u"""
- <div>
- <div id="P6">
- <div class="wikibase-statementgroupview-property-label">
- <a href="/wiki/Property:P27">
- head of government
- </a>
- </div>
- <div class="wikibase-statementlistview">
- <div class="wikibase-statementview listview-item">
- <div class="wikibase-statementview-rankselector">
- <span class="wikibase-rankselector-normal"></span>
- </div>
- <div class="wikibase-statementview-mainsnak">
- <div>
- <div class="wikibase-snakview-value">
- <a href="/wiki/Q206">
- Old Prime Minister
- </a>
- </div>
- </div>
- </div>
- </div>
- <div class="wikibase-statementview listview-item">
- <div class="wikibase-statementview-rankselector">
- <span class="wikibase-rankselector-preferred"></span>
- </div>
- <div class="wikibase-statementview-mainsnak">
- <div>
- <div class="wikibase-snakview-value">
- <a href="/wiki/Q3099714">
- Actual Prime Minister
- </a>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- """
- attributes = []
- html_etree = fromstring(html)
- wikidata.add_attribute(attributes, html_etree, "P6")
- self.assertEqual(len(attributes), 1)
- self.assertEqual(attributes[0]["label"], "Head of government")
- self.assertEqual(attributes[0]["value"], "Old Prime Minister, Actual Prime Minister")
-
- attributes = []
- html_etree = fromstring(html)
- wikidata.add_attribute(attributes, html_etree, "P6", trim=True)
- self.assertEqual(len(attributes), 1)
- self.assertEqual(attributes[0]["value"], "Actual Prime Minister")
-
- def test_add_url(self):
- html = u"""
- <div>
- <div id="P856">
- <div class="wikibase-statementgroupview-property-label">
- <a href="/wiki/Property:P856">
- official website
- </a>
- </div>
- <div class="wikibase-statementlistview">
- <div class="wikibase-statementview listview-item">
- <div class="wikibase-statementview-mainsnak">
- <div>
- <div class="wikibase-snakview-value">
- <a class="external free" href="https://searx.me">
- https://searx.me/
- </a>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- """
- urls = []
- html_etree = fromstring(html)
- wikidata.add_url(urls, html_etree, 'P856')
- self.assertEquals(len(urls), 1)
- self.assertIn({'title': 'Official website', 'url': 'https://searx.me/'}, urls)
- urls = []
- results = []
- wikidata.add_url(urls, html_etree, 'P856', 'custom label', results=results)
- self.assertEquals(len(urls), 1)
- self.assertEquals(len(results), 1)
- self.assertIn({'title': 'custom label', 'url': 'https://searx.me/'}, urls)
- self.assertIn({'title': 'custom label', 'url': 'https://searx.me/'}, results)
-
- html = u"""
- <div>
- <div id="P856">
- <div class="wikibase-statementgroupview-property-label">
- <a href="/wiki/Property:P856">
- official website
- </a>
- </div>
- <div class="wikibase-statementlistview">
- <div class="wikibase-statementview listview-item">
- <div class="wikibase-statementview-mainsnak">
- <div>
- <div class="wikibase-snakview-value">
- <a class="external free" href="http://www.worldofwarcraft.com">
- http://www.worldofwarcraft.com
- </a>
- </div>
- </div>
- </div>
- </div>
- <div class="wikibase-statementview listview-item">
- <div class="wikibase-statementview-mainsnak">
- <div>
- <div class="wikibase-snakview-value">
- <a class="external free" href="http://eu.battle.net/wow/en/">
- http://eu.battle.net/wow/en/
- </a>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- """
- urls = []
- html_etree = fromstring(html)
- wikidata.add_url(urls, html_etree, 'P856')
- self.assertEquals(len(urls), 2)
- self.assertIn({'title': 'Official website', 'url': 'http://www.worldofwarcraft.com'}, urls)
- self.assertIn({'title': 'Official website', 'url': 'http://eu.battle.net/wow/en/'}, urls)
-
- def test_get_imdblink(self):
- html = u"""
- <div>
- <div class="wikibase-statementview-mainsnak">
- <div>
- <div class="wikibase-snakview-value">
- <a class="wb-external-id" href="http://www.imdb.com/tt0433664">
- tt0433664
- </a>
- </div>
- </div>
- </div>
- </div>
- """
- html_etree = fromstring(html)
- imdblink = wikidata.get_imdblink(html_etree, 'https://www.imdb.com/')
-
- html = u"""
- <div>
- <div class="wikibase-statementview-mainsnak">
- <div>
- <div class="wikibase-snakview-value">
- <a class="wb-external-id"
- href="href="http://tools.wmflabs.org/...http://www.imdb.com/&id=nm4915994"">
- nm4915994
- </a>
- </div>
- </div>
- </div>
- </div>
- """
- html_etree = fromstring(html)
- imdblink = wikidata.get_imdblink(html_etree, 'https://www.imdb.com/')
- self.assertIn('https://www.imdb.com/name/nm4915994', imdblink)
-
- def test_get_geolink(self):
- html = u"""
- <div>
- <div class="wikibase-statementview-mainsnak">
- <div>
- <div class="wikibase-snakview-value">
- 60°N, 40°E
- </div>
- </div>
- </div>
- </div>
- """
- html_etree = fromstring(html)
- geolink = wikidata.get_geolink(html_etree)
- self.assertIn('https://www.openstreetmap.org/', geolink)
- self.assertIn('lat=60&lon=40', geolink)
-
- html = u"""
- <div>
- <div class="wikibase-statementview-mainsnak">
- <div>
- <div class="wikibase-snakview-value">
- 34°35'59"S, 58°22'55"W
- </div>
- </div>
- </div>
- </div>
- """
- html_etree = fromstring(html)
- geolink = wikidata.get_geolink(html_etree)
- self.assertIn('https://www.openstreetmap.org/', geolink)
- self.assertIn('lat=-34.59', geolink)
- self.assertIn('lon=-58.38', geolink)
-
- def test_get_wikilink(self):
- html = """
- <div>
- <div>
- <ul class="wikibase-sitelinklistview-listview">
- <li data-wb-siteid="arwiki"><a href="http://ar.wikipedia.org/wiki/Test">Test</a></li>
- <li data-wb-siteid="enwiki"><a href="http://en.wikipedia.org/wiki/Test">Test</a></li>
- </ul>
- </div>
- <div>
- <ul class="wikibase-sitelinklistview-listview">
- <li data-wb-siteid="enwikiquote"><a href="https://en.wikiquote.org/wiki/Test">Test</a></li>
- </ul>
- </div>
- </div>
- """
- html_etree = fromstring(html)
- wikilink = wikidata.get_wikilink(html_etree, 'nowiki')
- self.assertEqual(wikilink, None)
- wikilink = wikidata.get_wikilink(html_etree, 'enwiki')
- self.assertEqual(wikilink, 'https://en.wikipedia.org/wiki/Test')
- wikilink = wikidata.get_wikilink(html_etree, 'arwiki')
- self.assertEqual(wikilink, 'https://ar.wikipedia.org/wiki/Test')
- wikilink = wikidata.get_wikilink(html_etree, 'enwikiquote')
- self.assertEqual(wikilink, 'https://en.wikiquote.org/wiki/Test')
diff --git a/tests/unit/engines/test_wikipedia.py b/tests/unit/engines/test_wikipedia.py
deleted file mode 100644
index 316b12bc5..000000000
--- a/tests/unit/engines/test_wikipedia.py
+++ /dev/null
@@ -1,263 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import wikipedia
-from searx.testing import SearxTestCase
-
-
-class TestWikipediaEngine(SearxTestCase):
-
- def test_request(self):
- wikipedia.supported_languages = ['fr', 'en', 'no']
- wikipedia.language_aliases = {'nb': 'no'}
-
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['language'] = 'fr-FR'
- params = wikipedia.request(query.encode('utf-8'), dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('test_query', params['url'])
- self.assertIn('Test_Query', params['url'])
- self.assertIn('fr.wikipedia.org', params['url'])
-
- query = u'Test_Query'
- params = wikipedia.request(query.encode('utf-8'), dicto)
- self.assertIn('Test_Query', params['url'])
- self.assertNotIn('test_query', params['url'])
-
- dicto['language'] = 'nb'
- params = wikipedia.request(query, dicto)
- self.assertIn('no.wikipedia.org', params['url'])
- dicto['language'] = 'all'
- params = wikipedia.request(query, dicto)
- self.assertIn('en', params['url'])
-
- dicto['language'] = 'xx'
- params = wikipedia.request(query, dicto)
- self.assertIn('en.wikipedia.org', params['url'])
-
- def test_response(self):
- dicto = defaultdict(dict)
- dicto['language'] = 'fr'
-
- self.assertRaises(AttributeError, wikipedia.response, None)
- self.assertRaises(AttributeError, wikipedia.response, [])
- self.assertRaises(AttributeError, wikipedia.response, '')
- self.assertRaises(AttributeError, wikipedia.response, '[]')
-
- # page not found
- json = """
- {
- "batchcomplete": "",
- "query": {
- "normalized": [],
- "pages": {
- "-1": {
- "ns": 0,
- "title": "",
- "missing": ""
- }
- }
- }
- }"""
- response = mock.Mock(text=json, search_params=dicto)
- self.assertEqual(wikipedia.response(response), [])
-
- # normal case
- json = """
- {
- "batchcomplete": "",
- "query": {
- "normalized": [],
- "pages": {
- "12345": {
- "pageid": 12345,
- "ns": 0,
- "title": "The Title",
- "extract": "The Title is...",
- "thumbnail": {
- "source": "img_src.jpg"
- },
- "pageimage": "img_name.jpg"
- }
- }
- }
- }"""
- response = mock.Mock(text=json, search_params=dicto)
- results = wikipedia.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
- self.assertEqual(results[0]['title'], u'The Title')
- self.assertIn('fr.wikipedia.org/wiki/The_Title', results[0]['url'])
- self.assertEqual(results[1]['infobox'], u'The Title')
- self.assertIn('fr.wikipedia.org/wiki/The_Title', results[1]['id'])
- self.assertIn('The Title is...', results[1]['content'])
- self.assertEqual(results[1]['img_src'], 'img_src.jpg')
-
- # disambiguation page
- json = """
- {
- "batchcomplete": "",
- "query": {
- "normalized": [],
- "pages": {
- "12345": {
- "pageid": 12345,
- "ns": 0,
- "title": "The Title",
- "extract": "The Title can be:\\nThe Title 1\\nThe Title 2\\nThe Title 3\\nThe Title 4......................................................................................................................................." """ # noqa
- json += """
- }
- }
- }
- }"""
- response = mock.Mock(text=json, search_params=dicto)
- results = wikipedia.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
-
- # no image
- json = """
- {
- "batchcomplete": "",
- "query": {
- "normalized": [],
- "pages": {
- "12345": {
- "pageid": 12345,
- "ns": 0,
- "title": "The Title",
- "extract": "The Title is......................................................................................................................................................................................." """ # noqa
- json += """
- }
- }
- }
- }"""
- response = mock.Mock(text=json, search_params=dicto)
- results = wikipedia.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
- self.assertIn('The Title is...', results[1]['content'])
- self.assertEqual(results[1]['img_src'], None)
-
- # title not in first paragraph
- json = u"""
- {
- "batchcomplete": "",
- "query": {
- "normalized": [],
- "pages": {
- "12345": {
- "pageid": 12345,
- "ns": 0,
- "title": "披頭四樂隊",
- "extract": "披头士乐队....................................................................................................................................................................................................\\n披頭四樂隊...", """ # noqa
- json += """
- "thumbnail": {
- "source": "img_src.jpg"
- },
- "pageimage": "img_name.jpg"
- }
- }
- }
- }"""
- response = mock.Mock(text=json, search_params=dicto)
- results = wikipedia.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
- self.assertEqual(results[1]['infobox'], u'披頭四樂隊')
- self.assertIn(u'披头士乐队...', results[1]['content'])
-
- def test_fetch_supported_languages(self):
- html = u"""<html></html>"""
- response = mock.Mock(text=html)
- languages = wikipedia._fetch_supported_languages(response)
- self.assertEqual(type(languages), dict)
- self.assertEqual(len(languages), 0)
-
- html = u"""
- <html>
- <body>
- <div>
- <div>
- <h3>Table header</h3>
- <table class="sortable jquery-tablesorter">
- <thead>
- <tr>
- <th>N</th>
- <th>Language</th>
- <th>Language (local)</th>
- <th>Wiki</th>
- <th>Articles</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>2</td>
- <td><a>Swedish</a></td>
- <td><a>Svenska</a></td>
- <td><a>sv</a></td>
- <td><a><b>3000000</b></a></td>
- </tr>
- <tr>
- <td>3</td>
- <td><a>Cebuano</a></td>
- <td><a>Sinugboanong Binisaya</a></td>
- <td><a>ceb</a></td>
- <td><a><b>3000000</b></a></td>
- </tr>
- </tbody>
- </table>
- <h3>Table header</h3>
- <table class="sortable jquery-tablesorter">
- <thead>
- <tr>
- <th>N</th>
- <th>Language</th>
- <th>Language (local)</th>
- <th>Wiki</th>
- <th>Articles</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>2</td>
- <td><a>Norwegian (Bokmål)</a></td>
- <td><a>Norsk (Bokmål)</a></td>
- <td><a>no</a></td>
- <td><a><b>100000</b></a></td>
- </tr>
- </tbody>
- </table>
- </div>
- </div>
- </body>
- </html>
- """
- response = mock.Mock(text=html)
- languages = wikipedia._fetch_supported_languages(response)
- self.assertEqual(type(languages), dict)
- self.assertEqual(len(languages), 3)
-
- self.assertIn('sv', languages)
- self.assertIn('ceb', languages)
- self.assertIn('no', languages)
-
- self.assertEqual(type(languages['sv']), dict)
- self.assertEqual(type(languages['ceb']), dict)
- self.assertEqual(type(languages['no']), dict)
-
- self.assertIn('name', languages['sv'])
- self.assertIn('english_name', languages['sv'])
- self.assertIn('articles', languages['sv'])
-
- self.assertEqual(languages['sv']['name'], 'Svenska')
- self.assertEqual(languages['sv']['english_name'], 'Swedish')
- self.assertEqual(languages['sv']['articles'], 3000000)
- self.assertEqual(languages['ceb']['name'], 'Sinugboanong Binisaya')
- self.assertEqual(languages['ceb']['english_name'], 'Cebuano')
- self.assertEqual(languages['ceb']['articles'], 3000000)
- self.assertEqual(languages['no']['name'], u'Norsk (Bokmål)')
- self.assertEqual(languages['no']['english_name'], u'Norwegian (Bokmål)')
- self.assertEqual(languages['no']['articles'], 100000)
diff --git a/tests/unit/engines/test_wolframalpha_api.py b/tests/unit/engines/test_wolframalpha_api.py
deleted file mode 100644
index 0433b34aa..000000000
--- a/tests/unit/engines/test_wolframalpha_api.py
+++ /dev/null
@@ -1,166 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from requests import Request
-from searx.engines import wolframalpha_api
-from searx.testing import SearxTestCase
-
-
-class TestWolframAlphaAPIEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- params = wolframalpha_api.request(query, dicto)
-
- # TODO: test api_key
- self.assertIn('url', params)
- self.assertIn('https://api.wolframalpha.com/v2/query?', params['url'])
- self.assertIn(query, params['url'])
- self.assertEqual('https://www.wolframalpha.com/input/?i=test_query', params['headers']['Referer'])
-
- def test_replace_pua_chars(self):
- self.assertEqual('i', wolframalpha_api.replace_pua_chars(u'\uf74e'))
-
- def test_response(self):
- self.assertRaises(AttributeError, wolframalpha_api.response, None)
- self.assertRaises(AttributeError, wolframalpha_api.response, [])
- self.assertRaises(AttributeError, wolframalpha_api.response, '')
- self.assertRaises(AttributeError, wolframalpha_api.response, '[]')
-
- referer_url = 'referer_url'
- request = Request(headers={'Referer': referer_url})
-
- # test failure
- xml = '''<?xml version='1.0' encoding='UTF-8'?>
- <queryresult success='false' error='false' />
- '''
- response = mock.Mock(content=xml.encode('utf-8'))
- self.assertEqual(wolframalpha_api.response(response), [])
-
- # test basic case
- xml = b"""<?xml version='1.0' encoding='UTF-8'?>
- <queryresult success='true'
- error='false'
- numpods='3'
- datatypes='Math'
- id='queryresult_id'
- host='http://www4c.wolframalpha.com'
- related='related_url'
- version='2.6'>
- <pod title='Input'
- scanner='Identity'
- id='Input'
- numsubpods='1'>
- <subpod title=''>
- <img src='input_img_src.gif'
- alt='input_img_alt'
- title='input_img_title' />
- <plaintext>input_plaintext</plaintext>
- </subpod>
- </pod>
- <pod title='Result'
- scanner='Simplification'
- id='Result'
- numsubpods='1'
- primary='true'>
- <subpod title=''>
- <img src='result_img_src.gif'
- alt='result_img_alt'
- title='result_img_title' />
- <plaintext>result_plaintext</plaintext>
- </subpod>
- </pod>
- <pod title='Manipulatives illustration'
- scanner='Arithmetic'
- id='Illustration'
- numsubpods='1'>
- <subpod title=''>
- <img src='illustration_img_src.gif'
- alt='illustration_img_alt' />
- <plaintext>illustration_plaintext</plaintext>
- </subpod>
- </pod>
- </queryresult>
- """
- response = mock.Mock(content=xml, request=request)
- results = wolframalpha_api.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
- self.assertEqual('input_plaintext', results[0]['infobox'])
-
- self.assertEqual(len(results[0]['attributes']), 3)
- self.assertEqual('Input', results[0]['attributes'][0]['label'])
- self.assertEqual('input_plaintext', results[0]['attributes'][0]['value'])
- self.assertEqual('Result', results[0]['attributes'][1]['label'])
- self.assertEqual('result_plaintext', results[0]['attributes'][1]['value'])
- self.assertEqual('Manipulatives illustration', results[0]['attributes'][2]['label'])
- self.assertEqual('illustration_img_src.gif', results[0]['attributes'][2]['image']['src'])
- self.assertEqual('illustration_img_alt', results[0]['attributes'][2]['image']['alt'])
-
- self.assertEqual(len(results[0]['urls']), 1)
-
- self.assertEqual(referer_url, results[0]['urls'][0]['url'])
- self.assertEqual('Wolfram|Alpha', results[0]['urls'][0]['title'])
- self.assertEqual(referer_url, results[1]['url'])
- self.assertEqual('Wolfram|Alpha (input_plaintext)', results[1]['title'])
- self.assertIn('result_plaintext', results[1]['content'])
-
- # test calc
- xml = b"""<?xml version='1.0' encoding='UTF-8'?>
- <queryresult success='true'
- error='false'
- numpods='2'
- datatypes=''
- parsetimedout='false'
- id='queryresult_id'
- host='http://www5b.wolframalpha.com'
- related='related_url'
- version='2.6' >
- <pod title='Indefinite integral'
- scanner='Integral'
- id='IndefiniteIntegral'
- error='false'
- numsubpods='1'
- primary='true'>
- <subpod title=''>
- <img src='integral_image.gif'
- alt='integral_img_alt'
- title='integral_img_title' />
- <plaintext>integral_plaintext</plaintext>
- </subpod>
- </pod>
- <pod title='Plot of the integral'
- scanner='Integral'
- id='Plot'
- error='false'
- numsubpods='1'>
- <subpod title=''>
- <img src='plot.gif'
- alt='plot_alt'
- title='' />
- <plaintext></plaintext>
- </subpod>
- </pod>
- </queryresult>
- """
- response = mock.Mock(content=xml, request=request)
- results = wolframalpha_api.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
- self.assertEqual('integral_plaintext', results[0]['infobox'])
-
- self.assertEqual(len(results[0]['attributes']), 2)
- self.assertEqual('Indefinite integral', results[0]['attributes'][0]['label'])
- self.assertEqual('integral_plaintext', results[0]['attributes'][0]['value'])
- self.assertEqual('Plot of the integral', results[0]['attributes'][1]['label'])
- self.assertEqual('plot.gif', results[0]['attributes'][1]['image']['src'])
- self.assertEqual('plot_alt', results[0]['attributes'][1]['image']['alt'])
-
- self.assertEqual(len(results[0]['urls']), 1)
-
- self.assertEqual(referer_url, results[0]['urls'][0]['url'])
- self.assertEqual('Wolfram|Alpha', results[0]['urls'][0]['title'])
- self.assertEqual(referer_url, results[1]['url'])
- self.assertEqual('Wolfram|Alpha (integral_plaintext)', results[1]['title'])
- self.assertIn('integral_plaintext', results[1]['content'])
diff --git a/tests/unit/engines/test_wolframalpha_noapi.py b/tests/unit/engines/test_wolframalpha_noapi.py
deleted file mode 100644
index 982edd9f2..000000000
--- a/tests/unit/engines/test_wolframalpha_noapi.py
+++ /dev/null
@@ -1,224 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from requests import Request
-from searx.engines import wolframalpha_noapi
-from searx.testing import SearxTestCase
-
-
-class TestWolframAlphaNoAPIEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- params = wolframalpha_noapi.request(query, dicto)
-
- self.assertIn('url', params)
- self.assertIn('https://www.wolframalpha.com/input/json.jsp', params['url'])
- self.assertIn(query, params['url'])
- self.assertEqual('https://www.wolframalpha.com/input/?i=test_query', params['headers']['Referer'])
-
- def test_response(self):
- self.assertRaises(AttributeError, wolframalpha_noapi.response, None)
- self.assertRaises(AttributeError, wolframalpha_noapi.response, [])
- self.assertRaises(AttributeError, wolframalpha_noapi.response, '')
- self.assertRaises(AttributeError, wolframalpha_noapi.response, '[]')
-
- referer_url = 'referer_url'
- request = Request(headers={'Referer': referer_url})
-
- # test failure
- json = r'''
- {"queryresult" : {
- "success" : false,
- "error" : false,
- "numpods" : 0,
- "id" : "",
- "host" : "https:\/\/www5a.wolframalpha.com",
- "didyoumeans" : {}
- }}
- '''
- response = mock.Mock(text=json, request=request)
- self.assertEqual(wolframalpha_noapi.response(response), [])
-
- # test basic case
- json = r'''
- {"queryresult" : {
- "success" : true,
- "error" : false,
- "numpods" : 6,
- "datatypes" : "Math",
- "id" : "queryresult_id",
- "host" : "https:\/\/www5b.wolframalpha.com",
- "related" : "related_url",
- "version" : "2.6",
- "pods" : [
- {
- "title" : "Input",
- "scanners" : [
- "Identity"
- ],
- "id" : "Input",
- "error" : false,
- "numsubpods" : 1,
- "subpods" : [
- {
- "title" : "",
- "img" : {
- "src" : "input_img_src.gif",
- "alt" : "input_img_alt",
- "title" : "input_img_title"
- },
- "plaintext" : "input_plaintext",
- "minput" : "input_minput"
- }
- ]
- },
- {
- "title" : "Result",
- "scanners" : [
- "Simplification"
- ],
- "id" : "Result",
- "error" : false,
- "numsubpods" : 1,
- "primary" : true,
- "subpods" : [
- {
- "title" : "",
- "img" : {
- "src" : "result_img_src.gif",
- "alt" : "result_img_alt",
- "title" : "result_img_title"
- },
- "plaintext" : "result_plaintext",
- "moutput" : "result_moutput"
- }
- ]
- },
- {
- "title" : "Manipulatives illustration",
- "scanners" : [
- "Arithmetic"
- ],
- "id" : "Illustration",
- "error" : false,
- "numsubpods" : 1,
- "subpods" : [
- {
- "title" : "",
- "CDFcontent" : "Resizeable",
- "img" : {
- "src" : "illustration_img_src.gif",
- "alt" : "illustration_img_alt",
- "title" : "illustration_img_title"
- },
- "plaintext" : "illustration_img_plaintext"
- }
- ]
- }
- ]
- }}
- '''
- response = mock.Mock(text=json, request=request)
- results = wolframalpha_noapi.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
- self.assertEqual('input_plaintext', results[0]['infobox'])
-
- self.assertEqual(len(results[0]['attributes']), 3)
- self.assertEqual('Input', results[0]['attributes'][0]['label'])
- self.assertEqual('input_plaintext', results[0]['attributes'][0]['value'])
- self.assertEqual('Result', results[0]['attributes'][1]['label'])
- self.assertEqual('result_plaintext', results[0]['attributes'][1]['value'])
- self.assertEqual('Manipulatives illustration', results[0]['attributes'][2]['label'])
- self.assertEqual('illustration_img_src.gif', results[0]['attributes'][2]['image']['src'])
- self.assertEqual('illustration_img_alt', results[0]['attributes'][2]['image']['alt'])
-
- self.assertEqual(len(results[0]['urls']), 1)
-
- self.assertEqual(referer_url, results[0]['urls'][0]['url'])
- self.assertEqual('Wolfram|Alpha', results[0]['urls'][0]['title'])
- self.assertEqual(referer_url, results[1]['url'])
- self.assertEqual('Wolfram|Alpha (input_plaintext)', results[1]['title'])
- self.assertIn('result_plaintext', results[1]['content'])
-
- # test calc
- json = r"""
- {"queryresult" : {
- "success" : true,
- "error" : false,
- "numpods" : 2,
- "datatypes" : "",
- "id" : "queryresult_id",
- "host" : "https:\/\/www4b.wolframalpha.com",
- "related" : "related_url",
- "version" : "2.6",
- "pods" : [
- {
- "title" : "Indefinite integral",
- "scanners" : [
- "Integral"
- ],
- "id" : "IndefiniteIntegral",
- "error" : false,
- "numsubpods" : 1,
- "primary" : true,
- "subpods" : [
- {
- "title" : "",
- "img" : {
- "src" : "integral_img_src.gif",
- "alt" : "integral_img_alt",
- "title" : "integral_img_title"
- },
- "plaintext" : "integral_plaintext",
- "minput" : "integral_minput",
- "moutput" : "integral_moutput"
- }
- ]
- },
- {
- "title" : "Plot of the integral",
- "scanners" : [
- "Integral"
- ],
- "id" : "Plot",
- "error" : false,
- "numsubpods" : 1,
- "subpods" : [
- {
- "title" : "",
- "img" : {
- "src" : "plot.gif",
- "alt" : "plot_alt",
- "title" : "plot_title"
- },
- "plaintext" : "",
- "minput" : "plot_minput"
- }
- ]
- }
- ]
- }}
- """
- response = mock.Mock(text=json, request=request)
- results = wolframalpha_noapi.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
- self.assertEqual('integral_plaintext', results[0]['infobox'])
-
- self.assertEqual(len(results[0]['attributes']), 2)
- self.assertEqual('Indefinite integral', results[0]['attributes'][0]['label'])
- self.assertEqual('integral_plaintext', results[0]['attributes'][0]['value'])
- self.assertEqual('Plot of the integral', results[0]['attributes'][1]['label'])
- self.assertEqual('plot.gif', results[0]['attributes'][1]['image']['src'])
- self.assertEqual('plot_alt', results[0]['attributes'][1]['image']['alt'])
-
- self.assertEqual(len(results[0]['urls']), 1)
-
- self.assertEqual(referer_url, results[0]['urls'][0]['url'])
- self.assertEqual('Wolfram|Alpha', results[0]['urls'][0]['title'])
- self.assertEqual(referer_url, results[1]['url'])
- self.assertEqual('Wolfram|Alpha (integral_plaintext)', results[1]['title'])
- self.assertIn('integral_plaintext', results[1]['content'])
diff --git a/tests/unit/engines/test_www1x.py b/tests/unit/engines/test_www1x.py
deleted file mode 100644
index 9df8de6bf..000000000
--- a/tests/unit/engines/test_www1x.py
+++ /dev/null
@@ -1,57 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import www1x
-from searx.testing import SearxTestCase
-
-
-class TestWww1xEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- params = www1x.request(query, defaultdict(dict))
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('1x.com' in params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, www1x.response, None)
- self.assertRaises(AttributeError, www1x.response, [])
- self.assertRaises(AttributeError, www1x.response, '')
- self.assertRaises(AttributeError, www1x.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(www1x.response(response), [])
- html = """
- <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE characters
- [
- <!ELEMENT characters (character*) >
- <!ELEMENT character (#PCDATA ) >
-
- <!ENTITY iexcl "&#161;" >
- <!ENTITY cent "&#162;" >
- <!ENTITY pound "&#163;" >
- ]
- ><root><searchresult><![CDATA[<table border="0" cellpadding="0" cellspacing="0" width="100%">
- <tr>
- <td style="min-width: 220px;" valign="top">
- <div style="font-size: 30px; margin: 0px 0px 20px 0px;">Photos</div>
- <div>
- <a href="/photo/123456" class="dynamiclink">
-<img border="0" class="searchresult" src="/images/user/testimage-123456.jpg" style="width: 125px; height: 120px;">
- </a>
- <a title="sjoerd lammers street photography" href="/member/sjoerdlammers" class="dynamiclink">
-<img border="0" class="searchresult" src="/images/profile/60c48b394c677d2fa4d9e7d263aabf44-square.jpg">
- </a>
- </div>
- </td>
- </table>
- ]]></searchresult></root>
- """
- response = mock.Mock(text=html)
- results = www1x.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['url'], 'https://1x.com/photo/123456')
- self.assertEqual(results[0]['thumbnail_src'], 'https://1x.com/images/user/testimage-123456.jpg')
- self.assertEqual(results[0]['content'], '')
- self.assertEqual(results[0]['template'], 'images.html')
diff --git a/tests/unit/engines/test_yacy.py b/tests/unit/engines/test_yacy.py
deleted file mode 100644
index f49532cf4..000000000
--- a/tests/unit/engines/test_yacy.py
+++ /dev/null
@@ -1,96 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import yacy
-from searx.testing import SearxTestCase
-
-
-class TestYacyEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['language'] = 'fr_FR'
- params = yacy.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('localhost', params['url'])
- self.assertIn('fr', params['url'])
-
- dicto['language'] = 'all'
- params = yacy.request(query, dicto)
- self.assertIn('url', params)
- self.assertNotIn('lr=lang_', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, yacy.response, None)
- self.assertRaises(AttributeError, yacy.response, [])
- self.assertRaises(AttributeError, yacy.response, '')
- self.assertRaises(AttributeError, yacy.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(yacy.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(yacy.response(response), [])
-
- json = """
- {
- "channels": [
- {
- "title": "YaCy P2P-Search for test",
- "description": "Search for test",
- "link": "http://search.yacy.de:7001/yacysearch.html?query=test&amp;resource=global&amp;contentdom=0",
- "image": {
- "url": "http://search.yacy.de:7001/env/grafics/yacy.png",
- "title": "Search for test",
- "link": "http://search.yacy.de:7001/yacysearch.html?query=test&amp;resource=global&amp;contentdom=0"
- },
- "totalResults": "249",
- "startIndex": "0",
- "itemsPerPage": "5",
- "searchTerms": "test",
- "items": [
- {
- "title": "This is the title",
- "link": "http://this.is.the.url",
- "code": "",
- "description": "This should be the content",
- "pubDate": "Sat, 08 Jun 2013 02:00:00 +0200",
- "size": "44213",
- "sizename": "43 kbyte",
- "guid": "lzh_1T_5FP-A",
- "faviconCode": "XTS4uQ_5FP-A",
- "host": "www.gamestar.de",
- "path": "/spiele/city-of-heroes-freedom/47019.html",
- "file": "47019.html",
- "urlhash": "lzh_1T_5FP-A",
- "ranking": "0.20106804"
- },
- {
- "title": "This is the title2",
- "icon": "/ViewImage.png?maxwidth=96&amp;maxheight=96&amp;code=7EbAbW6BpPOA",
- "image": "http://image.url/image.png",
- "cache": "/ViewImage.png?quadratic=&amp;url=http://golem.ivwbox.de/cgi-bin/ivw/CP/G_INET?d=14071378",
- "url": "http://this.is.the.url",
- "urlhash": "7EbAbW6BpPOA",
- "host": "www.golem.de",
- "width": "-1",
- "height": "-1"
- }
- ]
- }
- ]
- }
- """
- response = mock.Mock(text=json)
- results = yacy.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
- self.assertEqual(results[0]['title'], 'This is the title')
- self.assertEqual(results[0]['url'], 'http://this.is.the.url')
- self.assertEqual(results[0]['content'], 'This should be the content')
- self.assertEqual(results[1]['img_src'], 'http://image.url/image.png')
- self.assertEqual(results[1]['content'], '')
- self.assertEqual(results[1]['url'], 'http://this.is.the.url')
- self.assertEqual(results[1]['title'], 'This is the title2')
diff --git a/tests/unit/engines/test_yahoo.py b/tests/unit/engines/test_yahoo.py
deleted file mode 100644
index e52c1109e..000000000
--- a/tests/unit/engines/test_yahoo.py
+++ /dev/null
@@ -1,190 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import yahoo
-from searx.testing import SearxTestCase
-
-
-class TestYahooEngine(SearxTestCase):
-
- def test_parse_url(self):
- test_url = 'http://r.search.yahoo.com/_ylt=A0LEb9JUSKcAEGRXNyoA;_ylu=X3oDMTEzZm1qazYwBHNlYwNzcgRwb3MDMQRjb' +\
- '2xvA2Jm2dGlkA1NNRTcwM18x/RV=2/RE=1423106085/RO=10/RU=https%3a%2f%2fthis.is.the.url%2f/RK=0/RS=' +\
- 'dtcJsfP4mEeBOjnVfUQ-'
- url = yahoo.parse_url(test_url)
- self.assertEqual('https://this.is.the.url/', url)
-
- test_url = 'http://r.search.yahoo.com/_ylt=A0LElb9JUSKcAEGRXNyoA;_ylu=X3oDMTEzZm1qazYwBHNlYwNzcgRwb3MDMQRjb' +\
- '2xvA2Jm2dGlkA1NNRTcwM18x/RV=2/RE=1423106085/RO=10/RU=https%3a%2f%2fthis.is.the.url%2f/RS=' +\
- 'dtcJsfP4mEeBOjnVfUQ-'
- url = yahoo.parse_url(test_url)
- self.assertEqual('https://this.is.the.url/', url)
-
- test_url = 'https://this.is.the.url/'
- url = yahoo.parse_url(test_url)
- self.assertEqual('https://this.is.the.url/', url)
-
- def test_request(self):
- yahoo.supported_languages = ['en', 'fr', 'zh-CHT', 'zh-CHS']
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['time_range'] = ''
- dicto['language'] = 'fr-FR'
- params = yahoo.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('search.yahoo.com', params['url'])
- self.assertIn('fr', params['url'])
- self.assertIn('cookies', params)
- self.assertIn('sB', params['cookies'])
- self.assertIn('fr', params['cookies']['sB'])
-
- dicto['language'] = 'zh'
- params = yahoo.request(query, dicto)
- self.assertIn('zh_chs', params['url'])
- self.assertIn('zh_chs', params['cookies']['sB'])
-
- dicto['language'] = 'zh-TW'
- params = yahoo.request(query, dicto)
- self.assertIn('zh_cht', params['url'])
- self.assertIn('zh_cht', params['cookies']['sB'])
-
- dicto['language'] = 'all'
- params = yahoo.request(query, dicto)
- self.assertIn('cookies', params)
- self.assertIn('sB', params['cookies'])
- self.assertIn('en', params['cookies']['sB'])
- self.assertIn('en', params['url'])
-
- def test_no_url_in_request_year_time_range(self):
- dicto = defaultdict(dict)
- query = 'test_query'
- dicto['time_range'] = 'year'
- params = yahoo.request(query, dicto)
- self.assertEqual({}, params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, yahoo.response, None)
- self.assertRaises(AttributeError, yahoo.response, [])
- self.assertRaises(AttributeError, yahoo.response, '')
- self.assertRaises(AttributeError, yahoo.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(yahoo.response(response), [])
-
- html = """
-<ol class="reg mb-15 searchCenterMiddle">
- <li class="first">
- <div class="dd algo fst Sr">
- <div class="compTitle">
- <h3 class="title"><a class=" td-u" href="http://r.search.yahoo.com/_ylt=A0LEb9JUSKcAEGRXNyoA;
- _ylu=X3oDMTEzZm1qazYwBHNlYwNzcgRwb3MDMQRjb2xvA2Jm2dGlkA1NNRTcwM18x/RV=2/RE=1423106085/RO=10
- /RU=https%3a%2f%2fthis.is.the.url%2f/RK=0/RS=dtcJsfP4mEeBOjnVfUQ-"
- target="_blank" data-bid="54e712e13671c">
- <b><b>This is the title</b></b></a>
- </h3>
- </div>
- <div class="compText aAbs">
- <p class="lh-18"><b><b>This is the </b>content</b>
- </p>
- </div>
- </div>
- </li>
- <li>
- <div class="dd algo lst Sr">
- <div class="compTitle">
- </div>
- <div class="compText aAbs">
- <p class="lh-18">This is the second content</p>
- </div>
- </div>
- </li>
-</ol>
-<div class="dd assist fst lst AlsoTry" data-bid="54e712e138d04">
- <div class="compTitle mb-4 h-17">
- <h3 class="title">Also Try</h3> </div>
- <table class="compTable m-0 ac-1st td-u fz-ms">
- <tbody>
- <tr>
- <td class="w-50p pr-28"><a href="https://search.yahoo.com/"><B>This is the </B>suggestion<B></B></a>
- </td>
- </tr>
- </table>
-</div>
- """
- response = mock.Mock(text=html)
- results = yahoo.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
- self.assertEqual(results[0]['title'], 'This is the title')
- self.assertEqual(results[0]['url'], 'https://this.is.the.url/')
- self.assertEqual(results[0]['content'], 'This is the content')
- self.assertEqual(results[1]['suggestion'], 'This is the suggestion')
-
- html = """
-<ol class="reg mb-15 searchCenterMiddle">
- <li class="first">
- <div class="dd algo fst Sr">
- <div class="compTitle">
- <h3 class="title"><a class=" td-u" href="http://r.search.yahoo.com/_ylt=A0LEb9JUSKcAEGRXNyoA;
- _ylu=X3oDMTEzZm1qazYwBHNlYwNzcgRwb3MDMQRjb2xvA2Jm2dGlkA1NNRTcwM18x/RV=2/RE=1423106085/RO=10
- /RU=https%3a%2f%2fthis.is.the.url%2f/RK=0/RS=dtcJsfP4mEeBOjnVfUQ-"
- target="_blank" data-bid="54e712e13671c">
- <b><b>This is the title</b></b></a>
- </h3>
- </div>
- <div class="compText aAbs">
- <p class="lh-18"><b><b>This is the </b>content</b>
- </p>
- </div>
- </div>
- </li>
-</ol>
- """
- response = mock.Mock(text=html)
- results = yahoo.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This is the title')
- self.assertEqual(results[0]['url'], 'https://this.is.the.url/')
- self.assertEqual(results[0]['content'], 'This is the content')
-
- html = """
- <li class="b_algo" u="0|5109|4755453613245655|UAGjXgIrPH5yh-o5oNHRx_3Zta87f_QO">
- </li>
- """
- response = mock.Mock(text=html)
- results = yahoo.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- def test_fetch_supported_languages(self):
- html = """<html></html>"""
- response = mock.Mock(text=html)
- results = yahoo._fetch_supported_languages(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- html = """
- <html>
- <div>
- <div id="yschlang">
- <span>
- <label><input value="lang_ar"></input></label>
- </span>
- <span>
- <label><input value="lang_zh_chs"></input></label>
- <label><input value="lang_zh_cht"></input></label>
- </span>
- </div>
- </div>
- </html>
- """
- response = mock.Mock(text=html)
- languages = yahoo._fetch_supported_languages(response)
- self.assertEqual(type(languages), list)
- self.assertEqual(len(languages), 3)
- self.assertIn('ar', languages)
- self.assertIn('zh-CHS', languages)
- self.assertIn('zh-CHT', languages)
diff --git a/tests/unit/engines/test_yahoo_news.py b/tests/unit/engines/test_yahoo_news.py
deleted file mode 100644
index ae27df2a5..000000000
--- a/tests/unit/engines/test_yahoo_news.py
+++ /dev/null
@@ -1,150 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-from datetime import datetime
-import mock
-from searx.engines import yahoo_news
-from searx.testing import SearxTestCase
-
-
-class TestYahooNewsEngine(SearxTestCase):
-
- def test_request(self):
- yahoo_news.supported_languages = ['en', 'fr']
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['language'] = 'fr-FR'
- params = yahoo_news.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('news.search.yahoo.com', params['url'])
- self.assertIn('fr', params['url'])
- self.assertIn('cookies', params)
- self.assertIn('sB', params['cookies'])
- self.assertIn('fr', params['cookies']['sB'])
-
- dicto['language'] = 'all'
- params = yahoo_news.request(query, dicto)
- self.assertIn('cookies', params)
- self.assertIn('sB', params['cookies'])
- self.assertIn('en', params['cookies']['sB'])
- self.assertIn('en', params['url'])
-
- def test_sanitize_url(self):
- url = "test.url"
- self.assertEqual(url, yahoo_news.sanitize_url(url))
-
- url = "www.yahoo.com/;_ylt=test"
- self.assertEqual("www.yahoo.com/", yahoo_news.sanitize_url(url))
-
- def test_response(self):
- self.assertRaises(AttributeError, yahoo_news.response, None)
- self.assertRaises(AttributeError, yahoo_news.response, [])
- self.assertRaises(AttributeError, yahoo_news.response, '')
- self.assertRaises(AttributeError, yahoo_news.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(yahoo_news.response(response), [])
-
- html = """
- <ol class=" reg searchCenterMiddle">
- <li class="first">
- <div class="compTitle">
- <h3>
- <a class="yschttl spt" href="http://this.is.the.url" target="_blank">
- This is
- the <b>title</b>...
- </a>
- </h3>
- </div>
- <div>
- <span class="cite">Business via Yahoo!</span>
- <span class="tri fc-2nd ml-10">May 01 10:00 AM</span>
- </div>
- <div class="compText">
- This is the content
- </div>
- </li>
- <li class="first">
- <div class="compTitle">
- <h3>
- <a class="yschttl spt" target="_blank">
- </a>
- </h3>
- </div>
- <div class="compText">
- </div>
- </li>
- </ol>
- """
- response = mock.Mock(text=html)
- results = yahoo_news.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This is the title...')
- self.assertEqual(results[0]['url'], 'http://this.is.the.url/')
- self.assertEqual(results[0]['content'], 'This is the content')
-
- html = """
- <ol class=" reg searchCenterMiddle">
- <li class="first">
- <div class="compTitle">
- <h3>
- <a class="yschttl spt" href="http://this.is.the.url" target="_blank">
- This is
- the <b>title</b>...
- </a>
- </h3>
- </div>
- <div>
- <span class="cite">Business via Yahoo!</span>
- <span class="tri fc-2nd ml-10">2 hours, 22 minutes ago</span>
- </div>
- <div class="compText">
- This is the content
- </div>
- </li>
- <li>
- <div class="compTitle">
- <h3>
- <a class="yschttl spt" href="http://this.is.the.url" target="_blank">
- This is
- the <b>title</b>...
- </a>
- </h3>
- </div>
- <div>
- <span class="cite">Business via Yahoo!</span>
- <span class="tri fc-2nd ml-10">22 minutes ago</span>
- </div>
- <div class="compText">
- This is the content
- </div>
- </li>
- <li>
- <div class="compTitle">
- <h3>
- <a class="yschttl spt" href="http://this.is.the.url" target="_blank">
- This is
- the <b>title</b>...
- </a>
- </h3>
- </div>
- <div>
- <span class="cite">Business via Yahoo!</span>
- <span class="tri fc-2nd ml-10">Feb 03 09:45AM 1900</span>
- </div>
- <div class="compText">
- This is the content
- </div>
- </li>
- </ol>
- """
- response = mock.Mock(text=html)
- results = yahoo_news.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 3)
- self.assertEqual(results[0]['title'], 'This is the title...')
- self.assertEqual(results[0]['url'], 'http://this.is.the.url/')
- self.assertEqual(results[0]['content'], 'This is the content')
- self.assertEqual(results[2]['publishedDate'].year, datetime.now().year)
diff --git a/tests/unit/engines/test_youtube_api.py b/tests/unit/engines/test_youtube_api.py
deleted file mode 100644
index 0d4d478c3..000000000
--- a/tests/unit/engines/test_youtube_api.py
+++ /dev/null
@@ -1,111 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import youtube_api
-from searx.testing import SearxTestCase
-
-
-class TestYoutubeAPIEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- dicto['language'] = 'fr_FR'
- params = youtube_api.request(query, dicto)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertIn('googleapis.com', params['url'])
- self.assertIn('youtube', params['url'])
- self.assertIn('fr', params['url'])
-
- dicto['language'] = 'all'
- params = youtube_api.request(query, dicto)
- self.assertFalse('fr' in params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, youtube_api.response, None)
- self.assertRaises(AttributeError, youtube_api.response, [])
- self.assertRaises(AttributeError, youtube_api.response, '')
- self.assertRaises(AttributeError, youtube_api.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(youtube_api.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(youtube_api.response(response), [])
-
- json = """
- {
- "kind": "youtube#searchListResponse",
- "etag": "xmg9xJZuZD438sF4hb-VcBBREXc/YJQDcTBCDcaBvl-sRZJoXdvy1ME",
- "nextPageToken": "CAUQAA",
- "pageInfo": {
- "totalResults": 1000000,
- "resultsPerPage": 20
- },
- "items": [
- {
- "kind": "youtube#searchResult",
- "etag": "xmg9xJZuZD438sF4hb-VcBBREXc/IbLO64BMhbHIgWLwLw7MDYe7Hs4",
- "id": {
- "kind": "youtube#video",
- "videoId": "DIVZCPfAOeM"
- },
- "snippet": {
- "publishedAt": "2015-05-29T22:41:04.000Z",
- "channelId": "UCNodmx1ERIjKqvcJLtdzH5Q",
- "title": "Title",
- "description": "Description",
- "thumbnails": {
- "default": {
- "url": "https://i.ytimg.com/vi/DIVZCPfAOeM/default.jpg"
- },
- "medium": {
- "url": "https://i.ytimg.com/vi/DIVZCPfAOeM/mqdefault.jpg"
- },
- "high": {
- "url": "https://i.ytimg.com/vi/DIVZCPfAOeM/hqdefault.jpg"
- }
- },
- "channelTitle": "MinecraftUniverse",
- "liveBroadcastContent": "none"
- }
- }
- ]
- }
- """
- response = mock.Mock(text=json)
- results = youtube_api.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Title')
- self.assertEqual(results[0]['url'], 'https://www.youtube.com/watch?v=DIVZCPfAOeM')
- self.assertEqual(results[0]['content'], 'Description')
- self.assertEqual(results[0]['thumbnail'], 'https://i.ytimg.com/vi/DIVZCPfAOeM/hqdefault.jpg')
- self.assertTrue('DIVZCPfAOeM' in results[0]['embedded'])
-
- json = """
- {
- "kind": "youtube#searchListResponse",
- "etag": "xmg9xJZuZD438sF4hb-VcBBREXc/YJQDcTBCDcaBvl-sRZJoXdvy1ME",
- "nextPageToken": "CAUQAA",
- "pageInfo": {
- "totalResults": 1000000,
- "resultsPerPage": 20
- }
- }
- """
- response = mock.Mock(text=json)
- results = youtube_api.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- json = """
- {"toto":{"entry":[]
- }
- }
- """
- response = mock.Mock(text=json)
- results = youtube_api.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_youtube_noapi.py b/tests/unit/engines/test_youtube_noapi.py
deleted file mode 100644
index cbf7b9bcd..000000000
--- a/tests/unit/engines/test_youtube_noapi.py
+++ /dev/null
@@ -1,124 +0,0 @@
-# -*- coding: utf-8 -*-
-from collections import defaultdict
-import mock
-from searx.engines import youtube_noapi
-from searx.testing import SearxTestCase
-
-
-class TestYoutubeNoAPIEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 0
- dicto['time_range'] = ''
- params = youtube_noapi.request(query, dicto)
- self.assertIn('url', params)
- self.assertIn(query, params['url'])
- self.assertIn('youtube.com', params['url'])
-
- def test_time_range_search(self):
- dicto = defaultdict(dict)
- query = 'test_query'
- dicto['time_range'] = 'year'
- params = youtube_noapi.request(query, dicto)
- self.assertIn('&sp=EgIIBQ%253D%253D', params['url'])
-
- dicto['time_range'] = 'month'
- params = youtube_noapi.request(query, dicto)
- self.assertIn('&sp=EgIIBA%253D%253D', params['url'])
-
- dicto['time_range'] = 'week'
- params = youtube_noapi.request(query, dicto)
- self.assertIn('&sp=EgIIAw%253D%253D', params['url'])
-
- dicto['time_range'] = 'day'
- params = youtube_noapi.request(query, dicto)
- self.assertIn('&sp=EgIIAg%253D%253D', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, youtube_noapi.response, None)
- self.assertRaises(AttributeError, youtube_noapi.response, [])
- self.assertRaises(AttributeError, youtube_noapi.response, '')
- self.assertRaises(AttributeError, youtube_noapi.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(youtube_noapi.response(response), [])
-
- html = """
- <div></div>
- <script>
- window["ytInitialData"] = {
- "contents": {
- "twoColumnSearchResultsRenderer": {
- "primaryContents": {
- "sectionListRenderer": {
- "contents": [
- {
- "itemSectionRenderer": {
- "contents": [
- {
- "videoRenderer": {
- "videoId": "DIVZCPfAOeM",
- "title": {
- "simpleText": "Title"
- },
- "descriptionSnippet": {
- "runs": [
- {
- "text": "Des"
- },
- {
- "text": "cription"
- }
- ]
- }
- }
- },
- {
- "videoRenderer": {
- "videoId": "9C_HReR_McQ",
- "title": {
- "simpleText": "Title"
- },
- "descriptionSnippet": {
- "simpleText": "Description"
- }
- }
- }
- ]
- }
- }
- ]
- }
- }
- }
- }
- };
- </script>
- """
- response = mock.Mock(text=html)
- results = youtube_noapi.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 2)
- self.assertEqual(results[0]['title'], 'Title')
- self.assertEqual(results[0]['url'], 'https://www.youtube.com/watch?v=DIVZCPfAOeM')
- self.assertEqual(results[0]['content'], 'Description')
- self.assertEqual(results[0]['thumbnail'], 'https://i.ytimg.com/vi/DIVZCPfAOeM/hqdefault.jpg')
- self.assertTrue('DIVZCPfAOeM' in results[0]['embedded'])
- self.assertEqual(results[1]['title'], 'Title')
- self.assertEqual(results[1]['url'], 'https://www.youtube.com/watch?v=9C_HReR_McQ')
- self.assertEqual(results[1]['content'], 'Description')
- self.assertEqual(results[1]['thumbnail'], 'https://i.ytimg.com/vi/9C_HReR_McQ/hqdefault.jpg')
- self.assertTrue('9C_HReR_McQ' in results[1]['embedded'])
-
- html = """
- <ol id="item-section-063864" class="item-section">
- <li>
- </li>
- </ol>
- """
- response = mock.Mock(text=html)
- results = youtube_noapi.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/unsplash_fixture.json b/tests/unit/engines/unsplash_fixture.json
deleted file mode 100644
index 4c8db2a2c..000000000
--- a/tests/unit/engines/unsplash_fixture.json
+++ /dev/null
@@ -1,241 +0,0 @@
-{
- "total": 2,
- "total_pages": 1,
- "results": [
- {
- "id": "FY8d721UO_4",
- "created_at": "2018-04-12T14:20:35-04:00",
- "updated_at": "2018-08-28T20:58:33-04:00",
- "width": 3891,
- "height": 5829,
- "color": "#152C33",
- "description": "low angle photography of swimming penguin",
- "urls": {
- "raw": "https://images.unsplash.com/photo-1523557148507-1b77641c7e7c?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=095c5fc319c5a77c705f49ad63e0f195",
- "full": "https://images.unsplash.com/photo-1523557148507-1b77641c7e7c?ixlib=rb-0.3.5&q=85&fm=jpg&crop=entropy&cs=srgb&ixid=eyJhcHBfaWQiOjEyMDd9&s=74be977849c173d6929636d491a760c3",
- "regular": "https://images.unsplash.com/photo-1523557148507-1b77641c7e7c?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjEyMDd9&s=ad65df26970bd010085f0ca25434de33",
- "small": "https://images.unsplash.com/photo-1523557148507-1b77641c7e7c?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjEyMDd9&s=5d2edfd073c31eb8ee7b305222bdc5a2",
- "thumb": "https://images.unsplash.com/photo-1523557148507-1b77641c7e7c?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max&ixid=eyJhcHBfaWQiOjEyMDd9&s=a9b9e56e63efc6f4611a87ce7e9a48f8"
- },
- "links": {
- "self": "https://api.unsplash.com/photos/FY8d721UO_4",
- "html": "https://unsplash.com/photos/FY8d721UO_4",
- "download": "https://unsplash.com/photos/FY8d721UO_4/download",
- "download_location": "https://api.unsplash.com/photos/FY8d721UO_4/download"
- },
- "categories": [],
- "sponsored": false,
- "likes": 31,
- "liked_by_user": false,
- "current_user_collections": [],
- "slug": null,
- "user": {
- "id": "N4gE4mrG8lE",
- "updated_at": "2018-10-03T02:51:19-04:00",
- "username": "gaspanik",
- "name": "Masaaki Komori",
- "first_name": "Masaaki",
- "last_name": "Komori",
- "twitter_username": "cipher",
- "portfolio_url": "https://www.instagram.com/cipher/",
- "bio": null,
- "location": "Tokyo, JAPAN",
- "links": {
- "self": "https://api.unsplash.com/users/gaspanik",
- "html": "https://unsplash.com/@gaspanik",
- "photos": "https://api.unsplash.com/users/gaspanik/photos",
- "likes": "https://api.unsplash.com/users/gaspanik/likes",
- "portfolio": "https://api.unsplash.com/users/gaspanik/portfolio",
- "following": "https://api.unsplash.com/users/gaspanik/following",
- "followers": "https://api.unsplash.com/users/gaspanik/followers"
- },
- "profile_image": {
- "small": "https://images.unsplash.com/profile-fb-1502270358-e7c86c1011ce.jpg?ixlib=rb-0.3.5&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32&s=9fe12f6d177bd6fdbd56d233a80c01a3",
- "medium": "https://images.unsplash.com/profile-fb-1502270358-e7c86c1011ce.jpg?ixlib=rb-0.3.5&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64&s=6ad7d156b62e438ae9dc794cba712fff",
- "large": "https://images.unsplash.com/profile-fb-1502270358-e7c86c1011ce.jpg?ixlib=rb-0.3.5&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128&s=13a08a2e72e7d11632410e92bd3a9406"
- },
- "instagram_username": "cipher",
- "total_collections": 0,
- "total_likes": 406,
- "total_photos": 196
- },
- "tags": [
- {
- "title": "animal"
- },
- {
- "title": "water"
- },
- {
- "title": "swim"
- },
- {
- "title": "aquarium"
- },
- {
- "title": "wallpaper"
- },
- {
- "title": "blue"
- },
- {
- "title": "sealife"
- },
- {
- "title": "wildlife"
- },
- {
- "title": "bird"
- },
- {
- "title": "deep sea"
- },
- {
- "title": "fish"
- },
- {
- "title": "water life"
- }
- ],
- "photo_tags": [
- {
- "title": "animal"
- },
- {
- "title": "water"
- },
- {
- "title": "swim"
- },
- {
- "title": "aquarium"
- },
- {
- "title": "wallpaper"
- }
- ]
- },
- {
- "id": "ayKyc01xLWA",
- "created_at": "2018-02-16T23:14:31-05:00",
- "updated_at": "2018-08-28T20:48:27-04:00",
- "width": 4928,
- "height": 3264,
- "color": "#161618",
- "description": "black and white penguins on ice field",
- "urls": {
- "raw": "https://images.unsplash.com/photo-1518840801558-9770b4a34eeb?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=4e107a2bc49ab561ba6272eea2ec725d",
- "full": "https://images.unsplash.com/photo-1518840801558-9770b4a34eeb?ixlib=rb-0.3.5&q=85&fm=jpg&crop=entropy&cs=srgb&ixid=eyJhcHBfaWQiOjEyMDd9&s=f9b1e4d4572ab44efb2cf3d601d2b4d9",
- "regular": "https://images.unsplash.com/photo-1518840801558-9770b4a34eeb?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjEyMDd9&s=4430cedb63841f1fe055d5005316cc96",
- "small": "https://images.unsplash.com/photo-1518840801558-9770b4a34eeb?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjEyMDd9&s=ee73c7af22ce445d408e240821ce07af",
- "thumb": "https://images.unsplash.com/photo-1518840801558-9770b4a34eeb?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max&ixid=eyJhcHBfaWQiOjEyMDd9&s=934302390d383cad8c571905e3a80bac"
- },
- "links": {
- "self": "https://api.unsplash.com/photos/ayKyc01xLWA",
- "html": "https://unsplash.com/photos/ayKyc01xLWA",
- "download": "https://unsplash.com/photos/ayKyc01xLWA/download",
- "download_location": "https://api.unsplash.com/photos/ayKyc01xLWA/download"
- },
- "categories": [],
- "sponsored": false,
- "likes": 37,
- "liked_by_user": false,
- "current_user_collections": [],
- "slug": null,
- "user": {
- "id": "tRb_KGw60Xk",
- "updated_at": "2018-09-20T11:51:54-04:00",
- "username": "ghost_cat",
- "name": "Danielle Barnes",
- "first_name": "Danielle",
- "last_name": "Barnes",
- "twitter_username": null,
- "portfolio_url": null,
- "bio": null,
- "location": null,
- "links": {
- "self": "https://api.unsplash.com/users/ghost_cat",
- "html": "https://unsplash.com/@ghost_cat",
- "photos": "https://api.unsplash.com/users/ghost_cat/photos",
- "likes": "https://api.unsplash.com/users/ghost_cat/likes",
- "portfolio": "https://api.unsplash.com/users/ghost_cat/portfolio",
- "following": "https://api.unsplash.com/users/ghost_cat/following",
- "followers": "https://api.unsplash.com/users/ghost_cat/followers"
- },
- "profile_image": {
- "small": "https://images.unsplash.com/profile-fb-1508491082-ae77f53e9ac3.jpg?ixlib=rb-0.3.5&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32&s=751bf6a557763648d52ffd7e60e79436",
- "medium": "https://images.unsplash.com/profile-fb-1508491082-ae77f53e9ac3.jpg?ixlib=rb-0.3.5&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64&s=e46cd1c8713035f045130e1b093b981e",
- "large": "https://images.unsplash.com/profile-fb-1508491082-ae77f53e9ac3.jpg?ixlib=rb-0.3.5&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128&s=352eabcf107c3ce95fe51a18485f116b"
- },
- "instagram_username": null,
- "total_collections": 0,
- "total_likes": 0,
- "total_photos": 21
- },
- "tags": [
- {
- "title": "ice"
- },
- {
- "title": "bird"
- },
- {
- "title": "ice field"
- },
- {
- "title": "iceberg"
- },
- {
- "title": "snow"
- },
- {
- "title": "frozen"
- },
- {
- "title": "animal"
- },
- {
- "title": "wildlife"
- },
- {
- "title": "wild"
- },
- {
- "title": "antarctica"
- },
- {
- "title": "sunshine"
- },
- {
- "title": "daylight"
- },
- {
- "title": "wilderness"
- },
- {
- "title": "south pole"
- },
- {
- "title": "flock"
- }
- ],
- "photo_tags": [
- {
- "title": "ice"
- },
- {
- "title": "bird"
- },
- {
- "title": "ice field"
- },
- {
- "title": "iceberg"
- },
- {
- "title": "snow"
- }
- ]
- }
- ]
-} \ No newline at end of file
diff --git a/tests/unit/test_preferences.py b/tests/unit/test_preferences.py
index 885c515e2..61ac0e8e4 100644
--- a/tests/unit/test_preferences.py
+++ b/tests/unit/test_preferences.py
@@ -122,3 +122,23 @@ class TestSettings(SearxTestCase):
plugin3 = PluginStub('plugin3', True)
setting = PluginsSetting('name', choices=[plugin1, plugin2, plugin3])
self.assertEquals(setting.get_enabled(), set(['plugin1', 'plugin3']))
+
+
+class TestPreferences(SearxTestCase):
+
+ def test_encode(self):
+ from searx.preferences import Preferences
+ pref = Preferences(['oscar'], ['general'], {}, [])
+ url_params = 'eJx1VMmO2zAM_Zr6YrTocujJh6JF0QEKzKAz7VVgJNohLIseUU7ivy-VcWy5yyGOTVGP73GLKJNPYjiYgGeT4NB8BS9YOSY' \
+ 'TUdifMDYM-vmGY1d5CN0EHTYOK88W_PXNkcDBozOjnzoK0vyi4bWnHs2RU4-zvHr_-RF9a-5Cy3GARByy7X7EkKMoBeMp9CuPQ-SzYMx' \
+ '8Vr9P1qKI-XJ_p1fOkRJWNCgVM0a-zAttmBJbHkaPSZlNts-_jiuBFgUh2mPztkpHHLBhsRArDHvm356eHh5vATS0Mqagr0ZsZO_V8hT' \
+ 'B9srt54_v6jewJugqL4Nn_hYSdhxnI-jRpi05GDQCStOT7UGVmJY8ZnltRKyF23SGiLWjqNcygKGkpyeGZIywJfD1gI5AjRTAmBM55Aw' \
+ 'Q0Tn626lj7jzWo4e5hnEsIlprX6dTgdBRpyRBFKTDgBF8AasVyT4gvSTEoXRpXWRyG3CYQYld65I_V6lboILTMAlZY65_ejRDcHgp0Tv' \
+ 'EPtGAsqTiBf3m76g7pP9B84mwjPvuUtASRDei1nDF2ix_JXW91UJkXrPh6RAhznVmKyQl7dwJdMJ6bz1QOmgzYlrEzHDMcEUuo44AgS1' \
+ 'CvkjaOb2Q2AyY5oGDTs_OLXE_c2I5cg9hk3kEJZ0fu4SuktsIA2RhuJwP86AdripThCBeO9uVUejyPGmFSxPrqEYcuWi25zOEXV9tc1m' \
+ '_KP1nafYtdfv6Q9hKfWmGm9A_3G635UwiVndLGdFCiLWkONk0xUxGLGGweGWTa2nZYZ0fS1YKlE3Uuw8fPl52E5U8HJYbC7sbjXUsrnT' \
+ 'XHXRbELfO-1fGSqskiGnMK7B0dV3t8Lq08pbdtYpuVdoKWA2Yjuyah_vHp2rZWjo0zXL8Gw8DTj0='
+ pref.parse_encoded_data(url_params)
+ self.assertEqual(
+ vars(pref.key_value_settings['categories']),
+ {'value': ['general'], 'choices': ['general', 'none']})
diff --git a/tests/unit/test_query.py b/tests/unit/test_query.py
index 49ccb608f..e4c0bdeed 100644
--- a/tests/unit/test_query.py
+++ b/tests/unit/test_query.py
@@ -62,3 +62,45 @@ class TestQuery(SearxTestCase):
self.assertEquals(len(query.query_parts), 1)
self.assertEquals(len(query.languages), 0)
self.assertFalse(query.specific)
+
+ def test_timeout_below100(self):
+ query_text = '<3 the query'
+ query = RawTextQuery(query_text, [])
+ query.parse_query()
+
+ self.assertEquals(query.getFullQuery(), query_text)
+ self.assertEquals(len(query.query_parts), 3)
+ self.assertEquals(query.timeout_limit, 3)
+ self.assertFalse(query.specific)
+
+ def test_timeout_above100(self):
+ query_text = '<350 the query'
+ query = RawTextQuery(query_text, [])
+ query.parse_query()
+
+ self.assertEquals(query.getFullQuery(), query_text)
+ self.assertEquals(len(query.query_parts), 3)
+ self.assertEquals(query.timeout_limit, 0.35)
+ self.assertFalse(query.specific)
+
+ def test_timeout_above1000(self):
+ query_text = '<3500 the query'
+ query = RawTextQuery(query_text, [])
+ query.parse_query()
+
+ self.assertEquals(query.getFullQuery(), query_text)
+ self.assertEquals(len(query.query_parts), 3)
+ self.assertEquals(query.timeout_limit, 3.5)
+ self.assertFalse(query.specific)
+
+ def test_timeout_invalid(self):
+ # invalid number: it is not bang but it is part of the query
+ query_text = '<xxx the query'
+ query = RawTextQuery(query_text, [])
+ query.parse_query()
+
+ self.assertEquals(query.getFullQuery(), query_text)
+ self.assertEquals(len(query.query_parts), 1)
+ self.assertEquals(query.query_parts[0], query_text)
+ self.assertEquals(query.timeout_limit, None)
+ self.assertFalse(query.specific)
diff --git a/tests/unit/test_search.py b/tests/unit/test_search.py
index af5fffd8b..18c221954 100644
--- a/tests/unit/test_search.py
+++ b/tests/unit/test_search.py
@@ -1,10 +1,112 @@
# -*- coding: utf-8 -*-
from searx.testing import SearxTestCase
+from searx.preferences import Preferences
+from searx.engines import engines
+
+import searx.search
+
+
+SAFESEARCH = 0
+PAGENO = 1
+PUBLIC_ENGINE_NAME = 'general dummy'
+PRIVATE_ENGINE_NAME = 'general private offline'
+TEST_ENGINES = [
+ {
+ 'name': PUBLIC_ENGINE_NAME,
+ 'engine': 'dummy',
+ 'categories': 'general',
+ 'shortcut': 'gd',
+ 'timeout': 3.0,
+ 'tokens': [],
+ },
+ {
+ 'name': PRIVATE_ENGINE_NAME,
+ 'engine': 'dummy-offline',
+ 'categories': 'general',
+ 'shortcut': 'do',
+ 'timeout': 3.0,
+ 'offline': True,
+ 'tokens': ['my-token'],
+ },
+]
-# TODO
class SearchTestCase(SearxTestCase):
- def test_(self):
- pass
+ @classmethod
+ def setUpClass(cls):
+ searx.engines.initialize_engines(TEST_ENGINES)
+
+ def test_timeout_simple(self):
+ searx.search.max_request_timeout = None
+ search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
+ ['general'], 'en-US', SAFESEARCH, PAGENO, None, None,
+ preferences=Preferences(['oscar'], ['general'], engines, []))
+ search = searx.search.Search(search_query)
+ search.search()
+ self.assertEquals(search.actual_timeout, 3.0)
+
+ def test_timeout_query_above_default_nomax(self):
+ searx.search.max_request_timeout = None
+ search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
+ ['general'], 'en-US', SAFESEARCH, PAGENO, None, 5.0,
+ preferences=Preferences(['oscar'], ['general'], engines, []))
+ search = searx.search.Search(search_query)
+ search.search()
+ self.assertEquals(search.actual_timeout, 3.0)
+
+ def test_timeout_query_below_default_nomax(self):
+ searx.search.max_request_timeout = None
+ search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
+ ['general'], 'en-US', SAFESEARCH, PAGENO, None, 1.0,
+ preferences=Preferences(['oscar'], ['general'], engines, []))
+ search = searx.search.Search(search_query)
+ search.search()
+ self.assertEquals(search.actual_timeout, 1.0)
+
+ def test_timeout_query_below_max(self):
+ searx.search.max_request_timeout = 10.0
+ search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
+ ['general'], 'en-US', SAFESEARCH, PAGENO, None, 5.0,
+ preferences=Preferences(['oscar'], ['general'], engines, []))
+ search = searx.search.Search(search_query)
+ search.search()
+ self.assertEquals(search.actual_timeout, 5.0)
+
+ def test_timeout_query_above_max(self):
+ searx.search.max_request_timeout = 10.0
+ search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': PUBLIC_ENGINE_NAME}],
+ ['general'], 'en-US', SAFESEARCH, PAGENO, None, 15.0,
+ preferences=Preferences(['oscar'], ['general'], engines, []))
+ search = searx.search.Search(search_query)
+ search.search()
+ self.assertEquals(search.actual_timeout, 10.0)
+
+ def test_query_private_engine_without_token(self):
+ search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': PRIVATE_ENGINE_NAME}],
+ ['general'], 'en-US', SAFESEARCH, PAGENO, None, 2.0,
+ preferences=Preferences(['oscar'], ['general'], engines, []))
+ search = searx.search.Search(search_query)
+ results = search.search()
+ self.assertEquals(results.results_length(), 0)
+
+ def test_query_private_engine_with_incorrect_token(self):
+ preferences_with_tokens = Preferences(['oscar'], ['general'], engines, [])
+ preferences_with_tokens.parse_dict({'tokens': 'bad-token'})
+ search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': PRIVATE_ENGINE_NAME}],
+ ['general'], 'en-US', SAFESEARCH, PAGENO, None, 2.0,
+ preferences=preferences_with_tokens)
+ search = searx.search.Search(search_query)
+ results = search.search()
+ self.assertEquals(results.results_length(), 0)
+
+ def test_query_private_engine_with_correct_token(self):
+ preferences_with_tokens = Preferences(['oscar'], ['general'], engines, [])
+ preferences_with_tokens.parse_dict({'tokens': 'my-token'})
+ search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': PRIVATE_ENGINE_NAME}],
+ ['general'], 'en-US', SAFESEARCH, PAGENO, None, 2.0,
+ preferences=preferences_with_tokens)
+ search = searx.search.Search(search_query)
+ results = search.search()
+ self.assertEquals(results.results_length(), 1)
diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py
index 4854636c7..b09b9d414 100644
--- a/tests/unit/test_utils.py
+++ b/tests/unit/test_utils.py
@@ -90,6 +90,13 @@ class TestUtils(SearxTestCase):
self.assertEqual(utils.match_language('iw-IL', ['he-IL']), 'he-IL')
self.assertEqual(utils.match_language('he-IL', ['iw-IL'], aliases), 'iw-IL')
+ def test_ecma_unscape(self):
+ self.assertEqual(utils.ecma_unescape('text%20with%20space'), 'text with space')
+ self.assertEqual(utils.ecma_unescape('text using %xx: %F3'),
+ u'text using %xx: ó')
+ self.assertEqual(utils.ecma_unescape('text using %u: %u5409, %u4E16%u754c'),
+ u'text using %u: 吉, 世界')
+
class TestHTMLTextExtractor(SearxTestCase):
@@ -128,3 +135,17 @@ class TestUnicodeWriter(SearxTestCase):
rows = [1, 2, 3]
self.unicode_writer.writerows(rows)
self.assertEqual(self.unicode_writer.writerow.call_count, len(rows))
+
+
+class TestNewHmac(SearxTestCase):
+
+ def test_bytes(self):
+ for secret_key in ['secret', b'secret', 1]:
+ if secret_key == 1:
+ with self.assertRaises(TypeError):
+ utils.new_hmac(secret_key, b'http://example.com')
+ continue
+ res = utils.new_hmac(secret_key, b'http://example.com')
+ self.assertEqual(
+ res,
+ '23e2baa2404012a5cc8e4a18b4aabf0dde4cb9b56f679ddc0fd6d7c24339d819')
diff --git a/tests/unit/test_webapp.py b/tests/unit/test_webapp.py
index e6739bfe5..72ace4850 100644
--- a/tests/unit/test_webapp.py
+++ b/tests/unit/test_webapp.py
@@ -15,7 +15,7 @@ class ViewsTestCase(SearxTestCase):
self.app = webapp.app.test_client()
# set some defaults
- self.test_results = [
+ test_results = [
{
'content': 'first test content',
'title': 'First Test',
@@ -33,25 +33,39 @@ class ViewsTestCase(SearxTestCase):
},
]
+ timings = [
+ {
+ 'engine': 'startpage',
+ 'total': 0.8,
+ 'load': 0.7
+ },
+ {
+ 'engine': 'youtube',
+ 'total': 0.9,
+ 'load': 0.6
+ }
+ ]
+
def search_mock(search_self, *args):
- search_self.result_container = Mock(get_ordered_results=lambda: self.test_results,
+ search_self.result_container = Mock(get_ordered_results=lambda: test_results,
answers=set(),
corrections=set(),
suggestions=set(),
infoboxes=[],
unresponsive_engines=set(),
- results=self.test_results,
+ results=test_results,
results_number=lambda: 3,
- results_length=lambda: len(self.test_results))
+ results_length=lambda: len(test_results),
+ get_timings=lambda: timings)
- Search.search = search_mock
+ self.setattr4test(Search, 'search', search_mock)
def get_current_theme_name_mock(override=None):
if override:
return override
return 'legacy'
- webapp.get_current_theme_name = get_current_theme_name_mock
+ self.setattr4test(webapp, 'get_current_theme_name', get_current_theme_name_mock)
self.maxDiff = None # to see full diffs
@@ -77,6 +91,7 @@ class ViewsTestCase(SearxTestCase):
result_dict = json.loads(result.data.decode('utf-8'))
self.assertEqual('test', result_dict['query'])
+ self.assertEqual(len(result_dict['results']), 2)
self.assertEqual(result_dict['results'][0]['content'], 'first test content')
self.assertEqual(result_dict['results'][0]['url'], 'http://first.test.xyz')
@@ -157,3 +172,9 @@ class ViewsTestCase(SearxTestCase):
def test_favicon(self):
result = self.app.get('/favicon.ico')
self.assertEqual(result.status_code, 200)
+
+ def test_config(self):
+ result = self.app.get('/config')
+ self.assertEqual(result.status_code, 200)
+ json_result = result.get_json()
+ self.assertTrue(json_result)
diff --git a/utils/makefile.include b/utils/makefile.include
new file mode 100644
index 000000000..716889c02
--- /dev/null
+++ b/utils/makefile.include
@@ -0,0 +1,128 @@
+# -*- coding: utf-8; mode: makefile-gmake -*-
+
+make-help:
+ @echo ' make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build'
+ @echo ' make V=2 [targets] 2 => give reason for rebuild of target'
+
+quiet_cmd_common_clean = CLEAN $@
+ cmd_common_clean = \
+ rm -rf tests/build ;\
+ find . -name '*.orig' -exec rm -f {} + ;\
+ find . -name '*.rej' -exec rm -f {} + ;\
+ find . -name '*~' -exec rm -f {} + ;\
+ find . -name '*.bak' -exec rm -f {} + ;\
+
+FMT = cat
+ifeq ($(shell which fmt >/dev/null 2>&1; echo $$?), 0)
+FMT = fmt
+endif
+
+# MS-Windows
+#
+# For a minimal *make-environment*, I'am using the gnu-tools from:
+#
+# - GNU MCU Eclipse Windows Build Tools, which brings 'make', 'rm' etc.
+# https://github.com/gnu-mcu-eclipse/windows-build-tools/releases
+#
+# - git for Windows, which brings 'find', 'grep' etc.
+# https://git-scm.com/download/win
+
+
+# normpath
+#
+# System-dependent normalization of the path name
+#
+# usage: $(call normpath,/path/to/file)
+
+normpath = $1
+ifeq ($(OS),Windows_NT)
+ normpath = $(subst /,\,$1)
+endif
+
+
+# stolen from linux/Makefile
+#
+
+ifeq ("$(origin V)", "command line")
+ KBUILD_VERBOSE = $(V)
+endif
+ifndef KBUILD_VERBOSE
+ KBUILD_VERBOSE = 0
+endif
+
+ifeq ($(KBUILD_VERBOSE),1)
+ quiet =
+ Q =
+else
+ quiet=quiet_
+ Q = @
+endif
+
+# stolen from linux/scripts/Kbuild.include
+#
+
+# Convenient variables
+comma := ,
+quote := "
+#" this comment is only for emacs highlighting
+squote := '
+#' this comment is only for emacs highlighting
+empty :=
+space := $(empty) $(empty)
+space_escape := _-_SPACE_-_
+
+# Find any prerequisites that is newer than target or that does not exist.
+# PHONY targets skipped in both cases.
+any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^)
+#
+###
+# why - tell why a a target got build
+# enabled by make V=2
+# Output (listed in the order they are checked):
+# (1) - due to target is PHONY
+# (2) - due to target missing
+# (3) - due to: file1.h file2.h
+# (4) - due to command line change
+# (5) - due to missing .cmd file
+# (6) - due to target not in $(targets)
+# (1) PHONY targets are always build
+# (2) No target, so we better build it
+# (3) Prerequisite is newer than target
+# (4) The command line stored in the file named dir/.target.cmd
+# differed from actual command line. This happens when compiler
+# options changes
+# (5) No dir/.target.cmd file (used to store command line)
+# (6) No dir/.target.cmd file and target not listed in $(targets)
+# This is a good hint that there is a bug in the kbuild file
+ifeq ($(KBUILD_VERBOSE),2)
+why = \
+ $(if $(filter $@, $(PHONY)),- due to target is PHONY, \
+ $(if $(wildcard $@), \
+ $(if $(strip $(any-prereq)),- due to: $(any-prereq), \
+ $(if $(arg-check), \
+ $(if $(cmd_$@),- due to command line change, \
+ $(if $(filter $@, $(targets)), \
+ - due to missing .cmd file, \
+ - due to $(notdir $@) not in $$(targets) \
+ ) \
+ ) \
+ ) \
+ ), \
+ - due to target missing \
+ ) \
+ )
+
+echo-why = $(call escsq, $(strip $(why)))
+endif
+#
+###
+# Escape single quote for use in echo statements
+escsq = $(subst $(squote),'\$(squote)',$1)
+#
+# echo command.
+# Short version is used, if $(quiet) equals `quiet_', otherwise full one.
+echo-cmd = $(if $($(quiet)cmd_$(1)),echo '$(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';)
+#
+# printing commands
+cmd = @$(echo-cmd) $(cmd_$(1))
+
diff --git a/utils/makefile.python b/utils/makefile.python
new file mode 100644
index 000000000..4aa9d6b49
--- /dev/null
+++ b/utils/makefile.python
@@ -0,0 +1,290 @@
+# -*- coding: utf-8; mode: makefile-gmake -*-
+
+# list of python packages (folders) or modules (files) of this build
+PYOBJECTS ?=
+
+SITE_PYTHON ?=$(dir $(abspath $(lastword $(MAKEFILE_LIST))))site-python
+export PYTHONPATH := $(SITE_PYTHON):$$PYTHONPATH
+
+# folder where the python distribution takes place
+PYDIST ?= ./py_dist
+# folder where the python intermediate build files take place
+PYBUILD ?= ./py_build
+# python version to use
+PY ?=3
+PYTHON ?= python$(PY)
+PIP ?= pip$(PY)
+PIP_INST ?= --user
+
+# https://www.python.org/dev/peps/pep-0508/#extras
+#PY_SETUP_EXTRAS ?= \[develop,test\]
+PY_SETUP_EXTRAS ?=
+
+PYDEBUG ?= --pdb
+PYLINT_RC ?= .pylintrc
+
+TEST_FOLDER ?= ./tests
+TEST ?= .
+
+VTENV_OPTS = "--no-site-packages"
+PY_ENV = ./local/py$(PY)
+PY_ENV_BIN = $(PY_ENV)/bin
+PY_ENV_ACT = . $(PY_ENV_BIN)/activate
+
+ifeq ($(OS),Windows_NT)
+ PYTHON = python
+ PY_ENV_BIN = $(PY_ENV)/Scripts
+ PY_ENV_ACT = $(PY_ENV_BIN)/activate
+endif
+
+ifeq ($(PYTHON),python)
+ VIRTUALENV = virtualenv
+else
+ VIRTUALENV = virtualenv --python=$(PYTHON)
+endif
+
+ifeq ($(KBUILD_VERBOSE),1)
+ PIP_VERBOSE =
+ VIRTUALENV_VERBOSE =
+else
+ PIP_VERBOSE = "-q"
+ VIRTUALENV_VERBOSE = "-q"
+endif
+
+python-help::
+ @echo 'makefile.python:'
+ @echo ' pyenv | pyenv[un]install'
+ @echo ' build $(PY_ENV) & [un]install python objects'
+ @echo ' targts using pyenv $(PY_ENV):'
+ @echo ' pylint - run pylint *linting*'
+ @echo ' pytest - run *tox* test on python objects'
+ @echo ' pydebug - run tests within a PDB debug session'
+ @echo ' pybuild - build python packages'
+ @echo ' pyclean - clean intermediate python objects'
+ @echo ' targets using system users environment:'
+ @echo ' py[un]install - [un]install python objects in editable mode'
+ @echo ' upload-pypi - upload $(PYDIST)/* files to PyPi'
+ @echo 'options:'
+ @echo ' make PY=2 [targets] => to eval targets with python 2 ($(PY))'
+ @echo ' make PIP_INST= => to set/unset pip install options ($(PIP_INST))'
+ @echo ' make TEST=. => choose test from $(TEST_FOLDER) (default "." runs all)'
+ @echo ' make DEBUG= => target "debug": do not invoke PDB on errors'
+ @echo ' make PY_SETUP_EXTRAS => also install extras_require from setup.py \[develop,test\]'
+ @echo ' when using target "pydebug", set breakpoints within py-source by adding::'
+ @echo ' DEBUG()'
+
+# ------------------------------------------------------------------------------
+# OS requirements
+# ------------------------------------------------------------------------------
+
+PHONY += msg-python-exe python-exe
+msg-python-exe:
+ @echo "\n $(PYTHON) is required\n\n\
+ Make sure you have $(PYTHON) installed, grab it from\n\
+ https://www.python.org or install it from your package\n\
+ manager. On debian based OS these requirements are\n\
+ installed by::\n\n\
+ sudo -H apt-get install $(PYTHON)\n" | $(FMT)
+
+ifeq ($(shell which $(PYTHON) >/dev/null 2>&1; echo $$?), 1)
+python-exe: msg-python-exe
+ $(error The '$(PYTHON)' command was not found)
+else
+python-exe:
+ @:
+endif
+
+msg-pip-exe:
+ @echo "\n $(PIP) is required\n\n\
+ Make sure you have updated pip installed, grab it from\n\
+ https://pip.pypa.io or install it from your package\n\
+ manager. On debian based OS these requirements are\n\
+ installed by::\n\n\
+ sudo -H apt-get install python$(PY)-pip\n" | $(FMT)
+
+ifeq ($(shell which $(PIP) >/dev/null 2>&1; echo $$?), 1)
+pip-exe: msg-pip-exe
+ $(error The '$(PIP)' command was not found)
+else
+pip-exe:
+ @:
+endif
+
+PHONY += msg-virtualenv-exe virtualenv-exe
+msg-virtualenv-exe:
+ @echo "\n virtualenv is required\n\n\
+ Make sure you have an updated virtualenv installed, grab it from\n\
+ https://virtualenv.pypa.io/en/stable/installation/ or install it\n\
+ via pip by::\n\n\
+ pip install --user https://github.com/pypa/virtualenv/tarball/master\n" | $(FMT)
+
+ifeq ($(shell which virtualenv >/dev/null 2>&1; echo $$?), 1)
+virtualenv-exe: msg-virtualenv-exe
+ $(error The 'virtualenv' command was not found)
+else
+virtualenv-exe:
+ @:
+endif
+
+# ------------------------------------------------------------------------------
+# commands
+# ------------------------------------------------------------------------------
+
+# $2 path to folder with setup.py, this uses pip from the OS
+quiet_cmd_pyinstall = INSTALL $2
+ cmd_pyinstall = $(PIP) $(PIP_VERBOSE) install $(PIP_INST) -e $2$(PY_SETUP_EXTRAS)
+
+# $2 path to folder with setup.py, this uses pip from pyenv (not OS!)
+quiet_cmd_pyenvinstall = PYENV install $2
+ cmd_pyenvinstall = $(PY_ENV_BIN)/pip $(PIP_VERBOSE) install -e $2$(PY_SETUP_EXTRAS)
+
+# Uninstall the package. Since pip does not uninstall the no longer needed
+# depencies (something like autoremove) the depencies remain.
+
+# $2 package name to uninstall, this uses pip from the OS.
+quiet_cmd_pyuninstall = UNINSTALL $2
+ cmd_pyuninstall = $(PIP) $(PIP_VERBOSE) uninstall --yes $2
+
+# $2 path to folder with setup.py, this uses pip from pyenv (not OS!)
+quiet_cmd_pyenvuninstall = PYENV uninstall $2
+ cmd_pyenvuninstall = $(PY_ENV_BIN)/pip $(PIP_VERBOSE) uninstall --yes $2
+
+# $2 path to folder where virtualenv take place
+quiet_cmd_virtualenv = PYENV usage: $ source ./$@/bin/activate
+ cmd_virtualenv = \
+ if [ ! -d "./$(PY_ENV)" ];then \
+ $(VIRTUALENV) $(VIRTUALENV_VERBOSE) $(VTENV_OPTS) $2; \
+ else \
+ echo "PYENV using virtualenv from $2"; \
+ fi
+
+# $2 path to lint
+quiet_cmd_pylint = LINT $@
+ cmd_pylint = $(PY_ENV_BIN)/pylint --rcfile $(PYLINT_RC) $2
+
+quiet_cmd_pytest = TEST $@
+ cmd_pytest = $(PY_ENV_BIN)/tox -vv
+
+# setuptools, pip, easy_install its a mess full of cracks, a documentation hell
+# and broken by design ... all sucks, I really, really hate all this ... aaargh!
+#
+# About python packaging see `Python Packaging Authority`_. Most of the names
+# here are mapped to ``setup(<name1>=..., <name2>=...)`` arguments in
+# ``setup.py``. See `Packaging and distributing projects`_ about ``setup(...)``
+# arguments. If this is all new for you, start with `PyPI Quick and Dirty`_.
+#
+# Further read:
+#
+# - pythonwheels_
+# - setuptools_
+# - packaging_
+# - sdist_
+# - installing_
+#
+# .. _`Python Packaging Authority`: https://www.pypa.io
+# .. _`Packaging and distributing projects`: https://packaging.python.org/guides/distributing-packages-using-setuptools/
+# .. _`PyPI Quick and Dirty`: https://hynek.me/articles/sharing-your-labor-of-love-pypi-quick-and-dirty/
+# .. _pythonwheels: https://pythonwheels.com/
+# .. _setuptools: https://setuptools.readthedocs.io/en/latest/setuptools.html
+# .. _packaging: https://packaging.python.org/guides/distributing-packages-using-setuptools/#packaging-and-distributing-projects
+# .. _sdist: https://packaging.python.org/guides/distributing-packages-using-setuptools/#source-distributions
+# .. _bdist_wheel: https://packaging.python.org/guides/distributing-packages-using-setuptools/#pure-python-wheels
+# .. _installing: https://packaging.python.org/tutorials/installing-packages/
+#
+quiet_cmd_pybuild = BUILD $@
+ cmd_pybuild = $(PY_ENV_BIN)/$(PYTHON) setup.py \
+ sdist -d $(PYDIST) \
+ bdist_wheel --bdist-dir $(PYBUILD) -d $(PYDIST)
+
+quiet_cmd_pyclean = CLEAN $@
+# remove 'build' folder since bdist_wheel does not care the --bdist-dir
+ cmd_pyclean = \
+ rm -rf $(PYDIST) $(PYBUILD) ./local ./.tox *.egg-info ;\
+ find . -name '*.pyc' -exec rm -f {} + ;\
+ find . -name '*.pyo' -exec rm -f {} + ;\
+ find . -name __pycache__ -exec rm -rf {} +
+
+# ------------------------------------------------------------------------------
+# targets
+# ------------------------------------------------------------------------------
+
+# for installation use the pip from the OS!
+PHONY += pyinstall
+pyinstall: pip-exe
+ $(call cmd,pyinstall,.)
+
+PHONY += pyuninstall
+pyuninstall: pip-exe
+ $(call cmd,pyuninstall,$(PYOBJECTS))
+
+# for installation use the pip from PY_ENV (not the OS)!
+PHONY += pyenvinstall
+pyenvinstall: $(PY_ENV)
+ $(call cmd,pyenvinstall,.)
+
+PHONY += pyenvuninstall
+pyenvuninstall: $(PY_ENV)
+ $(call cmd,pyenvuninstall,$(PYOBJECTS))
+
+PHONY += pyclean
+pyclean:
+ $(call cmd,pyclean)
+
+# to build *local* environment, python and virtualenv from the OS is needed!
+pyenv: $(PY_ENV)
+$(PY_ENV): virtualenv-exe python-exe
+ $(call cmd,virtualenv,$(PY_ENV))
+ @$(PY_ENV_BIN)/pip install $(PIP_VERBOSE) -r requirements.txt
+
+PHONY += pylint-exe
+pylint-exe: $(PY_ENV)
+ @$(PY_ENV_BIN)/pip $(PIP_VERBOSE) install pylint
+
+PHONY += pylint
+pylint: pylint-exe
+ $(call cmd,pylint,$(PYOBJECTS))
+
+PHONY += pybuild
+pybuild: $(PY_ENV)
+ $(call cmd,pybuild)
+
+PHONY += pytest
+pytest: $(PY_ENV)
+ $(call cmd,pytest)
+
+PHONY += pydebug
+# set breakpoint with:
+# DEBUG()
+# e.g. to run tests in debug mode in emacs use:
+# 'M-x pdb' ... 'make pydebug'
+pydebug: $(PY_ENV)
+ DEBUG=$(DEBUG) $(PY_ENV_BIN)/pytest $(DEBUG) -v $(TEST_FOLDER)/$(TEST)
+
+# install / uninstall python objects into virtualenv (PYENV)
+pyenv-install: $(PY_ENV)
+ @$(PY_ENV_BIN)/pip $(PIP_VERBOSE) install -e .
+ @echo "ACTIVATE $(call normpath,$(PY_ENV_ACT)) "
+
+pyenv-uninstall: $(PY_ENV)
+ @$(PY_ENV_BIN)/pip $(PIP_VERBOSE) uninstall --yes .
+
+# runs python interpreter from ./local/py<N>/bin/python
+pyenv-python: pyenv-install
+ cd ./local; ../$(PY_ENV_BIN)/python -i
+
+# With 'dependency_links=' setuptools supports dependencies on packages hosted
+# on other reposetories then PyPi, see "Packages Not On PyPI" [1]. The big
+# drawback is, due to security reasons (I don't know where the security gate on
+# PyPi is), this feature is not supported by pip [2]. Thats why an upload to
+# PyPi is required and since uploads via setuptools is not recommended, we have
+# to imstall / use twine ... its really a mess.
+#
+# [1] http://python-packaging.readthedocs.io/en/latest/dependencies.html#packages-not-on-pypi
+# [2] https://github.com/pypa/pip/pull/1519
+
+# https://github.com/pypa/twine
+PHONY += upload-pypi
+upload-pypi: pyclean pybuild
+ @$(PY_ENV_BIN)/twine upload $(PYDIST)/*
+
+.PHONY: $(PHONY)
diff --git a/utils/makefile.sphinx b/utils/makefile.sphinx
new file mode 100644
index 000000000..2c1922fc9
--- /dev/null
+++ b/utils/makefile.sphinx
@@ -0,0 +1,216 @@
+# -*- coding: utf-8; mode: makefile-gmake -*-
+
+# You can set these variables from the command line.
+SPHINXOPTS ?=
+SPHINXBUILD ?= $(PY_ENV_BIN)/sphinx-build
+SPHINX_CONF ?= conf.py
+
+DOCS_FOLDER ?= docs
+DOCS_BUILD ?= build/docs
+DOCS_DIST ?= dist/docs
+GH_PAGES ?= gh-pages
+
+BOOKS_FOLDER ?= docs
+BOOKS_DIST ?= dist/books
+
+ifeq ($(KBUILD_VERBOSE),1)
+ SPHINX_VERBOSE = "-v"
+else
+ SPHINX_VERBOSE =
+endif
+
+## SPHINXVERS variable
+## ===================
+##
+## .. _requirement-specifiers: https://pip.pypa.io/en/stable/reference/pip_install/#requirement-specifiers
+##
+## Sphinx version to use, when building documentation. Set this when calling
+## build target. The default value is empty (install latest), to select a
+## specific version use a requirement-specifiers_. E.g. to build your target
+## 'doc' with a select sphinx-doc_ version 1.7.9::
+##
+## make SPHINXVERS='==1.7.9' docs
+##
+## To build with latest 1.7::
+##
+## make SPHINXVERS='>=1.7,<1.8' docs
+##
+SPHINXVERS ?=
+
+docs-help:
+ @echo 'makefile.sphinx:'
+ @echo ' docs-clean - clean intermediate doc objects'
+ @echo ' $(GH_PAGES) - create & upload github pages'
+ @echo ' sphinx-pdf - run sphinx latex & pdf targets'
+ echo ''
+ @echo ' books/{name}.html : build only the HTML of document {name}'
+ @echo ' valid values for books/{name}.html are:'
+ @echo ' $(BOOKS_HTML)' | $(FMT)
+ @echo ' books/{name}.pdf : build only the PDF of document {name}'
+ @echo ' valid values for books/{name}.pdf are:'
+ @echo ' $(BOOKS_PDF) ' | $(FMT)
+
+# ------------------------------------------------------------------------------
+# requirements
+# ------------------------------------------------------------------------------
+
+sphinx-doc: $(PY_ENV)
+ @echo "PYENV installing Sphinx$(SPHINXVERS)"
+ $(Q)$(PY_ENV_BIN)/pip install $(PIP_VERBOSE) 'Sphinx$(SPHINXVERS)'
+
+sphinx-live: $(PY_ENV)
+ @echo "PYENV installing Sphinx$(SPHINXVERS)"
+ $(Q)$(PY_ENV_BIN)/pip install $(PIP_VERBOSE) 'Sphinx$(SPHINXVERS)' sphinx-autobuild
+
+
+PHONY += msg-texlive texlive
+
+ifeq ($(shell which xelatex >/dev/null 2>&1; echo $$?), 1)
+texlive: msg-TeXLive
+ $(error The 'xelatex' command was not found)
+else
+texlive:
+ @:
+endif
+
+msg-texlive:
+ $(Q)echo "\n\
+The TeX/PDF output and the *math* extension require TexLive and latexmk:\n\n\
+ Make sure you have a updated TeXLive with XeTeX engine installed, grab it\n\
+ it from https://www.tug.org/texlive or install it from your package manager.\n\n\
+ Install latexmk from your package manager or visit https://ctan.org/pkg/latexmk\n\n\
+ Sphinx-doc produce (Xe)LaTeX files which might use additional TeX-packages\n\
+ and fonts. To process these LaTeX files, a TexLive installation with the\n\
+ additional packages is required. On debian based OS these requirements\n\
+ are installed by::\n\n\
+ sudo -H apt-get install\n\
+ latexmk\n\
+ texlive-base texlive-xetex texlive-latex-recommended\n\
+ texlive-extra-utils dvipng ttf-dejavu\n"
+
+# ------------------------------------------------------------------------------
+# commands
+# ------------------------------------------------------------------------------
+
+# $2 sphinx builder e.g. "html"
+# $3 path where configuration file (conf.py) is located
+# $4 sourcedir
+# $5 dest subfolder e.g. "man" for man pages at $(DOCS_DIST)/man
+
+quiet_cmd_sphinx = SPHINX $@ --> file://$(abspath $(DOCS_DIST)/$5)
+ cmd_sphinx = SPHINX_CONF=$(abspath $4/$(SPHINX_CONF))\
+ $(SPHINXBUILD) $(SPHINX_VERBOSE) $(SPHINXOPTS)\
+ -b $2 -c $3 -d $(DOCS_BUILD)/.doctrees $4 $(DOCS_DIST)/$5
+
+quiet_cmd_sphinx_autobuild = SPHINX $@ --> file://$(abspath $(DOCS_DIST)/$5)
+ cmd_sphinx_autobuild = PATH="$(PY_ENV_BIN):$(PATH)" $(PY_ENV_BIN)/sphinx-autobuild $(SPHINX_VERBOSE) --poll -B --host 0.0.0.0 --port 8080 $(SPHINXOPTS)\
+ -b $2 -c $3 -d $(DOCS_BUILD)/.doctrees $4 $(DOCS_DIST)/$5
+
+quiet_cmd_sphinx_clean = CLEAN $@
+ cmd_sphinx_clean = rm -rf $(DOCS_BUILD) $(DOCS_DIST) $(GH_PAGES)/* $(GH_PAGES)/.buildinfo
+
+# ------------------------------------------------------------------------------
+# targets
+# ------------------------------------------------------------------------------
+
+# build PDF of whole documentation in: $(DOCS_DIST)/pdf
+
+PHONY += sphinx-pdf
+sphinx-pdf: sphinx-latex
+ $(Q)cd $(DOCS_BUILD)/latex/; make all-pdf
+ $(Q)mkdir -p $(DOCS_DIST)/pdf
+ $(Q)cp $(DOCS_BUILD)/latex/*.pdf $(DOCS_DIST)/pdf
+ @echo "SPHINX *.pdf --> file://$(abspath $(DOCS_DIST)/pdf)"
+
+PHONY += sphinx-latex
+sphinx-latex: texlive sphinx-doc
+ $(SPHINXBUILD) $(SPHINX_VERBOSE) $(SPHINXOPTS)\
+ -b latex \
+ -c $(DOCS_FOLDER) \
+ -d $(DOCS_BUILD)/.doctrees \
+ $(DOCS_FOLDER) \
+ $(DOCS_BUILD)/latex
+
+# Sphinx projects, we call them *books* (what is more common). Books are
+# folders under $(BOOKS_FOLDER) containing a conf.py file. The HTML output goes
+# to folder $(BOOKS_DIST)/<name> while PDF is placed (BOOKS_DIST)/<name>/pdf
+
+BOOKS=$(patsubst $(BOOKS_FOLDER)/%/conf.py,books/%,$(wildcard $(BOOKS_FOLDER)/*/conf.py))
+
+# fine grained targets
+BOOKS_HTML = $(patsubst %,%.html,$(BOOKS))
+BOOKS_CLEAN = $(patsubst %,%.clean,$(BOOKS))
+BOOKS_LATEX = $(patsubst %,%.latex,$(BOOKS))
+BOOKS_PDF = $(patsubst %,%.pdf,$(BOOKS))
+BOOKS_LIVE = $(patsubst %,%.live,$(BOOKS))
+
+$(BOOKS_DIST):
+ mkdir -p $(BOOKS_DIST)
+
+PHONY += $(BOOKS_HTML)
+$(BOOKS_HTML): sphinx-doc | $(BOOKS_DIST)
+ SPHINX_CONF=$(patsubst books/%.html,%,$@)/conf.py \
+ $(SPHINXBUILD) $(SPHINX_VERBOSE) $(SPHINXOPTS)\
+ -b html \
+ -c $(DOCS_FOLDER) \
+ -d $(DOCS_BUILD)/books/$(patsubst books/%.html,%,$@)/.doctrees \
+ $(patsubst books/%.html,%,$@) \
+ $(BOOKS_DIST)/$(patsubst books/%.html,%,$@)
+ @echo "SPHINX $@ --> file://$(abspath $(BOOKS_DIST)/$(patsubst books/%.html,%,$@))"
+
+PHONY += $(BOOKS_HTML)
+$(BOOKS_LIVE): sphinx-live | $(BOOKS_DIST)
+ PATH="$(PY_ENV_BIN):$(PATH)" \
+ SPHINX_CONF=$(patsubst books/%.live,%,$@)/conf.py \
+ $(PY_ENV_BIN)/sphinx-autobuild --poll -B --host 0.0.0.0 --port 8080 $(SPHINX_VERBOSE) $(SPHINXOPTS)\
+ -b html \
+ -c $(DOCS_FOLDER) \
+ -d $(DOCS_BUILD)/books/$(patsubst books/%.live,%,$@)/.doctrees \
+ $(patsubst books/%.live,%,$@) \
+ $(BOOKS_DIST)/$(patsubst books/%.live,%,$@)
+
+$(BOOKS_PDF): %.pdf : %.latex
+ $(Q)cd $(DOCS_BUILD)/latex/$(patsubst books/%.pdf,%,$@); make all-pdf
+ $(Q)mkdir -p $(BOOKS_DIST)/$(patsubst books/%.pdf,%,$@)/pdf
+ $(Q)cp -v $(DOCS_BUILD)/latex/$(patsubst books/%.pdf,%,$@)/*.pdf $(BOOKS_DIST)/$(patsubst books/%.pdf,%,$@)/pdf
+ @echo "SPHINX $@ --> file://$(abspath $(BOOKS_DIST)/$(patsubst books/%.pdf,%,$@))/pdf"
+
+PHONY += $(BOOKS_LATEX)
+$(BOOKS_LATEX): sphinx-doc | $(BOOKS_DIST)
+ SPHINX_CONF=$(patsubst books/%.latex,%,$@)/conf.py \
+ $(SPHINXBUILD) $(SPHINX_VERBOSE) $(SPHINXOPTS)\
+ -b latex \
+ -c $(DOCS_FOLDER) \
+ -d $(DOCS_BUILD)/books/$(patsubst books/%.latex,%,$@)/.doctrees \
+ $(patsubst books/%.latex,%,$@) \
+ $(DOCS_BUILD)/latex/$(patsubst books/%.latex,%,$@)
+ @echo "SPHINX $@ --> file://$(abspath $(DOCS_BUILD)/latex/$(patsubst books/%.latex,%,$@))"
+
+$(BOOKS_CLEAN):
+ $(Q)rm -rf $(BOOKS_DIST)/$(patsubst books/%.clean,%,$@) \
+ $(DOCS_BUILD)/books/$(patsubst books/%.clean,%,$@) \
+ $(DOCS_BUILD)/latex/$(patsubst books/%.clean,%,$@)
+
+# github pages
+
+PHONY += $(GH_PAGES)
+$(GH_PAGES)::
+ $(MAKE) docs
+ [ -d "gh-pages/.git" ] || git clone $(GIT_URL) gh-pages
+ -cd $(GH_PAGES); git checkout gh-pages >/dev/null
+ -cd $(GH_PAGES); git pull
+ -cd $(GH_PAGES); ls -A | grep -v '.git$$' | xargs rm -rf
+ cp -r $(DOCS_DIST)/* $(GH_PAGES)/
+ touch $(GH_PAGES)/.nojekyll
+ echo "<html><head><META http-equiv='refresh' content='0;URL=index.html'></head></html>" > $(GH_PAGES)/404.html
+ cd $(GH_PAGES);\
+ git add --all . ;\
+ git commit -m "gh-pages: updated" ;\
+ git push origin gh-pages
+
+
+PHONY += docs-clean
+docs-clean: $(BOOKS_CLEAN)
+ $(call cmd,sphinx_clean)
+
+.PHONY: $(PHONY)
diff --git a/utils/standalone_searx.py b/utils/standalone_searx.py
index 223163639..7bc1d32ed 100755
--- a/utils/standalone_searx.py
+++ b/utils/standalone_searx.py
@@ -64,7 +64,7 @@ form = {
preferences = searx.preferences.Preferences(['oscar'], searx.engines.categories.keys(), searx.engines.engines, [])
preferences.key_value_settings['safesearch'].parse(args.safesearch)
-search_query = searx.search.get_search_query_from_webapp(preferences, form)
+search_query, raw_text_query = searx.search.get_search_query_from_webapp(preferences, form)
search = searx.search.Search(search_query)
result_container = search.search()