on 217cb8a help sign in
771 files changed+28038−235623
since splitsnapshots
unifiedsplit
.codecov.yml−31 .config.sh−59 .coveragerc−11 .dir-locals.el−133 .dockerignore−56 .gitattributes−10 .github/ISSUE_TEMPLATE/bug-report.md−39 .github/ISSUE_TEMPLATE/config.yml−14 .github/ISSUE_TEMPLATE/engine-request.md−31 .github/ISSUE_TEMPLATE/feature-request.md−21 .github/dependabot.yml−10 .github/workflows/data-update.yml−66 .github/workflows/integration.yml−151 .gitignore−30 .landscape.yaml−3 searx/metrology/__init__.py → .nojekyll .pylintrc−444 404.html+1 AUTHORS.rst−168 CHANGELOG.rst−706 CONTRIBUTING.md−49 Dockerfile−94 LICENSE−661 Makefile−107 PULL_REQUEST_TEMPLATE.md−25 README.rst−73 docs/dev/reST.rst → _downloads/ad0ebe55d6b53b1559e0ca8dee6f30b9/reST.rst+26−35 _images/DOT-57a4a7f78690d0b6b884bc59f36e84cfb0b61f76.dot+3 _images/DOT-57a4a7f78690d0b6b884bc59f36e84cfb0b61f76.svg+31 _images/SVG-1fb7029fa2cc454a267bae271cccb2c591387416.svg+13 docs/admin/arch_public.dot → _images/arch_public.dot+4−4 _images/arch_public.svg+156 docs/dev/hello.dot → _images/hello.dot _images/hello.svg+30 _images/math/07c9ff4251510b06013159f4e45ec9ab97044096.svg+25 _images/math/3b8127a8eed95247f9249ea6c85e8e86df1baa82.svg+25 _images/math/6673b43f9fe29455c1fcd1164e5844698cc64d38.svg+22 _images/math/a6a994cb6e7278ec30eaebe7e636046d3deccb5b.svg+43 docs/blog/searx-admin-engines.png → _images/searx-admin-engines.png docs/blog/searxpy3.png → _images/searxpy3.png docs/dev/svg_image.svg → _images/svg_image.svg docs/admin/api.rst → _sources/admin/api.rst.txt docs/admin/architecture.rst → _sources/admin/architecture.rst.txt docs/admin/buildhosts.rst → _sources/admin/buildhosts.rst.txt+8−8 docs/admin/engines.rst → _sources/admin/engines.rst.txt+12−29 _sources/admin/filtron.rst.txt+200 docs/admin/index.rst → _sources/admin/index.rst.txt docs/admin/installation-apache.rst → _sources/admin/installation-apache.rst.txt+7−8 _sources/admin/installation-docker.rst.txt+28 docs/admin/installation-nginx.rst → _sources/admin/installation-nginx.rst.txt+13−15 docs/admin/installation-searx.rst → _sources/admin/installation-searx.rst.txt+13−41 docs/admin/installation-uwsgi.rst → _sources/admin/installation-uwsgi.rst.txt+11−12 docs/admin/installation.rst → _sources/admin/installation.rst.txt+1−25 docs/admin/morty.rst → _sources/admin/morty.rst.txt+4−11 docs/admin/plugins.rst → _sources/admin/plugins.rst.txt+1−1 _sources/admin/settings.rst.txt+187 _sources/admin/update-searx.rst.txt+23 docs/blog/admin.rst → _sources/blog/admin.rst.txt _sources/blog/index.rst.txt+12 docs/blog/intro-offline.rst → _sources/blog/intro-offline.rst.txt docs/blog/private-engines.rst → _sources/blog/private-engines.rst.txt+1−3 docs/blog/python3.rst → _sources/blog/python3.rst.txt+1−1 docs/dev/contribution_guide.rst → _sources/dev/contribution_guide.rst.txt+25−29 docs/dev/engine_overview.rst → _sources/dev/engine_overview.rst.txt+31−70 docs/dev/index.rst → _sources/dev/index.rst.txt _sources/dev/makefile.rst.txt+221 docs/dev/plugins.rst → _sources/dev/plugins.rst.txt−15 _sources/dev/quickstart.rst.txt+132 _sources/dev/reST.rst.txt+1427 docs/dev/search_api.rst → _sources/dev/search_api.rst.txt+4−4 docs/dev/translation.rst → _sources/dev/translation.rst.txt docs/index.rst → _sources/index.rst.txt−1 docs/user/index.rst → _sources/user/index.rst.txt docs/user/own-instance.rst → _sources/user/own-instance.rst.txt+5−5 docs/user/search_syntax.rst → _sources/user/search_syntax.rst.txt−24 docs/utils/filtron.sh.rst → _sources/utils/filtron.sh.rst.txt+4−4 docs/utils/index.rst → _sources/utils/index.rst.txt+8−7 docs/utils/lxc.sh.rst → _sources/utils/lxc.sh.rst.txt+8−9 docs/utils/morty.sh.rst → _sources/utils/morty.sh.rst.txt+4−4 docs/utils/searx.sh.rst → _sources/utils/searx.sh.rst.txt _static/basic.css+768 _static/doctools.js+315 _static/documentation_options.js+12 _static/file.png docs/static/img/searx_logo_small.png → _static/img/searx_logo_small.png _static/jquery-3.4.1.js+10598 _static/jquery.js+2 _static/language_data.js+297 _static/minus.png _static/plus.png _static/pocoo.css+483 _static/pygments.css+73 _static/searchtools.js+515 docs/_themes/searx/static/searx.css → _static/searx.css _static/searx_logo_small.png _static/sphinx_tabs/semantic-ui-2.4.1/menu.min.css+1 _static/sphinx_tabs/semantic-ui-2.4.1/segment.min.css+9 _static/sphinx_tabs/semantic-ui-2.4.1/tab.min.css+9 _static/sphinx_tabs/semantic-ui-2.4.1/tab.min.js+1 _static/sphinx_tabs/tabs.css+44 _static/sphinx_tabs/tabs.js+94 _static/underscore-1.3.1.js+999 _static/underscore.js+31 _static/version_warning_offset.js+40 admin/api.html+192 admin/architecture.html+124 admin/buildhosts.html+364 admin/engines.html+198 admin/filtron.html+285 admin/index.html+167 admin/installation-apache.html+648 admin/installation-docker.html+119 admin/installation-nginx.html+505 admin/installation-searx.html+358 admin/installation-uwsgi.html+525 admin/installation.html+148 admin/morty.html+128 admin/plugins.html+186 admin/settings.html+265 admin/update-searx.html+134 babel.cfg−3 blog/admin.html+139 blog/index.html+131 blog/intro-offline.html+166 blog/private-engines.html+149 blog/python3.html+152 dev/contribution_guide.html+263 dev/engine_overview.html+638 dev/index.html+172 dev/makefile.html+310 dev/plugins.html+151 dev/quickstart.html+210 dev/reST.html+1597 dev/search_api.html+200 dev/translation.html+154 dockerfiles/docker-entrypoint.sh−145 dockerfiles/uwsgi.ini−47 docs/_themes/searx/theme.conf−6 docs/admin/engines/recoll.rst−50 docs/admin/filtron.rst−191 docs/admin/installation-docker.rst−60 docs/admin/settings.rst−394 docs/admin/update-searx.rst−59 docs/blog/command-line-engines.rst−65 docs/blog/index.rst−17 docs/blog/lxcdev-202006.rst−413 docs/blog/search-database-engines.rst−95 docs/blog/search-indexer-engines.rst−114 docs/blog/sql-engines.rst−117 docs/build-templates/filtron.rst−52 docs/build-templates/morty.rst−52 docs/build-templates/searx.rst−210 docs/conf.py−131 docs/dev/csv_table.txt−6 docs/dev/makefile.rst−222 docs/dev/quickstart.rst−55 docs/searx_extra/index.rst−14 docs/searx_extra/standalone_searx.py.rst−9 examples/basic_engine.py−25 genindex.html+129 index.html+175 manage−504 objects.inv requirements-dev.txt−20 requirements.txt−16 search.html+109 searchindex.js+1 searx/__init__.py−108 searx/answerers/__init__.py−46 searx/answerers/random/answerer.py−67 searx/answerers/statistics/answerer.py−52 searx/autocomplete.py−158 searx/data/__init__.py−50 searx/data/ahmia_blacklist.txt−35730 searx/data/currencies.json−14691 searx/data/engines_languages.json−28588 searx/data/external_bangs.json−19068 searx/data/external_urls.json−156 searx/data/osm_keys_tags.json−15416 searx/data/useragents.json−13 searx/data/wikidata_units.json−1223 searx/engines/1337x.py−53 searx/engines/__init__.py−308 searx/engines/ahmia.py−85 searx/engines/apkmirror.py−68 searx/engines/archlinux.py−145 searx/engines/arxiv.py−75 searx/engines/bandcamp.py−73 searx/engines/base.py−117 searx/engines/bing.py−124 searx/engines/bing_images.py−106 searx/engines/bing_news.py−131 searx/engines/bing_videos.py−101 searx/engines/btdigg.py−89 searx/engines/ccengine.py−53 searx/engines/command.py−172 searx/engines/core.py−82 searx/engines/currency_convert.py−54 searx/engines/dailymotion.py−98 searx/engines/deezer.py−70 searx/engines/deviantart.py−77 searx/engines/dictzone.py−60 searx/engines/digbt.py−60 searx/engines/digg.py−69 searx/engines/doku.py−87 searx/engines/duckduckgo.py−186 searx/engines/duckduckgo_definitions.py−261 searx/engines/duckduckgo_images.py−94 searx/engines/duden.py−77 searx/engines/dummy-offline.py−20 searx/engines/dummy.py−24 searx/engines/ebay.py−73 searx/engines/elasticsearch.py−144 searx/engines/etools.py−56 searx/engines/fdroid.py−54 searx/engines/flickr.py−92 searx/engines/flickr_noapi.py−127 searx/engines/framalibre.py−72 searx/engines/freesound.py−69 searx/engines/frinkiac.py−51 searx/engines/genius.py−90 searx/engines/gentoo.py−129 searx/engines/gigablast.py−138 searx/engines/github.py−63 searx/engines/google.py−341 searx/engines/google_images.py−209 searx/engines/google_news.py−196 searx/engines/google_scholar.py−156 searx/engines/google_videos.py−201 searx/engines/imdb.py−55 searx/engines/ina.py−85 searx/engines/invidious.py−122 searx/engines/json_engine.py−143 searx/engines/kickass.py−94 searx/engines/loc.py−68 searx/engines/mediathekviewweb.py−68 searx/engines/mediawiki.py−90 searx/engines/meilisearch.py−59 searx/engines/microsoft_academic.py−73 searx/engines/mixcloud.py−64 searx/engines/mongodb.py−61 searx/engines/mysql_server.py−62 searx/engines/nyaa.py−111 searx/engines/onesearch.py−57 searx/engines/opensemantic.py−46 searx/engines/openstreetmap.py−441 searx/engines/pdbe.py−115 searx/engines/peertube.py−96 searx/engines/photon.py−133 searx/engines/piratebay.py−101 searx/engines/postgresql.py−69 searx/engines/prowlarr.py−80 searx/engines/pubmed.py−105 searx/engines/qwant.py−245 searx/engines/recoll.py−111 searx/engines/reddit.py−79 searx/engines/redis_server.py−69 searx/engines/rumble.py−81 searx/engines/scanr_structures.py−79 searx/engines/searchcode_code.py−71 searx/engines/searx_engine.py−59 searx/engines/semantic_scholar.py−42 searx/engines/sepiasearch.py−102 searx/engines/seznam.py−66 searx/engines/sjp.py−92 searx/engines/solidtorrents.py−53 searx/engines/solr.py−74 searx/engines/soundcloud.py−109 searx/engines/spotify.py−80 searx/engines/springer.py−74 searx/engines/sqlite.py−51 searx/engines/stackexchange.py−67 searx/engines/startpage.py−269 searx/engines/tineye.py−86 searx/engines/tokyotoshokan.py−101 searx/engines/torrentz.py−99 searx/engines/translated.py−51 searx/engines/unsplash.py−55 searx/engines/vimeo.py−68 searx/engines/wikidata.py−694 searx/engines/wikipedia.py−111 searx/engines/wolframalpha_api.py−134 searx/engines/wolframalpha_noapi.py−126 searx/engines/wordnik.py−77 searx/engines/www1x.py−57 searx/engines/xpath.py−93 searx/engines/xpath_flex.py−121 searx/engines/yacy.py−114 searx/engines/yahoo.py−162 searx/engines/yahoo_news.py−111 searx/engines/yggtorrent.py−128 searx/engines/youtube_api.py−91 searx/engines/youtube_noapi.py−160 searx/exceptions.py−103 searx/external_bang.py−89 searx/external_urls.py−89 searx/languages.py−71 searx/metrology/error_recorder.py−144 searx/network/__init__.py−188 searx/network/client.py−219 searx/network/network.py−358 searx/network/raise_for_httperror.py−66 searx/plugins/__init__.py−189 searx/plugins/ahmia_filter.py−33 searx/plugins/hash_plugin.py−54 searx/plugins/hostname_replace.py−28 searx/plugins/https_rewrite.py−233 searx/plugins/https_rules/00README−17 searx/plugins/https_rules/Bing.xml−56 searx/plugins/https_rules/Dailymotion.xml−69 searx/plugins/https_rules/Deviantart.xml−53 searx/plugins/https_rules/DuckDuckGo.xml−38 searx/plugins/https_rules/Flickr.xml−44 searx/plugins/https_rules/Github-Pages.xml−11 searx/plugins/https_rules/Github.xml−94 searx/plugins/https_rules/Google-mismatches.xml−26 searx/plugins/https_rules/Google.org.xml−14 searx/plugins/https_rules/GoogleAPIs.xml−143 searx/plugins/https_rules/GoogleCanada.xml−6 searx/plugins/https_rules/GoogleImages.xml−65 searx/plugins/https_rules/GoogleMainSearch.xml−78 searx/plugins/https_rules/GoogleMaps.xml−67 searx/plugins/https_rules/GoogleMelange.xml−6 searx/plugins/https_rules/GoogleSearch.xml−135 searx/plugins/https_rules/GoogleServices.xml−345 searx/plugins/https_rules/GoogleShopping.xml−28 searx/plugins/https_rules/GoogleSorry.xml−7 searx/plugins/https_rules/GoogleTranslate.xml−8 searx/plugins/https_rules/GoogleVideos.xml−83 searx/plugins/https_rules/GoogleWatchBlog.xml−17 searx/plugins/https_rules/Google_App_Engine.xml−21 searx/plugins/https_rules/Googleplex.com.xml−16 searx/plugins/https_rules/OpenStreetMap.xml−15 searx/plugins/https_rules/Rawgithub.com.xml−14 searx/plugins/https_rules/Soundcloud.xml−101 searx/plugins/https_rules/ThePirateBay.xml−36 searx/plugins/https_rules/Torproject.xml−18 searx/plugins/https_rules/Twitter.xml−169 searx/plugins/https_rules/Vimeo.xml−75 searx/plugins/https_rules/WikiLeaks.xml−13 searx/plugins/https_rules/Wikimedia.xml−107 searx/plugins/https_rules/Yahoo.xml−2450 searx/plugins/https_rules/YouTube.xml−46 searx/plugins/infinite_scroll.py−9 searx/plugins/oa_doi_rewrite.py−48 searx/plugins/search_on_category_select.py−24 searx/plugins/self_info.py−44 searx/plugins/tracker_url_remover.py−53 searx/plugins/vim_hotkeys.py−11 searx/preferences.py−534 searx/query.py−330 searx/results.py−398 searx/search/__init__.py−216 searx/search/checker/__init__.py−4 searx/search/checker/__main__.py−95 searx/search/checker/background.py−125 searx/search/checker/impl.py−416 searx/search/models.py−71 searx/search/processors/__init__.py−41 searx/search/processors/abstract.py−52 searx/search/processors/offline.py−51 searx/search/processors/online.py−262 searx/search/processors/online_currency.py−69 searx/search/processors/online_dictionary.py−55 searx/settings.yml−1803 searx/settings_loader.py−132 searx/settings_robot.yml−54 searx/shared/__init__.py−31 searx/shared/shared_abstract.py−21 searx/shared/shared_simple.py−39 searx/shared/shared_uwsgi.py−64 searx/static/plugins/css/infinite_scroll.css−19 searx/static/plugins/css/vim_hotkeys.css−26 searx/static/plugins/external_plugins/.gitignore−3 searx/static/plugins/js/infinite_scroll.js−40 searx/static/plugins/js/search_on_category_select.js−42 searx/static/plugins/js/vim_hotkeys.js−345 searx/static/themes/__common__/js/image_layout.js−163 searx/static/themes/oscar/.gitignore−1 searx/static/themes/oscar/README.rst−56 searx/static/themes/oscar/css/bootstrap-theme.css−587 searx/static/themes/oscar/css/bootstrap-theme.min.css−6 searx/static/themes/oscar/css/bootstrap-theme.min.css.map−1 searx/static/themes/oscar/css/bootstrap.css−6990 searx/static/themes/oscar/css/bootstrap.min.css−5 searx/static/themes/oscar/css/bootstrap.min.css.map−1 searx/static/themes/oscar/css/images/layers-2x.png searx/static/themes/oscar/css/images/layers.png searx/static/themes/oscar/css/images/marker-icon-2x.png searx/static/themes/oscar/css/images/marker-icon.png searx/static/themes/oscar/css/images/marker-shadow.png searx/static/themes/oscar/css/leaflet.css−640 searx/static/themes/oscar/css/leaflet.min.css−1 searx/static/themes/oscar/css/leaflet.min.css.map−1 searx/static/themes/oscar/css/logicodev-dark.css−936 searx/static/themes/oscar/css/logicodev-dark.min.css−1 searx/static/themes/oscar/css/logicodev-dark.min.css.map−1 searx/static/themes/oscar/css/logicodev.css−1145 searx/static/themes/oscar/css/logicodev.min.css−1 searx/static/themes/oscar/css/logicodev.min.css.map−1 searx/static/themes/oscar/css/pointhi.css−693 searx/static/themes/oscar/css/pointhi.min.css−1 searx/static/themes/oscar/css/pointhi.min.css.map−1 searx/static/themes/oscar/fonts/glyphicons-halflings-regular.eot searx/static/themes/oscar/fonts/glyphicons-halflings-regular.svg−288 searx/static/themes/oscar/fonts/glyphicons-halflings-regular.ttf searx/static/themes/oscar/fonts/glyphicons-halflings-regular.woff searx/static/themes/oscar/fonts/glyphicons-halflings-regular.woff2 searx/static/themes/oscar/gruntfile.js−152 searx/static/themes/oscar/img/favicon.png searx/static/themes/oscar/img/icons/1337x.png searx/static/themes/oscar/img/icons/README.md−2 searx/static/themes/oscar/img/icons/amazon.png searx/static/themes/oscar/img/icons/bandcamp.png searx/static/themes/oscar/img/icons/dailymotion.png searx/static/themes/oscar/img/icons/deviantart.png searx/static/themes/oscar/img/icons/facebook.png searx/static/themes/oscar/img/icons/flickr.png searx/static/themes/oscar/img/icons/github.png searx/static/themes/oscar/img/icons/invidious.png searx/static/themes/oscar/img/icons/kickass.png searx/static/themes/oscar/img/icons/openstreetmap.png searx/static/themes/oscar/img/icons/photon.png searx/static/themes/oscar/img/icons/searchcode code.png searx/static/themes/oscar/img/icons/searchcode doc.png searx/static/themes/oscar/img/icons/soundcloud.png searx/static/themes/oscar/img/icons/stackoverflow.png searx/static/themes/oscar/img/icons/twitter.png searx/static/themes/oscar/img/icons/vimeo.png searx/static/themes/oscar/img/icons/wikipedia.png searx/static/themes/oscar/img/icons/youtube.png searx/static/themes/oscar/img/loader.gif searx/static/themes/oscar/img/logo_searx_a.png searx/static/themes/oscar/img/logo_searx_a_n.png searx/static/themes/oscar/img/searx_logo.png searx/static/themes/oscar/js/bootstrap.bundle.min.js−7 searx/static/themes/oscar/js/bootstrap.min.js−6 searx/static/themes/oscar/js/jquery.min.js−2 searx/static/themes/oscar/js/leaflet.js−6 searx/static/themes/oscar/js/searx.js−474 searx/static/themes/oscar/js/searx.min.js−4 searx/static/themes/oscar/js/searx.min.js.map−1 searx/static/themes/oscar/js/typeahead.bundle.min.js−9 searx/static/themes/oscar/package.json−23 searx/static/themes/oscar/src/js/01_init.js−34 searx/static/themes/oscar/src/js/autocompleter.js−60 searx/static/themes/oscar/src/js/element_modifiers.js−117 searx/static/themes/oscar/src/js/infobox.js−11 searx/static/themes/oscar/src/js/leaflet_map.js−79 searx/static/themes/oscar/src/js/toggleall.js−10 searx/static/themes/oscar/src/less/bootstrap/bootstrap.less−3 searx/static/themes/oscar/src/less/bootstrap/typeahead.less−154 searx/static/themes/oscar/src/less/logicodev-dark/oscar.less−257 searx/static/themes/oscar/src/less/logicodev/advanced.less−49 searx/static/themes/oscar/src/less/logicodev/checkbox.less−9 searx/static/themes/oscar/src/less/logicodev/code.less−14 searx/static/themes/oscar/src/less/logicodev/cursor.less−8 searx/static/themes/oscar/src/less/logicodev/footer.less−30 searx/static/themes/oscar/src/less/logicodev/infobox.less−92 searx/static/themes/oscar/src/less/logicodev/navbar.less−30 searx/static/themes/oscar/src/less/logicodev/onoff.less−74 searx/static/themes/oscar/src/less/logicodev/oscar.less−23 searx/static/themes/oscar/src/less/logicodev/preferences.less−31 searx/static/themes/oscar/src/less/logicodev/pygments.less−99 searx/static/themes/oscar/src/less/logicodev/results.less−267 searx/static/themes/oscar/src/less/logicodev/search.less−98 searx/static/themes/oscar/src/less/logicodev/variables.less−16 searx/static/themes/oscar/src/less/pointhi/advanced.less−49 searx/static/themes/oscar/src/less/pointhi/checkbox.less−9 searx/static/themes/oscar/src/less/pointhi/code.less−2 searx/static/themes/oscar/src/less/pointhi/cursor.less−8 searx/static/themes/oscar/src/less/pointhi/footer.less−19 searx/static/themes/oscar/src/less/pointhi/infobox.less−62 searx/static/themes/oscar/src/less/pointhi/navbar.less−20 searx/static/themes/oscar/src/less/pointhi/onoff.less−57 searx/static/themes/oscar/src/less/pointhi/oscar.less−23 searx/static/themes/oscar/src/less/pointhi/preferences.less−19 searx/static/themes/oscar/src/less/pointhi/pygments.less−99 searx/static/themes/oscar/src/less/pointhi/results.less−113 searx/static/themes/oscar/src/less/pointhi/search.less−43 searx/static/themes/simple/.gitignore−1 searx/static/themes/simple/.jshintignore−1 searx/static/themes/simple/css/searx-rtl.css−2261 searx/static/themes/simple/css/searx-rtl.min.css−1 searx/static/themes/simple/css/searx.css−2257 searx/static/themes/simple/css/searx.min.css−1 searx/static/themes/simple/fonts/ion.css−139 searx/static/themes/simple/fonts/ion.eot searx/static/themes/simple/fonts/ion.html−268 searx/static/themes/simple/fonts/ion.svg−105 searx/static/themes/simple/fonts/ion.ttf searx/static/themes/simple/fonts/ion.woff searx/static/themes/simple/fonts/ion.woff2 searx/static/themes/simple/gruntfile.js−161 searx/static/themes/simple/img/favicon.png searx/static/themes/simple/img/logo_searx_a.png searx/static/themes/simple/img/searx.png searx/static/themes/simple/img/searx_logo.svg−203 searx/static/themes/simple/js/searx.head.js−40 searx/static/themes/simple/js/searx.head.min.js−4 searx/static/themes/simple/js/searx.head.min.js.map−1 searx/static/themes/simple/js/searx.js−1502 searx/static/themes/simple/js/searx.min.js−26 searx/static/themes/simple/js/searx.min.js.map−1 searx/static/themes/simple/js/searx_head/00_init.js−40 searx/static/themes/simple/js/searx_src/00_searx_toolkit.js−164 searx/static/themes/simple/js/searx_src/autocomplete.js−536 searx/static/themes/simple/js/searx_src/searx_keyboard.js−366 searx/static/themes/simple/js/searx_src/searx_mapresult.js−89 searx/static/themes/simple/js/searx_src/searx_results.js−63 searx/static/themes/simple/js/searx_src/searx_search.js−121 searx/static/themes/simple/leaflet/images/layers-2x.png searx/static/themes/simple/leaflet/images/layers.png searx/static/themes/simple/leaflet/images/marker-icon-2x-green.png searx/static/themes/simple/leaflet/images/marker-icon-2x-orange.png searx/static/themes/simple/leaflet/images/marker-icon-2x-red.png searx/static/themes/simple/leaflet/images/marker-icon-2x.png searx/static/themes/simple/leaflet/images/marker-icon-green.png searx/static/themes/simple/leaflet/images/marker-icon-orange.png searx/static/themes/simple/leaflet/images/marker-icon-red.png searx/static/themes/simple/leaflet/images/marker-icon.png searx/static/themes/simple/leaflet/images/marker-shadow.png searx/static/themes/simple/leaflet/leaflet.css−636 searx/static/themes/simple/leaflet/leaflet.js−5 searx/static/themes/simple/less/autocomplete.less−69 searx/static/themes/simple/less/code.less−8 searx/static/themes/simple/less/definitions.less−135 searx/static/themes/simple/less/index.less−43 searx/static/themes/simple/less/ion.less−181 searx/static/themes/simple/less/mixins.less−62 searx/static/themes/simple/less/normalize.less−341 searx/static/themes/simple/less/preferences.less−120 searx/static/themes/simple/less/pygments.less−99 searx/static/themes/simple/less/search.less−264 searx/static/themes/simple/less/stats.less−8 searx/static/themes/simple/less/style-rtl.less−6 searx/static/themes/simple/less/style.less−757 searx/static/themes/simple/less/toolkit.less−468 searx/static/themes/simple/less/toolkit_loader.less−41 searx/static/themes/simple/magnet.svg−1 searx/static/themes/simple/package.json−20 searx/templates/__common__/about.html−102 searx/templates/__common__/opensearch.xml−22 searx/templates/__common__/opensearch_response_rss.xml−53 searx/templates/oscar/404.html−9 searx/templates/oscar/about.html−5 searx/templates/oscar/advanced.html−17 searx/templates/oscar/base.html−112 searx/templates/oscar/categories.html−13 searx/templates/oscar/index.html−21 searx/templates/oscar/infobox.html−49 searx/templates/oscar/languages.html−10 searx/templates/oscar/macros.html−146 searx/templates/oscar/messages/first_time.html−8 searx/templates/oscar/messages/no_cookies.html−5 searx/templates/oscar/messages/no_data_available.html−5 searx/templates/oscar/messages/no_results.html−17 searx/templates/oscar/messages/save_settings_successfull.html−9 searx/templates/oscar/messages/unknow_error.html−9 searx/templates/oscar/navbar.html−9 searx/templates/oscar/preferences.html−378 searx/templates/oscar/result_templates/code.html−18 searx/templates/oscar/result_templates/default.html−31 searx/templates/oscar/result_templates/files.html−55 searx/templates/oscar/result_templates/images.html−36 searx/templates/oscar/result_templates/key-value.html−19 searx/templates/oscar/result_templates/map.html−76 searx/templates/oscar/result_templates/products.html−23 searx/templates/oscar/result_templates/torrent.html−25 searx/templates/oscar/result_templates/videos.html−29 searx/templates/oscar/results.html−187 searx/templates/oscar/search.html−25 searx/templates/oscar/search_full.html−19 searx/templates/oscar/stats.html−33 searx/templates/oscar/time-range.html−19 searx/templates/simple/404.html−9 searx/templates/simple/about.html−4 searx/templates/simple/base.html−64 searx/templates/simple/categories.html−8 searx/templates/simple/index.html−12 searx/templates/simple/infobox.html−50 searx/templates/simple/languages.html−8 searx/templates/simple/macros.html−85 searx/templates/simple/messages/no_results.html−17 searx/templates/simple/preferences.html−267 searx/templates/simple/result_templates/code.html−13 searx/templates/simple/result_templates/default.html−17 searx/templates/simple/result_templates/images.html−4 searx/templates/simple/result_templates/key-value.html−11 searx/templates/simple/result_templates/map.html−51 searx/templates/simple/result_templates/torrent.html−24 searx/templates/simple/result_templates/videos.html−15 searx/templates/simple/results.html−179 searx/templates/simple/search.html−18 searx/templates/simple/simple.spec.txt−40 searx/templates/simple/stats.html−25 searx/templates/simple/time-range.html−17 searx/testing.py−119 searx/translations/ar/LC_MESSAGES/messages.mo searx/translations/ar/LC_MESSAGES/messages.po−1084 searx/translations/bg/LC_MESSAGES/messages.mo searx/translations/bg/LC_MESSAGES/messages.po−1084 searx/translations/bo/LC_MESSAGES/messages.mo searx/translations/bo/LC_MESSAGES/messages.po−1083 searx/translations/ca/LC_MESSAGES/messages.mo searx/translations/ca/LC_MESSAGES/messages.po−1084 searx/translations/cs/LC_MESSAGES/messages.mo searx/translations/cs/LC_MESSAGES/messages.po−1086 searx/translations/cy/LC_MESSAGES/messages.mo searx/translations/cy/LC_MESSAGES/messages.po−1082 searx/translations/da/LC_MESSAGES/messages.mo searx/translations/da/LC_MESSAGES/messages.po−1083 searx/translations/de/LC_MESSAGES/messages.mo searx/translations/de/LC_MESSAGES/messages.po−1099 searx/translations/el_GR/LC_MESSAGES/messages.mo searx/translations/el_GR/LC_MESSAGES/messages.po−1083 searx/translations/en/LC_MESSAGES/messages.mo searx/translations/en/LC_MESSAGES/messages.po−695 searx/translations/eo/LC_MESSAGES/messages.mo searx/translations/eo/LC_MESSAGES/messages.po−1085 searx/translations/es/LC_MESSAGES/messages.mo searx/translations/es/LC_MESSAGES/messages.po−1093 searx/translations/et/LC_MESSAGES/messages.mo searx/translations/et/LC_MESSAGES/messages.po−1083 searx/translations/eu/LC_MESSAGES/messages.mo searx/translations/eu/LC_MESSAGES/messages.po−1085 searx/translations/fa_IR/LC_MESSAGES/messages.mo searx/translations/fa_IR/LC_MESSAGES/messages.po−1087 searx/translations/fi/LC_MESSAGES/messages.mo searx/translations/fi/LC_MESSAGES/messages.po−1082 searx/translations/fil/LC_MESSAGES/messages.mo searx/translations/fil/LC_MESSAGES/messages.po−1083 searx/translations/fr/LC_MESSAGES/messages.mo searx/translations/fr/LC_MESSAGES/messages.po−1090 searx/translations/gl/LC_MESSAGES/messages.mo searx/translations/gl/LC_MESSAGES/messages.po−1083 searx/translations/he/LC_MESSAGES/messages.mo searx/translations/he/LC_MESSAGES/messages.po−1087 searx/translations/hr/LC_MESSAGES/messages.mo searx/translations/hr/LC_MESSAGES/messages.po−1083 searx/translations/hu/LC_MESSAGES/messages.mo searx/translations/hu/LC_MESSAGES/messages.po−1085 searx/translations/ia/LC_MESSAGES/messages.mo searx/translations/ia/LC_MESSAGES/messages.po−1082 searx/translations/it/LC_MESSAGES/messages.mo searx/translations/it/LC_MESSAGES/messages.po−1090 searx/translations/ja/LC_MESSAGES/messages.mo searx/translations/ja/LC_MESSAGES/messages.po−1090 searx/translations/lt/LC_MESSAGES/messages.mo searx/translations/lt/LC_MESSAGES/messages.po−1082 searx/translations/nl/LC_MESSAGES/messages.mo searx/translations/nl/LC_MESSAGES/messages.po−1085 searx/translations/nl_BE/LC_MESSAGES/messages.mo searx/translations/nl_BE/LC_MESSAGES/messages.po−1083 searx/translations/oc/LC_MESSAGES/messages.mo searx/translations/oc/LC_MESSAGES/messages.po−1083 searx/translations/pl/LC_MESSAGES/messages.mo searx/translations/pl/LC_MESSAGES/messages.po−1014 searx/translations/pt/LC_MESSAGES/messages.mo searx/translations/pt/LC_MESSAGES/messages.po−1083 searx/translations/pt_BR/LC_MESSAGES/messages.mo searx/translations/pt_BR/LC_MESSAGES/messages.po−1089 searx/translations/ro/LC_MESSAGES/messages.mo searx/translations/ro/LC_MESSAGES/messages.po−1085 searx/translations/ru/LC_MESSAGES/messages.mo searx/translations/ru/LC_MESSAGES/messages.po−1088 searx/translations/sk/LC_MESSAGES/messages.mo searx/translations/sk/LC_MESSAGES/messages.po−1082 searx/translations/sl/LC_MESSAGES/messages.mo searx/translations/sl/LC_MESSAGES/messages.po−1082 searx/translations/sr/LC_MESSAGES/messages.mo searx/translations/sr/LC_MESSAGES/messages.po−1084 searx/translations/sv/LC_MESSAGES/messages.mo searx/translations/sv/LC_MESSAGES/messages.po−1084 searx/translations/ta/LC_MESSAGES/messages.mo searx/translations/ta/LC_MESSAGES/messages.po−1087 searx/translations/te/LC_MESSAGES/messages.mo searx/translations/te/LC_MESSAGES/messages.po−1082 searx/translations/tr/LC_MESSAGES/messages.mo searx/translations/tr/LC_MESSAGES/messages.po−1085 searx/translations/uk/LC_MESSAGES/messages.mo searx/translations/uk/LC_MESSAGES/messages.po−1085 searx/translations/vi/LC_MESSAGES/messages.mo searx/translations/vi/LC_MESSAGES/messages.po−1082 searx/translations/zh_CN/LC_MESSAGES/messages.mo searx/translations/zh_CN/LC_MESSAGES/messages.po−1089 searx/translations/zh_Hant_TW/LC_MESSAGES/messages.mo searx/translations/zh_Hant_TW/LC_MESSAGES/messages.po−1014 searx/translations/zh_TW/LC_MESSAGES/messages.mo searx/translations/zh_TW/LC_MESSAGES/messages.po−1086 searx/utils.py−615 searx/version.py−26 searx/webadapter.py−250 searx/webapp.py−1243 searx/webutils.py−148 searx_extra/__init__.py searx_extra/google_search.py−35 searx_extra/standalone_searx.py−217 searx_extra/update/__init__.py searx_extra/update/update_ahmia_blacklist.py−30 searx_extra/update/update_currencies.py−150 searx_extra/update/update_engine_descriptions.py−202 searx_extra/update/update_external_bangs.py−157 searx_extra/update/update_firefox_version.py−68 searx_extra/update/update_languages.py−205 searx_extra/update/update_osm_keys_tags.py−209 searx_extra/update/update_pygments.py−138 searx_extra/update/update_translations.sh−15 searx_extra/update/update_wikidata_units.py−54 setup.py−78 tests/__init__.py−2 tests/robot/__init__.py−75 tests/unit/__init__.py tests/unit/engines/test_command.py−240 tests/unit/engines/test_xpath.py−121 tests/unit/network/__init__.py tests/unit/network/test_network.py−239 tests/unit/settings/empty_settings.yml tests/unit/settings/syntaxerror_settings.yml−2 tests/unit/settings/user_settings.yml−111 tests/unit/settings/user_settings_keep_only.yml−14 tests/unit/settings/user_settings_remove.yml−10 tests/unit/settings/user_settings_remove2.yml−15 tests/unit/settings/user_settings_simple.yml−9 tests/unit/test_answerers.py−16 tests/unit/test_engines_init.py−44 tests/unit/test_external_bangs.py−117 tests/unit/test_plugins.py−139 tests/unit/test_preferences.py−140 tests/unit/test_query.py−290 tests/unit/test_results.py−41 tests/unit/test_search.py−100 tests/unit/test_settings_loader.py−122 tests/unit/test_standalone_searx.py−111 tests/unit/test_utils.py−228 tests/unit/test_webadapter.py−54 tests/unit/test_webapp.py−248 tests/unit/test_webutils.py−87 tox.ini−2 user/index.html+116 user/own-instance.html+172 user/search_syntax.html+137 utils/brand.env−9 utils/build_env.py−38 utils/filtron.sh−561 utils/filtron.sh.html+301 utils/index.html+217 utils/lib.sh−1845 utils/lxc-searx.env−97 utils/lxc.sh−560 utils/lxc.sh.html+361 utils/makefile.include−103 utils/makefile.lxc−32 utils/morty.sh−546 utils/morty.sh.html+304 utils/searx.sh−914 utils/searx.sh.html+177 utils/templates/etc/apache2−1 utils/templates/etc/filtron/rules.json−129 utils/templates/etc/httpd/sites-available/morty.conf−28 utils/templates/etc/httpd/sites-available/searx.conf:filtron−33 utils/templates/etc/httpd/sites-available/searx.conf:uwsgi−27 utils/templates/etc/nginx/default.apps-available/morty.conf−11 utils/templates/etc/nginx/default.apps-available/searx.conf:filtron−16 utils/templates/etc/searx/use_default_settings.yml−22 utils/templates/etc/uwsgi/apps-archlinux/searx.ini−88 utils/templates/etc/uwsgi/apps-archlinux/searx.ini:socket−85 utils/templates/etc/uwsgi/apps-available/searx.ini−87 utils/templates/etc/uwsgi/apps-available/searx.ini:socket−84 utils/templates/lib/systemd/system/filtron.service−29 utils/templates/lib/systemd/system/morty.service−29
.codecov.ymldeleted−31
@@ -1,31 +0,0 @@
1−comment: false
2−coverage:
3− status:
4− project:
5− default:
6− # basic
7− target: auto
8− threshold: null
9− base: auto
10− # advanced
11− branches: null
12− if_no_uploads: error
13− if_not_found: success
14− if_ci_failed: error
15− only_pulls: false
16− flags: null
17− paths: null
18− patch:
19− default:
20− # basic
21− target: auto
22− threshold: null
23− base: auto
24− # advanced
25− branches: null
26− if_no_uploads: error
27− if_not_found: success
28− if_ci_failed: error
29− only_pulls: false
30− flags: null
31− paths: null
.config.shdeleted−59
@@ -1,59 +0,0 @@
1−# -*- coding: utf-8; mode: sh -*-
2−# SPDX-License-Identifier: AGPL-3.0-or-later
3−# shellcheck shell=bash disable=SC2034
4−#
5−# This environment is used by ./utils scripts like filtron.sh or searx.sh. The
6−# default values are *most flexible* and *best maintained*, you normally not
7−# need to change the defaults (except PUBLIC_URL).
8−#
9−# Before you change any value here you have to uninstall any previous
10−# installation. Further is it recommended to backup your changes simply by
11−# adding them to you local brand (git branch)::
12−#
13−# git add .config
14−
15−# The public URL of the searx instance: PUBLIC_URL="https://mydomain.xy/searx"
16−# The default is taken from ./utils/brand.env.
17−
18−PUBLIC_URL="${SEARX_URL}"
19−
20−if [[ ${PUBLIC_URL} == "https://searx.me" ]]; then
21− # hint: Linux containers do not have DNS entries, lets use IPs
22− PUBLIC_URL="http://$(primary_ip)/searx"
23−fi
24−
25−# searx.sh
26−# ---------
27−
28−# SEARX_INTERNAL_URL="127.0.0.1:8888"
29−# SEARX_SETTINGS_TEMPLATE="${REPO_ROOT}/utils/templates/etc/searx/use_default_settings.yml"
30−
31−# Only change, if you maintain a searx brand in your searx fork (GIT_URL) which
32−# is not hold by branch 'master'. The branch has to be a local branch, in the
33−# repository from which you install (which is most often the case). If you want
34−# to install branch 'foo', don't forget to run 'git branch foo origin/foo' once.
35−# GIT_BRANCH="${GIT_BRANCH:-master}"
36−
37−# filtron.sh
38−# ----------
39−
40−# FILTRON_API="127.0.0.1:4005"
41−# FILTRON_LISTEN="127.0.0.1:4004"
42−# FILTRON_TARGET="127.0.0.1:8888"
43−
44−# morty.sh
45−# --------
46−
47−# morty listen address
48−# MORTY_LISTEN="127.0.0.1:3000"
49−# PUBLIC_URL_PATH_MORTY="/morty/"
50−
51−# system services
52−# ---------------
53−
54−# Common $HOME folder of the service accounts
55−# SERVICE_HOME_BASE="/usr/local"
56−
57−# **experimental**: Set SERVICE_USER to run all services by one account, but be
58−# aware that removing discrete components might conflict!
59−# SERVICE_USER=searx
.coveragercdeleted−11
@@ -1,11 +0,0 @@
1−[run]
2−branch = True
3−source = searx
4−
5−[report]
6−show_missing = True
7−exclude_lines =
8− if __name__ == .__main__.:
9−
10−[html]
11−directory = coverage
.dir-locals.eldeleted−133
@@ -1,133 +0,0 @@
1−;;; .dir-locals.el
2−;;
3−;; If you get ``*** EPC Error ***`` (even after a jedi:install-server) in your
4−;; emacs session, mostly you have jedi-mode enabled but the python enviroment is
5−;; missed. The python environment has to be next to the
6−;; ``<repo>/.dir-locals.el`` in::
7−;;
8−;; ./local/py3
9−;;
10−;; In Emacs, some buffer locals are referencing the project environment:
11−;;
12−;; - prj-root --> <repo>/
13−;; - python-environment-directory --> <repo>/local
14−;; - python-environment-default-root-name --> py3
15−;; - python-shell-virtualenv-root --> <repo>/local/py3
16−;; When this variable is set with the path of the virtualenv to use,
17−;; `process-environment' and `exec-path' get proper values in order to run
18−;; shells inside the specified virtualenv, example::
19−;; (setq python-shell-virtualenv-root "/path/to/env/")
20−;;
21−;; To setup such an environment build target 'pyenv' or 'pyenvinstall'::
22−;;
23−;; $ make pyenvinstall
24−;;
25−;; Alternatively create the virtualenv, source it and install jedi + epc
26−;; (required by `emacs-jedi <https://tkf.github.io/emacs-jedi>`_)::
27−;;
28−;; $ python -m venv ./local/py3
29−;; ...
30−;; $ source ./local/py3/bin/activate
31−;; (py3)$ # now install into the activated 'py3' environment ..
32−;; (py3)$ pip install jedi epc
33−;; ...
34−;;
35−;; Here is what also I found useful to add to my .emacs::
36−;;
37−;; (global-set-key [f6] 'flycheck-mode)
38−;; (add-hook 'python-mode-hook 'my:python-mode-hook)
39−;;
40−;; (defun my:python-mode-hook ()
41−;; (add-to-list 'company-backends 'company-jedi)
42−;; (require 'jedi-core)
43−;; (jedi:setup)
44−;; (define-key python-mode-map (kbd "C-c C-d") 'jedi:show-doc)
45−;; (define-key python-mode-map (kbd "M-.") 'jedi:goto-definition)
46−;; (define-key python-mode-map (kbd "M-,") 'jedi:goto-definition-pop-marker)
47−;; )
48−;;
49−
50−((nil
51− . ((fill-column . 80)
52− ))
53− (python-mode
54− . ((indent-tabs-mode . nil)
55−
56− ;; project root folder is where the `.dir-locals.el' is located
57− (eval . (setq-local
58− prj-root (locate-dominating-file default-directory ".dir-locals.el")))
59−
60− (eval . (setq-local
61− python-environment-directory (expand-file-name "./local" prj-root)))
62−
63− ;; use 'py3' enviroment as default
64− (eval . (setq-local
65− python-environment-default-root-name "py3"))
66−
67− (eval . (setq-local
68− python-shell-virtualenv-root
69− (concat python-environment-directory
70− "/"
71− python-environment-default-root-name)))
72−
73− ;; python-shell-virtualenv-path is obsolete, use python-shell-virtualenv-root!
74− ;; (eval . (setq-local
75− ;; python-shell-virtualenv-path python-shell-virtualenv-root))
76−
77− (eval . (setq-local
78− python-shell-interpreter
79− (expand-file-name "bin/python" python-shell-virtualenv-root)))
80−
81− (eval . (setq-local
82− python-environment-virtualenv
83− (list (expand-file-name "bin/virtualenv" python-shell-virtualenv-root)
84− ;;"--system-site-packages"
85− "--quiet")))
86−
87− (eval . (setq-local
88− pylint-command
89− (expand-file-name "bin/pylint" python-shell-virtualenv-root)))
90−
91− ;; pylint will find the '.pylintrc' file next to the CWD
92− ;; https://pylint.readthedocs.io/en/latest/user_guide/run.html#command-line-options
93− (eval . (setq-local
94− flycheck-pylintrc ".pylintrc"))
95−
96− ;; flycheck & other python stuff should use the local py3 environment
97− (eval . (setq-local
98− flycheck-python-pylint-executable python-shell-interpreter))
99−
100− ;; use 'M-x jedi:show-setup-info' and 'M-x epc:controller' to inspect jedi server
101−
102− ;; https://tkf.github.io/emacs-jedi/latest/#jedi:environment-root -- You
103− ;; can specify a full path instead of a name (relative path). In that case,
104− ;; python-environment-directory is ignored and Python virtual environment
105− ;; is created at the specified path.
106− (eval . (setq-local jedi:environment-root python-shell-virtualenv-root))
107−
108− ;; https://tkf.github.io/emacs-jedi/latest/#jedi:server-command
109− (eval .(setq-local
110− jedi:server-command
111− (list python-shell-interpreter
112− jedi:server-script)
113− ))
114−
115− ;; jedi:environment-virtualenv --> see above 'python-environment-virtualenv'
116− ;; is set buffer local! No need to setup jedi:environment-virtualenv:
117− ;;
118− ;; Virtualenv command to use. A list of string. If it is nil,
119− ;; python-environment-virtualenv is used instead. You must set non-nil
120− ;; value to jedi:environment-root in order to make this setting work.
121− ;;
122− ;; https://tkf.github.io/emacs-jedi/latest/#jedi:environment-virtualenv
123− ;;
124− ;; (eval . (setq-local
125− ;; jedi:environment-virtualenv
126− ;; (list (expand-file-name "bin/virtualenv" python-shell-virtualenv-root)
127− ;; ;;"--python"
128− ;; ;;"/usr/bin/python3.4"
129− ;; )))
130−
131− ;; jedi:server-args
132−
133− )))
.dockerignoredeleted−56
@@ -1,56 +0,0 @@
1−*~
2−*/*~
3−*/*/*~
4−*/*/*/*~
5−*/*/*/*/*~
6−
7−#
8−local/
9−
10−# Git
11−.git
12−.gitignore
13−
14−# CI
15−.codeclimate.yml
16−.travis.yml
17−.taskcluster.yml
18−
19−# Byte-compiled / optimized / DLL files
20−__pycache__/
21−*/__pycache__/
22−*/*/__pycache__/
23−*/*/*/__pycache__/
24−*.py[cod]
25−*/*.py[cod]
26−*/*/*.py[cod]
27−*/*/*/*.py[cod]
28−
29−# to sync with .gitignore
30−.coverage
31−coverage/
32−.installed.cfg
33−engines.cfg
34−env
35−searx-ve
36−robot_log.html
37−robot_output.xml
38−robot_report.html
39−test_basic/
40−setup.cfg
41−
42−# node_modules
43−node_modules/
44−*/node_modules/
45−*/*/node_modules/
46−*/*/*/node_modules/
47−*/*/*/*/node_modules/
48−
49−.tx/
50−
51−#
52−build/
53−dist/
54−local/
55−gh-pages/
56−searx.egg-info/
.gitattributesdeleted−10
@@ -1,10 +0,0 @@
1−searx/static/css/bootstrap.min.css -diff
2−searx/static/js/bootstrap.min.js -diff
3−searx/static/themes/oscar/css/logicodev.min.css -diff
4−searx/static/themes/oscar/css/leaflet.min.css -diff
5−searx/static/themes/oscar/css/pointhi.min.css -diff
6−searx/static/themes/oscar/js/searx.min.js -diff
7−searx/static/themes/simple/css/searx.min.css -diff
8−searx/static/themes/simple/css/searx-rtl.min.css -diff
9−searx/static/themes/simple/js/searx.min.js -diff
10−searx/static/themes/simple/js/searx.min.js.map -diff
.github/ISSUE_TEMPLATE/bug-report.mddeleted−39
@@ -1,39 +0,0 @@
1−---
2−name: Bug report
3−about: Report a bug in Searx
4−title: ''
5−labels: bug
6−assignees: ''
7−
8−---
9−<!-- PLEASE FILL THESE FIELDS, IT REALLY HELPS THE MAINTAINERS OF SEARX -->
10−
11−**Version of Searx, commit number if you are using on master branch and stipulate if you forked Searx**
12−<!-- If you are running on master branch using git execute this command
13−in order to fetch the latest commit ID:
14−```
15−git log -1
16−```
17−If you are using searx-docker then look at the bottom of the Searx page
18−and check for the version after "Powered by searx"
19−
20−Please also stipulate if you are using a forked version of Searx and
21−include a link to the fork source code.
22−-->
23−**How did you install Searx?**
24−<!-- Did you install Searx using the official wiki or using searx-docker
25−or manually by executing the searx/webapp.py file? -->
26−**What happened?**
27−<!-- A clear and concise description of what the bug is. -->
28−
29−**How To Reproduce**
30−<!-- How can we reproduce this issue? (as minimally and as precisely as possible) -->
31−
32−**Expected behavior**
33−<!-- A clear and concise description of what you expected to happen. -->
34−
35−**Screenshots & Logs**
36−<!-- If applicable, add screenshots, logs to help explain your problem. -->
37−
38−**Additional context**
39−<!-- Add any other context about the problem here. -->
.github/ISSUE_TEMPLATE/config.ymldeleted−14
@@ -1,14 +0,0 @@
1−blank_issues_enabled: true
2−contact_links:
3− - name: Installation issue using the official wiki
4− url: https://github.com/searx/searx/discussions/new?category_id=32001257
5− about: Ask for help if you are having some issue with installing Searx using the official wiki.
6− - name: Installation issue using searx-docker
7− url: https://github.com/searx/searx/discussions/new?category_id=32001259
8− about: Ask for help if you are having some issue with installing Searx using searx-docker.
9− - name: Installation issue without using the official wiki nor searx-docker
10− url: https://github.com/searx/searx/discussions/new?category_id=32001260
11− about: Ask for help if you are having some issue with installing Searx manually without using the wiki nor searx-docker.
12− - name: Report a bug on a public Searx instance
13− url: https://github.com/searx/searx/discussions/new?category_id=32001412
14− about: Report a bug that you discovered on a public Searx instance.
.github/ISSUE_TEMPLATE/engine-request.mddeleted−31
@@ -1,31 +0,0 @@
1−---
2−name: Engine request
3−about: Request a new engine in Searx
4−title: ''
5−labels: enhancement, engine request
6−assignees: ''
7−
8−---
9−<!-- PLEASE FILL THESE FIELDS, IT REALLY HELPS THE MAINTAINERS OF SEARX -->
10−
11−**Working URL to the engine**
12−<!-- Please check if the engine is responding correctly before submitting it. -->
13−
14−**Why do you want to add this engine?**
15−<!-- What's special about this engine? Is it open source or libre? -->
16−
17−**Features of this engine**
18−<!-- Features of this engine: Doesn't track its users, fast, easy to integrate, ... -->
19−
20−**How can Searx fetch the information from this engine?**
21−<!-- List API URL, example code (using the correct markdown) and more
22−that could be useful for the developers in order to implement this engine.
23−If you don't know what to write, let this part blank.>
24−
25−**Applicable category of this engine**
26−<!-- Where should this new engine fit in Searx? Current categories in Searx:
27−general, files, images, it, map, music, news, science, social media and videos.
28−You can add multiple categories at the same time. -->
29−
30−**Additional context**
31−<!-- Add any other context about this engine here. -->
.github/ISSUE_TEMPLATE/feature-request.mddeleted−21
@@ -1,21 +0,0 @@
1−---
2−name: Feature request
3−about: Request a new feature in Searx
4−title: ''
5−labels: enhancement
6−assignees: ''
7−
8−---
9−<!-- PLEASE FILL THESE FIELDS, IT REALLY HELPS THE MAINTAINERS OF SEARX -->
10−
11−**Is your feature request related to a problem? Please describe.**
12−<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
13−
14−**Describe the solution you'd like**
15−<!-- A clear and concise description of what you want to happen. -->
16−
17−**Describe alternatives you've considered**
18−<!-- A clear and concise description of any alternative solutions or features you've considered. -->
19−
20−**Additional context**
21−<!-- Add any other context or screenshots about the feature request here. -->
.github/dependabot.ymldeleted−10
@@ -1,10 +0,0 @@
1−# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
2−version: 2
3−updates:
4− - package-ecosystem: "pip"
5− directory: "/"
6− schedule:
7− interval: "weekly"
8− day: "friday"
9− open-pull-requests-limit: 5
10− target-branch: "master"
.github/workflows/data-update.ymldeleted−66
@@ -1,66 +0,0 @@
1−name: "Update searx.data"
2−on:
3− schedule:
4− - cron: "05 06 1 * *"
5− workflow_dispatch:
6−
7−jobs:
8− updateData:
9− name: Update data - ${{ matrix.fetch }}
10− runs-on: ubuntu-20.04
11− if: ${{ github.repository_owner == 'searx'}}
12− strategy:
13− matrix:
14− fetch:
15− - update_ahmia_blacklist.py
16− - update_currencies.py
17− - update_external_bangs.py
18− - update_firefox_version.py
19− - update_languages.py
20− - update_wikidata_units.py
21− steps:
22− - name: Checkout
23− uses: actions/checkout@v2
24−
25− - name: Install Ubuntu packages
26− run: |
27− sudo ./utils/searx.sh install packages
28−
29− - name: Set up Python
30− uses: actions/setup-python@v2
31− with:
32− python-version: '3.10'
33− architecture: 'x64'
34−
35− - name: Install Python dependencies
36− run: |
37− make V=1 install
38−
39− - name: Fetch data
40− env:
41− FETCH_SCRIPT: ./searx_extra/update/${{ matrix.fetch }}
42− run: |
43− V=1 ./manage pyenv.cmd python "$FETCH_SCRIPT"
44−
45− - name: Create Pull Request
46− id: cpr
47− uses: peter-evans/create-pull-request@v3
48− with:
49− token: ${{ secrets.DATA_PR_TOKEN }}
50− commit-message: Update searx.data - ${{ matrix.fetch }}
51− committer: searx-bot <noreply@github.com>
52− author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
53− signoff: false
54− branch: update_data_${{ matrix.fetch }}
55− delete-branch: true
56− draft: false
57− title: 'Update searx.data - ${{ matrix.fetch }}'
58− body: |
59− Update searx.data - ${{ matrix.fetch }}
60− labels: |
61− data
62−
63− - name: Check outputs
64− run: |
65− echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
66− echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"
.github/workflows/integration.ymldeleted−151
@@ -1,151 +0,0 @@
1−name: Integration
2−
3−on:
4− push:
5− branches: ["master"]
6− pull_request:
7− branches: ["master"]
8−
9−jobs:
10− python:
11− name: Python ${{ matrix.python-version }}
12− runs-on: ubuntu-20.04
13− strategy:
14− matrix:
15− os: [ubuntu-20.04]
16− python-version: [3.7, 3.8, 3.9, "3.10"]
17− steps:
18− - name: Checkout
19− uses: actions/checkout@v2
20− - name: Install Ubuntu packages
21− run: |
22− sudo ./utils/searx.sh install packages
23− sudo apt install firefox
24− - name: Set up Python
25− uses: actions/setup-python@v2
26− with:
27− python-version: ${{ matrix.python-version }}
28− architecture: 'x64'
29− - name: Cache Python dependencies
30− id: cache-python
31− uses: actions/cache@v2
32− with:
33− path: ./local
34− key: python-${{ matrix.os }}-${{ matrix.python-version }}-${{ hashFiles('requirements*.txt', 'setup.py') }}
35− - name: Install Python dependencies
36− if: steps.cache-python.outputs.cache-hit != 'true'
37− run: |
38− make V=1 install
39− make V=1 gecko.driver
40− - name: Run tests
41− run: make V=1 ci.test
42− - name: Test coverage
43− run: make V=1 test.coverage
44− - name: Store coverage result
45− uses: actions/upload-artifact@v2
46− with:
47− name: coverage-${{ matrix.python-version }}
48− path: coverage/
49− retention-days: 60
50−
51− themes:
52− name: Themes
53− runs-on: ubuntu-20.04
54− steps:
55− - name: Checkout
56− uses: actions/checkout@v2
57− - name: Install Ubuntu packages
58− run: sudo ./utils/searx.sh install packages
59− - name: Set up Python
60− uses: actions/setup-python@v2
61− with:
62− python-version: '3.9'
63− architecture: 'x64'
64− - name: Cache Python dependencies
65− id: cache-python
66− uses: actions/cache@v2
67− with:
68− path: ./local
69− key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py') }}
70− - name: Install node dependencies
71− run: make V=1 node.env
72− - name: Build themes
73− run: make V=1 themes.all
74−
75− documentation:
76− name: Documentation
77− runs-on: ubuntu-20.04
78− steps:
79− - name: Checkout
80− uses: actions/checkout@v2
81− with:
82− fetch-depth: '0'
83− persist-credentials: false
84− - name: Install Ubuntu packages
85− run: sudo ./utils/searx.sh install buildhost
86− - name: Set up Python
87− uses: actions/setup-python@v2
88− with:
89− python-version: '3.10'
90− architecture: 'x64'
91− - name: Cache Python dependencies
92− id: cache-python
93− uses: actions/cache@v2
94− with:
95− path: ./local
96− key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py') }}
97− - name: Build documentation
98− run: |
99− make V=1 docs.clean docs.html
100− - name: Deploy
101− if: github.ref == 'refs/heads/master'
102− uses: JamesIves/github-pages-deploy-action@3.7.1
103− with:
104− GITHUB_TOKEN: ${{ github.token }}
105− BRANCH: gh-pages
106− FOLDER: dist/docs
107− CLEAN: true # Automatically remove deleted files from the deploy branch
108−
109− dockers:
110− name: Docker
111− if: github.ref == 'refs/heads/master'
112− needs:
113− - python
114− - themes
115− - documentation
116− env:
117− DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
118− runs-on: ubuntu-20.04
119− steps:
120− - name: Checkout
121− if: env.DOCKERHUB_USERNAME != null
122− uses: actions/checkout@v2
123− with:
124− # make sure "make docker.push" can get the git history
125− fetch-depth: '0'
126− - name: Set up Python
127− uses: actions/setup-python@v2
128− with:
129− python-version: '3.9'
130− architecture: 'x64'
131− - name: Cache Python dependencies
132− id: cache-python
133− uses: actions/cache@v2
134− with:
135− path: ./local
136− key: python-ubuntu-20.04-3.9-${{ hashFiles('requirements*.txt', 'setup.py') }}
137− - name: Set up QEMU
138− if: env.DOCKERHUB_USERNAME != null
139− uses: docker/setup-qemu-action@v1
140− - name: Set up Docker Buildx
141− if: env.DOCKERHUB_USERNAME != null
142− uses: docker/setup-buildx-action@v1
143− - name: Login to DockerHub
144− if: env.DOCKERHUB_USERNAME != null
145− uses: docker/login-action@v1
146− with:
147− username: ${{ secrets.DOCKERHUB_USERNAME }}
148− password: ${{ secrets.DOCKERHUB_TOKEN }}
149− - name: Build and push
150− if: env.DOCKERHUB_USERNAME != null
151− run: make -e GIT_URL=$(git remote get-url origin) docker.push
.gitignoredeleted−30
@@ -1,30 +0,0 @@
1−# to sync with .dockerignore
2−.coverage
3−coverage/
4−cache/
5−.installed.cfg
6−engines.cfg
7−env
8−searx-ve
9−robot_log.html
10−robot_output.xml
11−robot_report.html
12−test_basic/
13−setup.cfg
14−
15−*.pyc
16−*/*.pyc
17−*~
18−*.swp
19−
20−/node_modules
21−
22−.tx/
23−
24−build/
25−dist/
26−local/
27−gh-pages/
28−searx.egg-info/
29−.env
30−geckodriver.log
.landscape.yamldeleted−3
@@ -1,3 +0,0 @@
1−strictness: high
2−ignore-paths:
3− - bootstrap.py
searx/metrology/__init__.py → .nojekyllrenamed

The content is the same.

.pylintrcdeleted−444
@@ -1,444 +0,0 @@
1−# -*- coding: utf-8; mode: conf -*-
2−# lint Python modules using external checkers.
3−#
4−# This is the main checker controlling the other ones and the reports
5−# generation. It is itself both a raw checker and an astng checker in order
6−# to:
7−# * handle message activation / deactivation at the module level
8−# * handle some basic but necessary stats'data (number of classes, methods...)
9−#
10−[MASTER]
11−
12−# A comma-separated list of package or module names from where C extensions may
13−# be loaded. Extensions are loading into the active Python interpreter and may
14−# run arbitrary code
15−extension-pkg-whitelist=lxml.etree
16−
17−# Add files or directories to the blacklist. They should be base names, not
18−# paths.
19−ignore=CVS, .git, .svn
20−
21−# Add files or directories matching the regex patterns to the blacklist. The
22−# regex matches against base names, not paths.
23−ignore-patterns=
24−
25−# Python code to execute, usually for sys.path manipulation such as
26−# pygtk.require().
27−#init-hook=
28−
29−# Use multiple processes to speed up Pylint.
30−jobs=1
31−
32−# List of plugins (as comma separated values of python modules names) to load,
33−# usually to register additional checkers.
34−load-plugins=
35−
36−# Pickle collected data for later comparisons.
37−persistent=yes
38−
39−# Specify a configuration file.
40−#rcfile=
41−
42−# Allow loading of arbitrary C extensions. Extensions are imported into the
43−# active Python interpreter and may run arbitrary code.
44−unsafe-load-any-extension=no
45−
46−
47−[MESSAGES CONTROL]
48−
49−# Only show warnings with the listed confidence levels. Leave empty to show
50−# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
51−confidence=
52−
53−# Disable the message, report, category or checker with the given id(s). You
54−# can either give multiple identifiers separated by comma (,) or put this
55−# option multiple times (only on the command line, not in the configuration
56−# file where it should appear only once).You can also use "--disable=all" to
57−# disable everything first and then reenable specific checks. For example, if
58−# you want to run only the similarities checker, you can use "--disable=all
59−# --enable=similarities". If you want to run only the classes checker, but have
60−# no Warning level messages displayed, use"--disable=all --enable=classes
61−# --disable=W"
62−disable=bad-whitespace, duplicate-code, consider-using-f-string
63−
64−# Enable the message, report, category or checker with the given id(s). You can
65−# either give multiple identifier separated by comma (,) or put this option
66−# multiple time (only on the command line, not in the configuration file where
67−# it should appear only once). See also the "--disable" option for examples.
68−enable=
69−
70−
71−[REPORTS]
72−
73−# Python expression which should return a note less than 10 (10 is the highest
74−# note). You have access to the variables errors warning, statement which
75−# respectively contain the number of errors / warnings messages and the total
76−# number of statements analyzed. This is used by the global evaluation report
77−# (RP0004).
78−evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
79−
80−# Template used to display messages. This is a python new-style format string
81−# used to format the message information. See doc for all details
82−
83−# HINT: do not set this here, use argument --msg-template=...
84−#msg-template={path}:{line}: [{msg_id}({symbol}),{obj}] {msg}
85−
86−# Set the output format. Available formats are text, parseable, colorized, json
87−# and msvs (visual studio).You can also give a reporter class, eg
88−# mypackage.mymodule.MyReporterClass.
89−
90−# HINT: do not set this here, use argument --output-format=...
91−#output-format=text
92−
93−# Tells whether to display a full report or only the messages
94−reports=no
95−
96−# Activate the evaluation score.
97−score=yes
98−
99−
100−[REFACTORING]
101−
102−# Maximum number of nested blocks for function / method body
103−max-nested-blocks=5
104−
105−
106−[BASIC]
107−
108−# List of builtins function names that should not be used, separated by a comma
109−bad-functions=map,filter,apply,input
110−
111−# Naming hint for argument names
112−argument-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
113−
114−# Regular expression matching correct argument names
115−argument-rgx=(([a-z][a-zA-Z0-9_]{2,30})|(_[a-z0-9_]*))$
116−
117−# Naming hint for attribute names
118−attr-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
119−
120−# Regular expression matching correct attribute names
121−attr-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*)|([A-Z0-9_]*))$
122−
123−# Bad variable names which should always be refused, separated by a comma
124−bad-names=foo,bar,baz,toto,tutu,tata
125−
126−# Naming hint for class attribute names
127−class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
128−
129−# Regular expression matching correct class attribute names
130−class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
131−
132−# Naming hint for class names
133−class-name-hint=[A-Z_][a-zA-Z0-9]+$
134−
135−# Regular expression matching correct class names
136−class-rgx=[A-Z_][a-zA-Z0-9]+$
137−
138−# Naming hint for constant names
139−const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$
140−
141−# Regular expression matching correct constant names
142−const-rgx=(([a-zA-Z_][a-zA-Z0-9_]*)|(__.*__))$
143−#const-rgx=[f]?[A-Z_][a-zA-Z0-9_]{2,30}$
144−
145−# Minimum line length for functions/classes that require docstrings, shorter
146−# ones are exempt.
147−docstring-min-length=-1
148−
149−# Naming hint for function names
150−function-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
151−
152−# Regular expression matching correct function names
153−function-rgx=(([a-z][a-zA-Z0-9_]{2,30})|(_[a-z0-9_]*))$
154−
155−# Good variable names which should always be accepted, separated by a comma
156−good-names=i,j,k,ex,Run,_,log,cfg,id
157−
158−# Include a hint for the correct naming format with invalid-name
159−include-naming-hint=no
160−
161−# Naming hint for inline iteration names
162−inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$
163−
164−# Regular expression matching correct inline iteration names
165−inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
166−
167−# Naming hint for method names
168−method-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
169−
170−# Regular expression matching correct method names
171−method-rgx=(([a-z][a-zA-Z0-9_]{2,30})|(_[a-z0-9_]*))$
172−
173−# Naming hint for module names
174−module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
175−
176−# Regular expression matching correct module names
177−#module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
178−module-rgx=([a-z_][a-z0-9_]*)$
179−
180−# Colon-delimited sets of names that determine each other's naming style when
181−# the name regexes allow several styles.
182−name-group=
183−
184−# Regular expression which should only match function or class names that do
185−# not require a docstring.
186−no-docstring-rgx=^_
187−
188−# List of decorators that produce properties, such as abc.abstractproperty. Add
189−# to this list to register other decorators that produce valid properties.
190−property-classes=abc.abstractproperty
191−
192−# Naming hint for variable names
193−variable-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
194−
195−# Regular expression matching correct variable names
196−variable-rgx=(([a-z][a-zA-Z0-9_]{2,30})|(_[a-z0-9_]*)|([a-z]))$
197−
198−
199−[FORMAT]
200−
201−# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
202−expected-line-ending-format=
203−
204−# Regexp for a line that is allowed to be longer than the limit.
205−ignore-long-lines=^\s*(# )?<?https?://\S+>?$
206−
207−# Number of spaces of indent required inside a hanging or continued line.
208−indent-after-paren=4
209−
210−# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
211−# tab).
212−indent-string=' '
213−
214−# Maximum number of characters on a single line.
215−max-line-length=120
216−
217−# Maximum number of lines in a module
218−max-module-lines=2000
219−
220−# List of optional constructs for which whitespace checking is disabled. `dict-
221−# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}.
222−# `trailing-comma` allows a space between comma and closing bracket: (a, ).
223−# `empty-line` allows space-only lines.
224−no-space-check=trailing-comma,dict-separator
225−
226−# Allow the body of a class to be on the same line as the declaration if body
227−# contains single statement.No config file found, using default configuration
228−
229−single-line-class-stmt=no
230−
231−# Allow the body of an if to be on the same line as the test if there is no
232−# else.
233−single-line-if-stmt=no
234−
235−
236−[LOGGING]
237−
238−# Logging modules to check that the string format arguments are in logging
239−# function parameter format
240−logging-modules=logging
241−
242−
243−[MISCELLANEOUS]
244−
245−# List of note tags to take in consideration, separated by a comma.
246−notes=FIXME,XXX,TODO
247−
248−
249−[SIMILARITIES]
250−
251−# Ignore comments when computing similarities.
252−ignore-comments=yes
253−
254−# Ignore docstrings when computing similarities.
255−ignore-docstrings=yes
256−
257−# Ignore imports when computing similarities.
258−ignore-imports=no
259−
260−# Minimum lines number of a similarity.
261−min-similarity-lines=4
262−
263−
264−[SPELLING]
265−
266−# Spelling dictionary name. Available dictionaries: none. To make it working
267−# install python-enchant package.
268−spelling-dict=
269−
270−# List of comma separated words that should not be checked.
271−spelling-ignore-words=
272−
273−# A path to a file that contains private dictionary; one word per line.
274−spelling-private-dict-file=
275−
276−# Tells whether to store unknown words to indicated private dictionary in
277−# --spelling-private-dict-file option instead of raising a message.
278−spelling-store-unknown-words=no
279−
280−
281−[TYPECHECK]
282−
283−# List of decorators that produce context managers, such as
284−# contextlib.contextmanager. Add to this list to register other decorators that
285−# produce valid context managers.
286−contextmanager-decorators=contextlib.contextmanager
287−
288−# List of members which are set dynamically and missed by pylint inference
289−# system, and so shouldn't trigger E1101 when accessed. Python regular
290−# expressions are accepted.
291−generated-members=
292−
293−# Tells whether missing members accessed in mixin class should be ignored. A
294−# mixin class is detected if its name ends with "mixin" (case insensitive).
295−ignore-mixin-members=yes
296−
297−# This flag controls whether pylint should warn about no-member and similar
298−# checks whenever an opaque object is returned when inferring. The inference
299−# can return multiple potential results while evaluating a Python object, but
300−# some branches might not be evaluated, which results in partial inference. In
301−# that case, it might be useful to still emit no-member and other checks for
302−# the rest of the inferred objects.
303−ignore-on-opaque-inference=yes
304−
305−# List of class names for which member attributes should not be checked (useful
306−# for classes with dynamically set attributes). This supports the use of
307−# qualified names.
308−ignored-classes=optparse.Values,thread._local,_thread._local
309−
310−# List of module names for which member attributes should not be checked
311−# (useful for modules/projects where namespaces are manipulated during runtime
312−# and thus existing member attributes cannot be deduced by static analysis. It
313−# supports qualified module names, as well as Unix pattern matching.
314−ignored-modules=
315−
316−# Show a hint with possible names when a member name was not found. The aspect
317−# of finding the hint is based on edit distance.
318−missing-member-hint=yes
319−
320−# The minimum edit distance a name should have in order to be considered a
321−# similar match for a missing member name.
322−missing-member-hint-distance=1
323−
324−# The total number of similar names that should be taken in consideration when
325−# showing a hint for a missing member.
326−missing-member-max-choices=1
327−
328−
329−[VARIABLES]
330−
331−# List of additional names supposed to be defined in builtins. Remember that
332−# you should avoid to define new builtins when possible.
333−additional-builtins=
334−
335−# Tells whether unused global variables should be treated as a violation.
336−allow-global-unused-variables=yes
337−
338−# List of strings which can identify a callback function by name. A callback
339−# name must start or end with one of those strings.
340−callbacks=cb_,_cb
341−
342−# A regular expression matching the name of dummy variables (i.e. expectedly
343−# not used).
344−dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
345−
346−# Argument names that match this expression will be ignored. Default to name
347−# with leading underscore
348−ignored-argument-names=_.*|^ignored_|^unused_
349−
350−# Tells whether we should check for unused import in __init__ files.
351−init-import=no
352−
353−# List of qualified module names which can have objects that can redefine
354−# builtins.
355−redefining-builtins-modules=six.moves,future.builtins
356−
357−
358−[CLASSES]
359−
360−# List of method names used to declare (i.e. assign) instance attributes.
361−defining-attr-methods=__init__,__new__,setUp
362−
363−# List of member names, which should be excluded from the protected access
364−# warning.
365−exclude-protected=_asdict,_fields,_replace,_source,_make
366−
367−# List of valid names for the first argument in a class method.
368−valid-classmethod-first-arg=cls
369−
370−# List of valid names for the first argument in a metaclass class method.
371−valid-metaclass-classmethod-first-arg=mcs
372−
373−
374−[DESIGN]
375−
376−# Maximum number of arguments for function / method
377−max-args=8
378−
379−# Maximum number of attributes for a class (see R0902).
380−max-attributes=20
381−
382−# Maximum number of boolean expressions in a if statement
383−max-bool-expr=5
384−
385−# Maximum number of branch for function / method body
386−max-branches=12
387−
388−# Maximum number of locals for function / method body
389−max-locals=20
390−
391−# Maximum number of parents for a class (see R0901).
392−max-parents=7
393−
394−# Maximum number of public methods for a class (see R0904).
395−max-public-methods=20
396−
397−# Maximum number of return / yield for function / method body
398−max-returns=6
399−
400−# Maximum number of statements in function / method body
401−max-statements=50
402−
403−# Minimum number of public methods for a class (see R0903).
404−min-public-methods=2
405−
406−
407−[IMPORTS]
408−
409−# Allow wildcard imports from modules that define __all__.
410−allow-wildcard-with-all=no
411−
412−# Analyse import fallback blocks. This can be used to support both Python 2 and
413−# 3 compatible code, which means that the block might have code that exists
414−# only in one or another interpreter, leading to false positives when analysed.
415−analyse-fallback-blocks=no
416−
417−# Deprecated modules which should not be used, separated by a comma
418−deprecated-modules=optparse,tkinter.tix
419−
420−# Create a graph of external dependencies in the given file (report RP0402 must
421−# not be disabled)
422−ext-import-graph=
423−
424−# Create a graph of every (i.e. internal and external) dependencies in the
425−# given file (report RP0402 must not be disabled)
426−import-graph=
427−
428−# Create a graph of internal dependencies in the given file (report RP0402 must
429−# not be disabled)
430−int-import-graph=
431−
432−# Force import order to recognize a module as part of the standard
433−# compatibility libraries.
434−known-standard-library=
435−
436−# Force import order to recognize a module as part of a third party library.
437−known-third-party=enchant
438−
439−
440−[EXCEPTIONS]
441−
442−# Exceptions that will emit a warning when being caught. Defaults to
443−# "Exception"
444−overgeneral-exceptions=Exception
404.htmlnew file+1
@@ -0,0 +1 @@
1+<html><head><META http-equiv='refresh' content='0;URL=index.html'></head></html>
AUTHORS.rstdeleted−168
@@ -1,168 +0,0 @@
1−Searx was created by Adam Tauber and is maintained by Adam Tauber, Noémi Ványi, @pofilo, Gaspard d'Hautefeuille and Émilien Devos.
2−
3−Major contributing authors:
4−
5−- Adam Tauber <asciimoo@gmail.com> `@asciimoo <https://github.com/asciimoo>`_
6−- Matej Cotman
7−- Thomas Pointhuber
8−- Alexandre Flament `@dalf <https://github.com/dalf>`_
9−- @Cqoicebordel
10−- Noémi Ványi
11−- Marc Abonce Seguin @a01200356
12−- @pofilo
13−- Markus Heiser @return42
14−- Émilien Devos @unixfox
15−- Alexandre Flament
16−
17−People who have submitted patches/translations, reported bugs, consulted features or
18−generally made searx better:
19−
20−- Laszlo Hammerl
21−- Stefan Marsiske
22−- Gabor Nagy
23−- @pw3t
24−- @rhapsodhy
25−- András Veres-Szentkirályi
26−- Benjamin Sonntag
27−- @HLFH
28−- @TheRadialActive
29−- @Okhin
30−- André Koot
31−- Alejandro León Aznar
32−- rike
33−- dp
34−- Martin Zimmermann
35−- @courgette
36−- @kernc
37−- @Reventl0v
38−- Caner Başaran
39−- Benjamin Sonntag
40−- @opi
41−- @dimqua
42−- Giorgos Logiotatidis
43−- Luc Didry
44−- Niklas Haas
45−- @underr
46−- Emmanuel Benazera
47−- @GreenLunar
48−- Kang-min Liu
49−- Kirill Isakov
50−- Guilhem Bonnefille
51−- @jibe-b
52−- Christian Pietsch @pietsch
53−- @Maxqia
54−- Ashutosh Das @pyprism
55−- YuLun Shih @imZack
56−- Dmitry Mikhirev @mikhirev
57−- David A Roberts `@davidar <https://github.com/davidar>`_
58−- Jan Verbeek @blyxxyz
59−- Ammar Najjar @ammarnajjar
60−- @stepshal
61−- François Revol @mmuman
62−- Harry Wood @harry-wood
63−- Thomas Renard @threnard
64−- Pydo `<https://github.com/pydo>`_
65−- Athemis `<https://github.com/Athemis>`_
66−- Stefan Antoni `<http://stefan.antoni.io>`
67−- @firebovine
68−- Lorenzo J. Lucchini @luccoj
69−- @eig8phei
70−- @maxigas
71−- Jannik Winkel @kiney
72−- @juanitobananas
73−- Vache Asatryan @vachi
74−- Luca CPZ @lcpz
75−- @nikaiw
76−- Thirnearez
77−- Hypolite Petovan @MrPetovan
78−- @woorst
79−- @Apply55gx
80−- @pyrrh0n1c
81−- @cclauss
82−- QGW @moon2l
83−- Pierre-Alain Toret @daftaupe
84−- Matthew Olmsted @icegiant
85−- Michael Tran @trankmichael
86−- Joseph Nuthalapati @josephkiranbabu
87−- @maiki
88−- Richard Didier @zeph33
89−- Michael Vieria @Themimitoof
90−- Richard Nespithal @rndevfx
91−- Stanislas @angristan
92−- @rinpatch
93−- g. s. @usernameisntallowed
94−- Léo Bourrel @bourrel
95−- @cy8aer
96−- @Popolon
97−- Alice Ferrazzi @aliceinwire
98−- @LiquidLemon
99−- @dadosch
100−- Václav Zouzalík @Venca24
101−- @ZEROF
102−- Ivan Skytte Jørgensen @isj-privacore
103−- @miicha
104−- Étienne Deparis @milouse
105−- @pelag0s
106−- Denis Wernert @d-tux
107−- Robin Hallabro-Kokko @hallabro
108−- Jonas Zohren @jfowl
109−- Elias Ojala @theel0ja
110−- @brunob
111−- Nick Espig @nachtalb
112−- Rachmadani Haryono @rachmadaniHaryono
113−- Frank de Lange @yetangitu
114−- Nicolas Gelot @nfk
115−- @volth
116−- Mathieu Brunot @madmath03
117−- @lorddavidiii
118−- @x250
119−- Robby O'Connor @robbyoconnor
120−- Finn @0xhtml
121−- @tmikaeld
122−- @hobbestigrou
123−- Vipul @finn0
124−- @CaffeinatedTech
125−- Robin Schneider @ypid
126−- @splintah
127−- Lukas van den Berk @lukasvdberk
128−- @piplongrun
129−- Jason Kaltsikis @jjasonkal
130−- Sion Kazama @KazamaSion
131−- @resynth1943
132−- Mostafa Ahangarha @ahangarha
133−- @gordon-quad
134−- Sophie Tauchert @999eagle
135−- @bauruine
136−- Michael Ilsaas `<https://mikeri.net>`_
137−- @renyhp
138−- rachmadani haryono @rachmadaniHaryono
139−- Mohamad Safadieh @msafadieh
140−- @gardouille
141−- @resynth1943
142−- @Eliesemoule
143−- @gardouille
144−- @GazoilKerozen
145−- Lukáš Kucharczyk @KucharczykL
146−- Lynda Lopez @lyndalopez544
147−- M. Efe Çetin @efectn
148−- Nícholas Kegler @nicholasks
149−- @pierrechtux
150−- Scott Wallace @scottwallacesh
151−- @Singustromo
152−- @TheEvilSkeleton
153−- @Wonderfall
154−- @mrwormo
155−- Xiaoyu WEI @xywei
156−- @joshu9h
157−- Daniel Hones
158−- @cyclaero
159−- @thezeroalpha
160−- @Tobi823
161−- @archiecodes
162−- @BBaoVanC
163−- @datagram1
164−- @lucky13820
165−- @jhigginbotham
166−- @xenrox
167−- @OliveiraHermogenes
168−- Paul Alcock @Guilvareux
CHANGELOG.rstdeleted−706
@@ -1,706 +0,0 @@
1−1.0.0 2021.03.27
2−================
3−
4−Core
5−~~~~
6−
7−- drop support for Python 3.5 ( #2459 )
8−- add support for Python 3.9 ( #2397 #2459 )
9−- update Python dependencies ( #2428 #2459 #2206 ) ⚠️ pyopenssl is not longer required
10−- automatic update of searx.data ( #2555 #2585 #2595 #2592 #2600 )
11−- update searx.data ( #2604 #2605 #2606 #2607 #2415 )
12−- add ability to send engine data to subsequent requests ( #2615 )
13−- add checker ( #2419 #2476 #2481 #2682 #2682 #2657 )
14−- by default allow only HTTPS, not HTTP ( #2641 #2659 )
15−- replace /translations.js with an embedded JSON ( #2660 )
16−- activate raise_for_error by default ( #2557 )
17−- don't dump traceback of SearxEngineResponseException on init ( #2635 )
18−
19−Documentation
20−~~~~~~~~~~~~~
21−
22−- update nginx configuration ( #2618 )
23−- document workaround for using 2 languages simultaneously ( #2479 )
24−- improve admin-docs about result proxy (morty) configuration ( #2509 )
25−- fixed typo ( #2457 )
26−
27−New settings.yml
28−~~~~~~~~~~~~~~~~
29−
30−- `general.contact_url` : add link to contact instance maintainer to footer of each page ( #2391 14c7cc0e118f1d0873b32b34793cdec2c5c9c13e #2412 )
31−- `brand` : move brand options from Makefile to settings.yml ( #2408 #2473 )
32−
33−Themes
34−~~~~~~
35−
36−- oscar: Hide links panel in mobile screens ( #2458 )
37−- oscar: upgrade dependencies ( #2346 #2673 #2662 )
38−- remove legacy, courgette and pix-art themes ( #2344 )
39−- add hyperlink to searx instances list in error message ( #2387 )
40−- preferences: a tooltip is shown when the mouse is over the engine names ( #2661 )
41−- Ignore double-quotes when highlighting query parts ( #2553 )
42−- update autocomplete ( #2593 )
43−
44−New engines
45−~~~~~~~~~~~
46−
47−- ccengine ( #2533 )
48−- mediathekviewweb ( #2541 )
49−- solidtorrents ( #2626 )
50−- solr ( #2652 )
51−- rumble ( #2588 )
52−- wiby.me ( #2452 )
53−
54−Fixed engines
55−~~~~~~~~~~~~~
56−
57−- apk_mirror ( #2556 #2642 )
58−- bing ( #2602 )
59−- duckduckgo ( #2560 #2559 )
60−- library genesis ( #2448 )
61−- ina ( 0ba71c3644c4d20f70528c10eed1385399ec1c82 )
62−- invidious ( #2451 )
63−- json_engine ( #2562 )
64−- google ( #2482 )
65−- google images ( #2482 )
66−- google play apps ( 88657fe9c2a41b9be38ee5146e5870672416db12 )
67−- google play movies ( 50ba2b9e87ef61e96da124f906d3aff4c7870e3f )
68−- google news ( #2483 #2498 )
69−- google scholar ( #2611 )
70−- google video ( #2482 )
71−- hoogle ( 6255b33c9dcf0d28f0a3307af988565f69259ce2 )
72−- naver ( #2542 )
73−- semantic schollar ( f596f5767bed915a5c3bed59ae26283e53f975ca f596f5767bed915a5c3bed59ae26283e53f975ca )
74−- startpage ( #2396 )
75−- seznam ( #2564 28286cf3f2308113bf440fb6e7cf326c6ed07889 )
76−- wikipedia ( #2554 #2565 #2681 #2681 )
77−- yacy ( #2669 )
78−- yahoo news ( #2640 #2655 )
79−
80−Updated engines
81−~~~~~~~~~~~~~~~
82−
83−- duckduckgo ( 5f450fda74e80bf350eb1493f66cfa61deaf5cea )
84−- geektimes ( 45f0e1a859fa12ce2ae0c24dc356922fcad50c8d )
85−- lobste.rs ( 06b754ad67aa6066aed6df77b5ffb74aabebb040 )
86−- soundcloud ( #2671 )
87−- peertube ( #2570 )
88−- recoll ( #2539 )
89−- yggtorrent ( #2573 )
90−
91−Removed engines
92−~~~~~~~~~~~~~~~
93−
94−- acgsou ( #2654 )
95−- google_play_music ( #2558 )
96−- metager ( #2538 )
97−- voat ( #2445 )
98−- yandex ( #2566 )
99−
100−Bug fixes
101−~~~~~~~~~
102−
103−- Fix empty colon in query from selecting Chinese ( #2454 )
104−- Get correct locale with country from browser ( #2531 )
105−
106−Code refactoring / reduce the technical debt
107−~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
108−
109−- refactor searx.search.SearchQuery and searx.search.EngineRef ( #2398 )
110−- dynamically set language_support variable ( #2499 )
111−- engines: add about variable ( #2460 )
112−- processors ( #2225 5c6a5407a0b124c3323e73c33b81ec1fbd7d2fce )
113−- remove Fabric file ( #2494 )
114−- use unittest from py3, remove unittest2 from py2 ( #2608 )
115−
116−Github
117−~~~~~~
118−
119−- add notice for the issue templates ( #2447 )
120−- every Sunday, call utils/fetch_*.py scripts and create a PR automatically ( #2500 728e09676400221a064627509a31470d8f6e33bf )
121−- minor change: replace "travis" by "CI" ( #2528 )
122−
123−Build scripts
124−~~~~~~~~~~~~~
125−
126−- update secret key check ( #2411 )
127−- fix makefile targets `books/{name}.*` and `books/user.pdf` ( #2420 #2530 )
128−- upload-pypi-test & linuxdoc has been released on PyPi ( #2456 )
129−- fix makefile target `gh-pages` : flatten history of branch gh.pages ( #2514 )
130−- optimize creation of the virtualenv & pyenvinstall targets ( #2421 )
131−- update pyenv pyenvinstall Make targets ( #2517 )
132−- makefile.python: remove duplicate pyenv-(un)install targets ( #2418 )
133−- [fix] make targets engines.languages and useragents.update ( #2643 )
134−- [fix] utils/serax.sh create_pyenv() - drop duplicate 'pip install .' ( #2621 )
135−
136−Install scripts
137−~~~~~~~~~~~~~~~
138−
139−- drop Ubuntu 16.04 (Xenial Xerus) support ( #2619 )
140−- replace ubu1910 image by ubu2010 image ( #2435 )
141−- LXC switch to Fedora 33 / Fedora 31 reached its EOL #2634 ( #2634 )
142−- add package which to CentOS-7 boilerplate ( #2623 )
143−- use SEARX_SETTINGS_TEMPLATE from .config environment ( #2417 )
144−- determine path to makefile.lxc in a LXC ( #2399 )
145−- remove unused code ( #2401 #2497 )
146−- support git versions <v2.22 ( #2620 )
147−
148−Announcement
149−~~~~~~~~~~~~
150−
151−We, the searx maintainer team, would like to say a huge thank you for everybody who had been involved in the development of searx or supported us in the past 7 years - making our first stable release available. Special thanks to [NLNet](https://nlnet.nl) for sponsoring multiple features of this release.
152−
153−
154−0.18.0 2020.12.14
155−=================
156−
157−Core
158−~~~~
159−
160−- drop Python 2 support ( #2137 #2244 )
161−- separate index and search routes ( #1681 ). ⚠️ add & remove your searx instance(s) from your browser.
162−- add external_bang ( #2027 #2043 #2059 )
163−- add external plugins supports ( #2074 )
164−- add plugin converting strings into hash digests ( #1246 )
165−- new category: Onions ( #565 )
166−- allow searx query parts anywhere in the query ( commit aa3c18dda9329fff875328f6ba97483c417b149a 2aef38c3b9d1fe93e9d665a49b10151d63d92392 )
167−- preferences: use base_url for prefix of sharing 'currenly saved preferences' (#1249 )
168−- upgrade to request 2.24.0, pyopenssl is optional ( #2199 )
169−- force admins to set secret_key if debug mode is disabled ( #2256 )
170−- standalone searx update ( #1591 )
171−- architecture clean up ( #2140 #2185 #2195 #2196 #2198 #2189 #2208 #2239 #2241 #2246 #2248 )
172−- record detail about engine error ( #2332 #2375 #2350 ). Add a new API endpoint: ``/stats/errors``.
173−- display if an engine does not support HTTPS requests ( #2373 )
174−
175−New settings.yml
176−~~~~~~~~~~~~~~~~
177−
178−- ``use_default_settings``: user settings can relied on the default settings ( #2291 #2362 #2349 )
179−- ``ui.results_on_new_tab: False`` - for opening result links in a new tab ( #2167 )
180−- ``ui.advanced_search`` - add preference for displaying advanced settings ( #2327 )
181−- ``server.method: "POST"`` - Make default query submission method configurable ( #2130 )
182−- ``server.default_http_headers`` - add default http headers ( #2295 )
183−- ``engines.*.proxies`` - Using proxy only for specific engines ( #1827 #2319 ), see https://searx.github.io/searx/dev/engine_overview.html#settings-yml
184−- ``enabled_plugins`` - Enabled plugins ( a05c660e3036ad8d02072fc6731af54c2ed6151c )
185−- ``preferences.lock`` - Let admins lock user preferences ( #2270 )
186−
187−Oscar theme
188−~~~~~~~~~~~
189−
190−- update infobox ( #2131 )
191−
192− - Make infoboxes shorter by default.
193− - Hide the main image by default as well and set a maximum height even when expanded.
194− - Add a toggle at the bottom of the infobox to expand it or to shrink it again.
195− - Fix pointhi style
196−- query suggestion does not keep the language tag of the original query ( #1314 )
197−- fix the clear button ( #2306 )
198−
199−Simple theme
200−~~~~~~~~~~~~
201−
202−- Fix autocomplete ( #2205 )
203−
204−New engines
205−~~~~~~~~~~~
206−
207−- ahmia, not_evil ( #565 )
208−- codeberg ( #2104 )
209−- command line engines: git grep, find, etc. ( #2128 #2250 )
210−- elasticsearch ( #2292 )
211−- metager ( #2139 )
212−- naver ( #1912 )
213−- opensemanticsearch ( #2271 )
214−- peertube ( #2109 )
215−- recoll (#2325)
216−- sepiasearch ( #2227 )
217−
218−Updated engines
219−~~~~~~~~~~~~~~~
220−
221−- digg ( #2285 )
222−- dbpedia ( #2352 )
223−- duckduckgo_definitions ( #2224 #2356 )
224−- duden ( #2359 )
225−- invidious ( #2116 )
226−- libgen ( #2360 )
227−- photon ( #2336 )
228−- soundclound ( #2365 )
229−- wikipedia ( #2178 #2363 #2354 )
230−- wikidata ( #2151 #2224 #2353 ) - faster response time
231−- yaCy ( #2255 ) - support HTTP digest authentication.
232−- youtube_noapi ( #2364 )
233−
234−Fixed engines
235−~~~~~~~~~~~~~
236−
237−- 1x ( #2361 )
238−- answer 'random sha256' ( #2121 )
239−- bing image ( #1496 )
240−- duckduckgo ( #2254 )
241−- genius ( #2371 )
242−- google ( #2236 )
243−- google image ( #2115 )
244−- lobste.rs ( #2253 )
245−- piratebay ( #2133 )
246−- startpage ( #2385 )
247−- torrentz ( #2101 )
248−
249−Removed engines
250−~~~~~~~~~~~~~~~
251−
252−- filecrop ( #2352 )
253−- searchcode_doc ( #2372 )
254−- seedpeer ( #2366 )
255−- twitter ( #2372 )
256−- yggtorrent ( #2099 #2375 )
257−
258−Install scripts & documentation
259−~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
260−
261−- install script & documentation ( #2384 #2380 #2362 #2287 #2283 #2277 #2223 #2211 #2118 #2117 #2063 )
262−
263−Docker image
264−~~~~~~~~~~~~
265−
266−- use Alpine 3.12 ( #1983 )
267−- uwsgi serves the static files directly. ( #1865 )
268−- fix k8s support ( #2099 )
269−- make docker produces clean tag version ( #2182 )
270−
271−Bug fixes
272−~~~~~~~~~
273−
274−- searx.utils.HTMLTextExtractor: invalid HTML don't raise an Exception ( #2190 )
275−- Fix static URL ( commit da8b227044f45127f705f6ea94a72d368eea73bb )
276−- Fix autocomplete ( #2127 )
277−- Fix opensearch.xml ( #2132 #2247 )
278−- Fix documentation build ( #2237 )
279−- Some fixes in the fetch languages script ( #2212 )
280−
281−Special thanks to `NLNet <https://nlnet.nl>`__ for sponsoring multiple features of this release.
282−
283−
284−0.17.0 2020.07.09
285−=================
286−
287− - New engines
288−
289− - eTools
290− - Wikibooks
291− - Wikinews
292− - Wikiquote
293− - Wikisource
294− - Wiktionary
295− - Wikiversity
296− - Wikivoyage
297− - Rubygems
298− - Engine fixes (google, google images, startpage, gigablast, yacy)
299− - Private engines introduced - more details: https://searx.github.io/searx/blog/private-engines.html
300− - Greatly improved documentation - check it at https://searx.github.io/searx
301− - Added autofocus to all search inputs
302− - CSP friendly oscar theme
303− - Added option to hide engine errors with `display_error_messages` engine option (true/false values, default is true)
304− - Tons of accessibility fixes - see https://github.com/searx/searx/issues/350 for details
305− - More flexible branding options: configurable vcs/issue tracker links
306− - Added "disable all" & "allow all" options to preferences engine select
307− - Autocomplete keyboard navigation fixes
308− - Configurable category order
309− - Wrap long lines in infoboxes
310− - Added RSS subscribtion link
311− - Added routing directions to OSM results
312− - Added author and length attributes to youtube videos
313− - Fixed image stretch with mobile viewport in oscar theme
314− - Added translatable JS strings
315− - Better HTML annotations - engine names and endpoints are available as classes
316− - RTL text fixes in oscar theme
317− - Handle weights in accept-language HTTP headers
318− - Added answerer results to rss/csv output
319− - Added new autocomplete backends to settings.yml
320− - Updated opensearch.xml
321− - Fixed custom locale setting from settings.yml
322− - Translation updates
323− - Removed engines: faroo
324−
325−Special thanks to `NLNet <https://nlnet.nl>`__ for sponsoring multiple features of this release.
326−Special thanks to https://www.accessibility.nl/english for making accessibilty audit.
327−
328−News
329−~~~~
330−
331−- @HLFH joined the maintainer team
332−- Dropped Python2 support
333−
334−0.16.0 2020.01.30
335−=================
336−
337−- New engines
338−
339− - Splash
340− - Apkmirror
341− - NPM search
342− - Invidious
343− - Seedpeer
344−- New languages
345−
346− - Estonian
347− - Interlingua
348− - Lithuanian
349− - Tibetian
350− - Occitan
351− - Tamil
352−- 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)
353−- Dependency updates
354−- Speed optimizations
355−- Initial support for offline engines
356−- Image format display
357−- Inline js scripts removed
358−- Infinite scroll plugin fix
359−- Simple theme bugfixes
360−- Docker image updates
361−- Bang expression fixes
362−- Result merging fixes
363−- New environment variable added: SEARX_BIND_ADDRESS
364−
365−
366−News
367−~~~~
368−
369−- @return42 joined the maintainer team
370−- This is the last release with Python2 support
371−
372−0.15.0 2019.01.06
373−=================
374−
375−- New engines
376−
377− - Acgsou (files, images, videos, music)
378− - Duden.de (general)
379− - Seznam (general)
380− - Mojeek (general)
381−- New languages
382−
383− - Catalan
384− - Welsh
385− - Basque
386− - Persian (Iran)
387− - Galician
388− - Dutch (Belgium)
389− - Telugu
390− - Vietnamese
391−- New random answerers
392−
393− - sha256
394− - uuidv4
395−- New DOI resolsvers
396−
397− - sci-hub.tw
398−- Fix Vim mode on Firefox
399−- Fix custom select in Oscar theme
400−- Engine fixes (duckduckgo, google news, currency convert, gigablast, google scholar, wikidata image, etymonline, google videos, startpage, bing image)
401−- Minor simple theme fixes
402−
403−- New Youtube icon in Oscar theme
404−- Get DOI rewriters from settings.yml
405−- Hide page buttons when infinite scrolling is enabled
406−- Update user agent versions
407−- Make Oscar style configurable
408−- Make suspend times of errored engines configurable
409−
410−0.14.0 2018.02.19
411−=================
412−
413−- New theme: oscar-logicodev dark
414−- New engines
415−
416− - AskSteem (general)
417−- Autocompleter fix for py3
418−- Engine fixes (pdbe, pubmed, gigablast, google, yacy, bing videos, microsoft academic)
419−- "All" option is removed from languages
420−- Minor UI changes
421−- Translation updates
422−
423−0.13.1 2017.11.23
424−=================
425−
426−- Bug fixes
427−
428− - https://github.com/searx/searx/issues/1088
429− - https://github.com/searx/searx/issues/1089
430−
431−- Dependency updates
432−
433−
434−0.13.0 2017.11.21
435−=================
436−
437−- New theme: simple
438−- New engines
439−
440− - Google videos (video)
441− - Bing videos (video)
442− - Arxiv (science)
443− - OpenAIRE (science)
444− - Pubmed (science)
445− - Genius (music/lyrics)
446−- Display engine errors
447−- Faster startup
448−- Lots of engine fixes (google images, dictzone, duckduckgo, duckduckgo images, torrentz, faroo, digg, tokyotoshokan, nyaa.si, google news, gitlab, gigablast, geektimes.ru, habrahabr.ru, voat.co, base, json engine, currency convert, google)
449−- Shorter saved preferences URL
450−- Fix engine duplications in results
451−- Py3 compatibility fixes
452−- Translation updates
453−
454−
455−0.12.0 2017.06.04
456−=================
457−
458−- Python3 compatibility
459−- New engines
460−
461− - 1337x.to (files, music, video)
462− - Semantic Scholar (science)
463− - Library Genesis (general)
464− - Framalibre (IT)
465− - Free Software Directory (IT)
466−- More compact result UI (oscar theme)
467−- Configurable static content and template path
468−- Spelling suggestions
469−- Multiple engine fixes (duckduckgo, bing, swisscows, yahoo news, bing news, twitter, bing images)
470−- Reduced static image size
471−- Docker updates
472−- Translation updates
473−
474−
475−Special thanks to `NLNet <https://nlnet.nl>`__ for sponsoring multiple features of this release.
476−
477−
478−0.11.0 2017.01.10
479−=================
480−
481−- New engines
482−
483− - Protein Data Bank Europe (science)
484− - Voat.co (general, social media)
485− - Online Etimology Dictionary (science)
486− - CCC tv (video, it)
487− - Searx (all categories - can rotate multiple other instances)
488−- Answerer functionality (see answerer section on /preferences)
489−- Local answerers
490−
491− - Statistical functions
492− - Random value generator
493−- Result proxy support (with `morty <https://github.com/asciimoo/morty>`__)
494−- Extended time range filter
495−- Improved search language support
496−- Multiple engine fixes (digbt, 500px, google news, ixquick, bing, kickass, google play movies, habrahabr, yandex)
497−- Minor UI improvements
498−- Suggestion support for JSON engine
499−- Result and query escaping fixes
500−- Configurable HTTP server version
501−- More robust search error handling
502−- Faster webapp initialization in debug mode
503−- Search module refactor
504−- Translation updates
505−
506−
507−0.10.0 2016.09.06
508−=================
509−
510−- New engines
511−
512− - Archive.is (general)
513− - INA (videos)
514− - Scanr (science)
515− - Google Scholar (science)
516− - Crossref (science)
517− - Openrepos (files)
518− - Microsoft Academic Search Engine (science)
519− - Hoogle (it)
520− - Diggbt (files)
521− - Dictzone (general - dictionary)
522− - Translated (general - translation)
523−- New Plugins
524−
525− - Infinite scroll on results page
526− - DOAI rewrite
527−- Full theme redesign
528−- Display the number of results
529−- Filter searches by date range
530−- Instance config API endpoint
531−- Dependency version updates
532−- Socks proxy support for outgoing requests
533−- 404 page
534−
535−
536−News
537−~~~~
538−
539−@kvch joined the maintainer team
540−
541−
542−0.9.0 2016.05.24
543−================
544−
545−- New search category: science
546−- New engines
547−
548− - Wolframalpha (science)
549− - Frinkiac (images)
550− - Arch Linux (it)
551− - BASE - Bielefeld Academic Search Engine (science)
552− - Dokuwiki (general)
553− - Nyaa.se (files, images, music, video)
554− - Reddit (general, images, news, social media)
555− - Torrentz.eu (files, music, video)
556− - Tokyo Toshokan (files, music, video)
557− - F-Droid (files)
558− - Erowid (general)
559− - Bitbucket (it)
560− - GitLab (it)
561− - Geektimes (it)
562− - Habrahabr (it)
563−- New plugins
564−
565− - Open links in new tab
566− - Vim hotkeys for better navigation
567−- Wikipedia/Mediawiki engine improvements
568−- Configurable instance name
569−- Configurable connection pool size
570−- Fixed broken google engine
571−- Better docker image
572−- Images in standard results
573−- Fixed and refactored user settings (Warning: backward incompatibility - you have to reset your custom engine preferences)
574−- Suspending engines on errors
575−- Simplified development/deployment tooling
576−- Translation updates
577−- Multilingual autocompleter
578−- Qwant autocompleter backend
579−
580−
581−0.8.1 2015.12.22
582−================
583−
584−- More efficient result parsing
585−- Rewritten google engine to prevent app crashes
586−- Other engine fixes/tweaks
587−
588− - Bing news
589− - Btdigg
590− - Gigablast
591− - Google images
592− - Startpage
593−
594−
595−News
596−~~~~
597−
598−New documentation page is available: https://searx.github.io/searx
599−
600−
601−0.8.0 2015.09.08
602−================
603−
604−- New engines
605−
606− - Blekko (image)
607− - Gigablast (general)
608− - Spotify (music)
609− - Swisscows (general, images)
610− - Qwant (general, images, news, social media)
611−- Plugin system
612−- New plugins
613−
614− - HTTPS rewrite
615− - Search on cagetory select
616− - User information
617− - Tracker url part remover
618−- Multiple outgoing IP and HTTP/HTTPS proxy support
619−- New autocompleter: startpage
620−- New theme: pix-art
621−- Settings file structure change
622−- Fabfile, docker deployment
623−- Optional safesearch result filter
624−- Force HTTPS in engines if possible
625−- Disabled HTTP referrer on outgoing links
626−- Display cookie information
627−- Prettier search URLs
628−- Right-to-left text handling in themes
629−- Translation updates (New locales: Chinese, Hebrew, Portuguese, Romanian)
630−
631−
632−New dependencies
633−~~~~~~~~~~~~~~~~
634−
635−- pyopenssl
636−- ndg-httpsclient
637−- pyasn1
638−- pyasn1-modules
639−- certifi
640−
641−
642−News
643−~~~~
644−
645−@dalf joined the maintainer "team"
646−
647−
648−0.7.0 2015.02.03
649−================
650−
651−- New engines
652−
653− - Digg
654− - Google Play Store
655− - Deezer
656− - Btdigg
657− - Mixcloud
658− - 1px
659−- Image proxy
660−- Search speed improvements
661−- Autocompletition of engines, shortcuts and supported languages
662−- Translation updates (New locales: Turkish, Russian)
663−- Default theme changed to oscar
664−- Settings option to disable engines by default
665−- UI code cleanup and restructure
666−- Engine tests
667−- Multiple engine bug fixes and tweaks
668−- Config option to set default interface locale
669−- Flexible result template handling
670−- Application logging and sophisticated engine exception tracebacks
671−- Kickass torrent size display (oscar theme)
672−
673−
674−New dependencies
675−~~~~~~~~~~~~~~~~
676−
677−- pygments - http://pygments.org/
678−
679−
680−0.6.0 - 2014.12.25
681−==================
682−
683−- Changelog added
684−- New engines
685−
686− - Flickr (api)
687− - Subtitleseeker
688− - photon
689− - 500px
690− - Searchcode
691− - Searchcode doc
692− - Kickass torrent
693−- Precise search request timeout handling
694−- Better favicon support
695−- Stricter config parsing
696−- Translation updates
697−- Multiple ui fixes
698−- Flickr (noapi) engine fix
699−- Pep8 fixes
700−
701−
702−News
703−~~~~
704−
705−Health status of searx instances and engines: http://stats.searx.oe5tpo.com
706−(source: https://github.com/pointhi/searx_stats)
CONTRIBUTING.mddeleted−49
@@ -1,49 +0,0 @@
1−# How to contribute
2−
3−## Resources in the documentation
4−
5−* [Development quickstart](https://searx.github.io/searx/dev/contribution_guide.html)
6−* [Contribution guide](https://searx.github.io/searx/dev/contribution_guide.html)
7−
8−## Submitting PRs
9−
10−Please follow the provided PR template when writing a description for your changes.
11−
12−Do not take criticism personally. When you get feedback, it is about your work,
13−not your character, personality, etc. Keep in mind we all want to make the project better.
14−
15−When something is not clear, please ask questions to clear things up.
16−
17−If you would like to introduce a big architectural changes or do a refactoring
18−either in the codebase or the development tools, please open an issue with a proposal
19−first. This way we can think together about the problem and probably come up
20−with a better solution.
21−
22−## Coding conventions and guidelines
23−
24−### Commit messages
25−
26−* Always write descriptive commit messages ("fix bug" is not acceptable).
27−* Use the present tense ("Add feature" not "Added feature").
28−* Use the imperative mood ("Move cursor to..." not "Moves cursor to...").
29−* Limit the first line to 72 characters or less.
30−* Include the number of the issue you are fixing.
31−
32−### Coding guidelines
33−
34−As a Python project, we must follow [PEP 8](https://www.python.org/dev/peps/pep-0008/) and [PEP 20](https://www.python.org/dev/peps/pep-0020/) guidelines.
35−
36−Furthermore, follow the Clean code conventions. The most important
37−in this project are the following rules:
38−
39−* Simpler is better. [KISS principle](https://en.wikipedia.org/wiki/KISS_principle)
40−* Be consistent.
41−* Every function must do one thing.
42−* Use descriptive names for functions and variables.
43−* Always look for the root cause.
44−* Keep configurable data high level.
45−* Avoid negative conditionals.
46−* Prefer fewer arguments.
47−* Do not add obvious comment to code.
48−* Do not comment out code, just delete lines.
49−
Dockerfiledeleted−94
@@ -1,94 +0,0 @@
1−FROM alpine:3.15
2−ENTRYPOINT ["/sbin/tini","--","/usr/local/searx/dockerfiles/docker-entrypoint.sh"]
3−EXPOSE 8080
4−VOLUME /etc/searx
5−VOLUME /var/log/uwsgi
6−
7−ARG SEARX_GID=977
8−ARG SEARX_UID=977
9−
10−RUN addgroup -g ${SEARX_GID} searx && \
11− adduser -u ${SEARX_UID} -D -h /usr/local/searx -s /bin/sh -G searx searx
12−
13−ENV INSTANCE_NAME=searx \
14− AUTOCOMPLETE= \
15− BASE_URL= \
16− MORTY_KEY= \
17− MORTY_URL= \
18− SEARX_SETTINGS_PATH=/etc/searx/settings.yml \
19− UWSGI_SETTINGS_PATH=/etc/searx/uwsgi.ini
20−
21−WORKDIR /usr/local/searx
22−
23−
24−COPY requirements.txt ./requirements.txt
25−
26−RUN apk upgrade --no-cache \
27− && apk add --no-cache -t build-dependencies \
28− build-base \
29− py3-setuptools \
30− python3-dev \
31− libffi-dev \
32− libxslt-dev \
33− libxml2-dev \
34− openssl-dev \
35− tar \
36− git \
37− && apk add --no-cache \
38− ca-certificates \
39− su-exec \
40− python3 \
41− py3-pip \
42− libxml2 \
43− libxslt \
44− openssl \
45− tini \
46− uwsgi \
47− uwsgi-python3 \
48− brotli \
49− && pip3 install --upgrade pip wheel setuptools \
50− && pip3 install --no-cache -r requirements.txt \
51− && apk del build-dependencies \
52− && rm -rf /root/.cache
53−
54−COPY searx ./searx
55−COPY dockerfiles ./dockerfiles
56−
57−ARG TIMESTAMP_SETTINGS=0
58−ARG TIMESTAMP_UWSGI=0
59−ARG VERSION_GITCOMMIT=unknown
60−
61−RUN /usr/bin/python3 -m compileall -q searx; \
62− touch -c --date=@${TIMESTAMP_SETTINGS} searx/settings.yml; \
63− touch -c --date=@${TIMESTAMP_UWSGI} dockerfiles/uwsgi.ini; \
64− if [ ! -z $VERSION_GITCOMMIT ]; then\
65− echo "VERSION_STRING = VERSION_STRING + \"-$VERSION_GITCOMMIT\"" >> /usr/local/searx/searx/version.py; \
66− fi; \
67− find /usr/local/searx/searx/static -a \( -name '*.html' -o -name '*.css' -o -name '*.js' \
68− -o -name '*.svg' -o -name '*.ttf' -o -name '*.eot' \) \
69− -type f -exec gzip -9 -k {} \+ -exec brotli --best {} \+
70−
71−# Keep these arguments at the end to prevent redundant layer rebuilds
72−ARG LABEL_DATE=
73−ARG GIT_URL=unknown
74−ARG SEARX_GIT_VERSION=unknown
75−ARG LABEL_VCS_REF=
76−ARG LABEL_VCS_URL=
77−LABEL maintainer="searx <${GIT_URL}>" \
78− description="A privacy-respecting, hackable metasearch engine." \
79− version="${SEARX_GIT_VERSION}" \
80− org.label-schema.schema-version="1.0" \
81− org.label-schema.name="searx" \
82− org.label-schema.version="${SEARX_GIT_VERSION}" \
83− org.label-schema.url="${LABEL_VCS_URL}" \
84− org.label-schema.vcs-ref=${LABEL_VCS_REF} \
85− org.label-schema.vcs-url=${LABEL_VCS_URL} \
86− org.label-schema.build-date="${LABEL_DATE}" \
87− org.label-schema.usage="https://github.com/searx/searx-docker" \
88− org.opencontainers.image.title="searx" \
89− org.opencontainers.image.version="${SEARX_GIT_VERSION}" \
90− org.opencontainers.image.url="${LABEL_VCS_URL}" \
91− org.opencontainers.image.revision=${LABEL_VCS_REF} \
92− org.opencontainers.image.source=${LABEL_VCS_URL} \
93− org.opencontainers.image.created="${LABEL_DATE}" \
94− org.opencontainers.image.documentation="https://github.com/searx/searx-docker"
LICENSEdeleted−661
@@ -1,661 +0,0 @@
1− GNU AFFERO GENERAL PUBLIC LICENSE
2− Version 3, 19 November 2007
3−
4− Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
5− Everyone is permitted to copy and distribute verbatim copies
6− of this license document, but changing it is not allowed.
7−
8− Preamble
9−
10− The GNU Affero General Public License is a free, copyleft license for
11−software and other kinds of works, specifically designed to ensure
12−cooperation with the community in the case of network server software.
13−
14− The licenses for most software and other practical works are designed
15−to take away your freedom to share and change the works. By contrast,
16−our General Public Licenses are intended to guarantee your freedom to
17−share and change all versions of a program--to make sure it remains free
18−software for all its users.
19−
20− When we speak of free software, we are referring to freedom, not
21−price. Our General Public Licenses are designed to make sure that you
22−have the freedom to distribute copies of free software (and charge for
23−them if you wish), that you receive source code or can get it if you
24−want it, that you can change the software or use pieces of it in new
25−free programs, and that you know you can do these things.
26−
27− Developers that use our General Public Licenses protect your rights
28−with two steps: (1) assert copyright on the software, and (2) offer
29−you this License which gives you legal permission to copy, distribute
30−and/or modify the software.
31−
32− A secondary benefit of defending all users' freedom is that
33−improvements made in alternate versions of the program, if they
34−receive widespread use, become available for other developers to
35−incorporate. Many developers of free software are heartened and
36−encouraged by the resulting cooperation. However, in the case of
37−software used on network servers, this result may fail to come about.
38−The GNU General Public License permits making a modified version and
39−letting the public access it on a server without ever releasing its
40−source code to the public.
41−
42− The GNU Affero General Public License is designed specifically to
43−ensure that, in such cases, the modified source code becomes available
44−to the community. It requires the operator of a network server to
45−provide the source code of the modified version running there to the
46−users of that server. Therefore, public use of a modified version, on
47−a publicly accessible server, gives the public access to the source
48−code of the modified version.
49−
50− An older license, called the Affero General Public License and
51−published by Affero, was designed to accomplish similar goals. This is
52−a different license, not a version of the Affero GPL, but Affero has
53−released a new version of the Affero GPL which permits relicensing under
54−this license.
55−
56− The precise terms and conditions for copying, distribution and
57−modification follow.
58−
59− TERMS AND CONDITIONS
60−
61− 0. Definitions.
62−
63− "This License" refers to version 3 of the GNU Affero General Public License.
64−
65− "Copyright" also means copyright-like laws that apply to other kinds of
66−works, such as semiconductor masks.
67−
68− "The Program" refers to any copyrightable work licensed under this
69−License. Each licensee is addressed as "you". "Licensees" and
70−"recipients" may be individuals or organizations.
71−
72− To "modify" a work means to copy from or adapt all or part of the work
73−in a fashion requiring copyright permission, other than the making of an
74−exact copy. The resulting work is called a "modified version" of the
75−earlier work or a work "based on" the earlier work.
76−
77− A "covered work" means either the unmodified Program or a work based
78−on the Program.
79−
80− To "propagate" a work means to do anything with it that, without
81−permission, would make you directly or secondarily liable for
82−infringement under applicable copyright law, except executing it on a
83−computer or modifying a private copy. Propagation includes copying,
84−distribution (with or without modification), making available to the
85−public, and in some countries other activities as well.
86−
87− To "convey" a work means any kind of propagation that enables other
88−parties to make or receive copies. Mere interaction with a user through
89−a computer network, with no transfer of a copy, is not conveying.
90−
91− An interactive user interface displays "Appropriate Legal Notices"
92−to the extent that it includes a convenient and prominently visible
93−feature that (1) displays an appropriate copyright notice, and (2)
94−tells the user that there is no warranty for the work (except to the
95−extent that warranties are provided), that licensees may convey the
96−work under this License, and how to view a copy of this License. If
97−the interface presents a list of user commands or options, such as a
98−menu, a prominent item in the list meets this criterion.
99−
100− 1. Source Code.
101−
102− The "source code" for a work means the preferred form of the work
103−for making modifications to it. "Object code" means any non-source
104−form of a work.
105−
106− A "Standard Interface" means an interface that either is an official
107−standard defined by a recognized standards body, or, in the case of
108−interfaces specified for a particular programming language, one that
109−is widely used among developers working in that language.
110−
111− The "System Libraries" of an executable work include anything, other
112−than the work as a whole, that (a) is included in the normal form of
113−packaging a Major Component, but which is not part of that Major
114−Component, and (b) serves only to enable use of the work with that
115−Major Component, or to implement a Standard Interface for which an
116−implementation is available to the public in source code form. A
117−"Major Component", in this context, means a major essential component
118−(kernel, window system, and so on) of the specific operating system
119−(if any) on which the executable work runs, or a compiler used to
120−produce the work, or an object code interpreter used to run it.
121−
122− The "Corresponding Source" for a work in object code form means all
123−the source code needed to generate, install, and (for an executable
124−work) run the object code and to modify the work, including scripts to
125−control those activities. However, it does not include the work's
126−System Libraries, or general-purpose tools or generally available free
127−programs which are used unmodified in performing those activities but
128−which are not part of the work. For example, Corresponding Source
129−includes interface definition files associated with source files for
130−the work, and the source code for shared libraries and dynamically
131−linked subprograms that the work is specifically designed to require,
132−such as by intimate data communication or control flow between those
133−subprograms and other parts of the work.
134−
135− The Corresponding Source need not include anything that users
136−can regenerate automatically from other parts of the Corresponding
137−Source.
138−
139− The Corresponding Source for a work in source code form is that
140−same work.
141−
142− 2. Basic Permissions.
143−
144− All rights granted under this License are granted for the term of
145−copyright on the Program, and are irrevocable provided the stated
146−conditions are met. This License explicitly affirms your unlimited
147−permission to run the unmodified Program. The output from running a
148−covered work is covered by this License only if the output, given its
149−content, constitutes a covered work. This License acknowledges your
150−rights of fair use or other equivalent, as provided by copyright law.
151−
152− You may make, run and propagate covered works that you do not
153−convey, without conditions so long as your license otherwise remains
154−in force. You may convey covered works to others for the sole purpose
155−of having them make modifications exclusively for you, or provide you
156−with facilities for running those works, provided that you comply with
157−the terms of this License in conveying all material for which you do
158−not control copyright. Those thus making or running the covered works
159−for you must do so exclusively on your behalf, under your direction
160−and control, on terms that prohibit them from making any copies of
161−your copyrighted material outside their relationship with you.
162−
163− Conveying under any other circumstances is permitted solely under
164−the conditions stated below. Sublicensing is not allowed; section 10
165−makes it unnecessary.
166−
167− 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
168−
169− No covered work shall be deemed part of an effective technological
170−measure under any applicable law fulfilling obligations under article
171−11 of the WIPO copyright treaty adopted on 20 December 1996, or
172−similar laws prohibiting or restricting circumvention of such
173−measures.
174−
175− When you convey a covered work, you waive any legal power to forbid
176−circumvention of technological measures to the extent such circumvention
177−is effected by exercising rights under this License with respect to
178−the covered work, and you disclaim any intention to limit operation or
179−modification of the work as a means of enforcing, against the work's
180−users, your or third parties' legal rights to forbid circumvention of
181−technological measures.
182−
183− 4. Conveying Verbatim Copies.
184−
185− You may convey verbatim copies of the Program's source code as you
186−receive it, in any medium, provided that you conspicuously and
187−appropriately publish on each copy an appropriate copyright notice;
188−keep intact all notices stating that this License and any
189−non-permissive terms added in accord with section 7 apply to the code;
190−keep intact all notices of the absence of any warranty; and give all
191−recipients a copy of this License along with the Program.
192−
193− You may charge any price or no price for each copy that you convey,
194−and you may offer support or warranty protection for a fee.
195−
196− 5. Conveying Modified Source Versions.
197−
198− You may convey a work based on the Program, or the modifications to
199−produce it from the Program, in the form of source code under the
200−terms of section 4, provided that you also meet all of these conditions:
201−
202− a) The work must carry prominent notices stating that you modified
203− it, and giving a relevant date.
204−
205− b) The work must carry prominent notices stating that it is
206− released under this License and any conditions added under section
207− 7. This requirement modifies the requirement in section 4 to
208− "keep intact all notices".
209−
210− c) You must license the entire work, as a whole, under this
211− License to anyone who comes into possession of a copy. This
212− License will therefore apply, along with any applicable section 7
213− additional terms, to the whole of the work, and all its parts,
214− regardless of how they are packaged. This License gives no
215− permission to license the work in any other way, but it does not
216− invalidate such permission if you have separately received it.
217−
218− d) If the work has interactive user interfaces, each must display
219− Appropriate Legal Notices; however, if the Program has interactive
220− interfaces that do not display Appropriate Legal Notices, your
221− work need not make them do so.
222−
223− A compilation of a covered work with other separate and independent
224−works, which are not by their nature extensions of the covered work,
225−and which are not combined with it such as to form a larger program,
226−in or on a volume of a storage or distribution medium, is called an
227−"aggregate" if the compilation and its resulting copyright are not
228−used to limit the access or legal rights of the compilation's users
229−beyond what the individual works permit. Inclusion of a covered work
230−in an aggregate does not cause this License to apply to the other
231−parts of the aggregate.
232−
233− 6. Conveying Non-Source Forms.
234−
235− You may convey a covered work in object code form under the terms
236−of sections 4 and 5, provided that you also convey the
237−machine-readable Corresponding Source under the terms of this License,
238−in one of these ways:
239−
240− a) Convey the object code in, or embodied in, a physical product
241− (including a physical distribution medium), accompanied by the
242− Corresponding Source fixed on a durable physical medium
243− customarily used for software interchange.
244−
245− b) Convey the object code in, or embodied in, a physical product
246− (including a physical distribution medium), accompanied by a
247− written offer, valid for at least three years and valid for as
248− long as you offer spare parts or customer support for that product
249− model, to give anyone who possesses the object code either (1) a
250− copy of the Corresponding Source for all the software in the
251− product that is covered by this License, on a durable physical
252− medium customarily used for software interchange, for a price no
253− more than your reasonable cost of physically performing this
254− conveying of source, or (2) access to copy the
255− Corresponding Source from a network server at no charge.
256−
257− c) Convey individual copies of the object code with a copy of the
258− written offer to provide the Corresponding Source. This
259− alternative is allowed only occasionally and noncommercially, and
260− only if you received the object code with such an offer, in accord
261− with subsection 6b.
262−
263− d) Convey the object code by offering access from a designated
264− place (gratis or for a charge), and offer equivalent access to the
265− Corresponding Source in the same way through the same place at no
266− further charge. You need not require recipients to copy the
267− Corresponding Source along with the object code. If the place to
268− copy the object code is a network server, the Corresponding Source
269− may be on a different server (operated by you or a third party)
270− that supports equivalent copying facilities, provided you maintain
271− clear directions next to the object code saying where to find the
272− Corresponding Source. Regardless of what server hosts the
273− Corresponding Source, you remain obligated to ensure that it is
274− available for as long as needed to satisfy these requirements.
275−
276− e) Convey the object code using peer-to-peer transmission, provided
277− you inform other peers where the object code and Corresponding
278− Source of the work are being offered to the general public at no
279− charge under subsection 6d.
280−
281− A separable portion of the object code, whose source code is excluded
282−from the Corresponding Source as a System Library, need not be
283−included in conveying the object code work.
284−
285− A "User Product" is either (1) a "consumer product", which means any
286−tangible personal property which is normally used for personal, family,
287−or household purposes, or (2) anything designed or sold for incorporation
288−into a dwelling. In determining whether a product is a consumer product,
289−doubtful cases shall be resolved in favor of coverage. For a particular
290−product received by a particular user, "normally used" refers to a
291−typical or common use of that class of product, regardless of the status
292−of the particular user or of the way in which the particular user
293−actually uses, or expects or is expected to use, the product. A product
294−is a consumer product regardless of whether the product has substantial
295−commercial, industrial or non-consumer uses, unless such uses represent
296−the only significant mode of use of the product.
297−
298− "Installation Information" for a User Product means any methods,
299−procedures, authorization keys, or other information required to install
300−and execute modified versions of a covered work in that User Product from
301−a modified version of its Corresponding Source. The information must
302−suffice to ensure that the continued functioning of the modified object
303−code is in no case prevented or interfered with solely because
304−modification has been made.
305−
306− If you convey an object code work under this section in, or with, or
307−specifically for use in, a User Product, and the conveying occurs as
308−part of a transaction in which the right of possession and use of the
309−User Product is transferred to the recipient in perpetuity or for a
310−fixed term (regardless of how the transaction is characterized), the
311−Corresponding Source conveyed under this section must be accompanied
312−by the Installation Information. But this requirement does not apply
313−if neither you nor any third party retains the ability to install
314−modified object code on the User Product (for example, the work has
315−been installed in ROM).
316−
317− The requirement to provide Installation Information does not include a
318−requirement to continue to provide support service, warranty, or updates
319−for a work that has been modified or installed by the recipient, or for
320−the User Product in which it has been modified or installed. Access to a
321−network may be denied when the modification itself materially and
322−adversely affects the operation of the network or violates the rules and
323−protocols for communication across the network.
324−
325− Corresponding Source conveyed, and Installation Information provided,
326−in accord with this section must be in a format that is publicly
327−documented (and with an implementation available to the public in
328−source code form), and must require no special password or key for
329−unpacking, reading or copying.
330−
331− 7. Additional Terms.
332−
333− "Additional permissions" are terms that supplement the terms of this
334−License by making exceptions from one or more of its conditions.
335−Additional permissions that are applicable to the entire Program shall
336−be treated as though they were included in this License, to the extent
337−that they are valid under applicable law. If additional permissions
338−apply only to part of the Program, that part may be used separately
339−under those permissions, but the entire Program remains governed by
340−this License without regard to the additional permissions.
341−
342− When you convey a copy of a covered work, you may at your option
343−remove any additional permissions from that copy, or from any part of
344−it. (Additional permissions may be written to require their own
345−removal in certain cases when you modify the work.) You may place
346−additional permissions on material, added by you to a covered work,
347−for which you have or can give appropriate copyright permission.
348−
349− Notwithstanding any other provision of this License, for material you
350−add to a covered work, you may (if authorized by the copyright holders of
351−that material) supplement the terms of this License with terms:
352−
353− a) Disclaiming warranty or limiting liability differently from the
354− terms of sections 15 and 16 of this License; or
355−
356− b) Requiring preservation of specified reasonable legal notices or
357− author attributions in that material or in the Appropriate Legal
358− Notices displayed by works containing it; or
359−
360− c) Prohibiting misrepresentation of the origin of that material, or
361− requiring that modified versions of such material be marked in
362− reasonable ways as different from the original version; or
363−
364− d) Limiting the use for publicity purposes of names of licensors or
365− authors of the material; or
366−
367− e) Declining to grant rights under trademark law for use of some
368− trade names, trademarks, or service marks; or
369−
370− f) Requiring indemnification of licensors and authors of that
371− material by anyone who conveys the material (or modified versions of
372− it) with contractual assumptions of liability to the recipient, for
373− any liability that these contractual assumptions directly impose on
374− those licensors and authors.
375−
376− All other non-permissive additional terms are considered "further
377−restrictions" within the meaning of section 10. If the Program as you
378−received it, or any part of it, contains a notice stating that it is
379−governed by this License along with a term that is a further
380−restriction, you may remove that term. If a license document contains
381−a further restriction but permits relicensing or conveying under this
382−License, you may add to a covered work material governed by the terms
383−of that license document, provided that the further restriction does
384−not survive such relicensing or conveying.
385−
386− If you add terms to a covered work in accord with this section, you
387−must place, in the relevant source files, a statement of the
388−additional terms that apply to those files, or a notice indicating
389−where to find the applicable terms.
390−
391− Additional terms, permissive or non-permissive, may be stated in the
392−form of a separately written license, or stated as exceptions;
393−the above requirements apply either way.
394−
395− 8. Termination.
396−
397− You may not propagate or modify a covered work except as expressly
398−provided under this License. Any attempt otherwise to propagate or
399−modify it is void, and will automatically terminate your rights under
400−this License (including any patent licenses granted under the third
401−paragraph of section 11).
402−
403− However, if you cease all violation of this License, then your
404−license from a particular copyright holder is reinstated (a)
405−provisionally, unless and until the copyright holder explicitly and
406−finally terminates your license, and (b) permanently, if the copyright
407−holder fails to notify you of the violation by some reasonable means
408−prior to 60 days after the cessation.
409−
410− Moreover, your license from a particular copyright holder is
411−reinstated permanently if the copyright holder notifies you of the
412−violation by some reasonable means, this is the first time you have
413−received notice of violation of this License (for any work) from that
414−copyright holder, and you cure the violation prior to 30 days after
415−your receipt of the notice.
416−
417− Termination of your rights under this section does not terminate the
418−licenses of parties who have received copies or rights from you under
419−this License. If your rights have been terminated and not permanently
420−reinstated, you do not qualify to receive new licenses for the same
421−material under section 10.
422−
423− 9. Acceptance Not Required for Having Copies.
424−
425− You are not required to accept this License in order to receive or
426−run a copy of the Program. Ancillary propagation of a covered work
427−occurring solely as a consequence of using peer-to-peer transmission
428−to receive a copy likewise does not require acceptance. However,
429−nothing other than this License grants you permission to propagate or
430−modify any covered work. These actions infringe copyright if you do
431−not accept this License. Therefore, by modifying or propagating a
432−covered work, you indicate your acceptance of this License to do so.
433−
434− 10. Automatic Licensing of Downstream Recipients.
435−
436− Each time you convey a covered work, the recipient automatically
437−receives a license from the original licensors, to run, modify and
438−propagate that work, subject to this License. You are not responsible
439−for enforcing compliance by third parties with this License.
440−
441− An "entity transaction" is a transaction transferring control of an
442−organization, or substantially all assets of one, or subdividing an
443−organization, or merging organizations. If propagation of a covered
444−work results from an entity transaction, each party to that
445−transaction who receives a copy of the work also receives whatever
446−licenses to the work the party's predecessor in interest had or could
447−give under the previous paragraph, plus a right to possession of the
448−Corresponding Source of the work from the predecessor in interest, if
449−the predecessor has it or can get it with reasonable efforts.
450−
451− You may not impose any further restrictions on the exercise of the
452−rights granted or affirmed under this License. For example, you may
453−not impose a license fee, royalty, or other charge for exercise of
454−rights granted under this License, and you may not initiate litigation
455−(including a cross-claim or counterclaim in a lawsuit) alleging that
456−any patent claim is infringed by making, using, selling, offering for
457−sale, or importing the Program or any portion of it.
458−
459− 11. Patents.
460−
461− A "contributor" is a copyright holder who authorizes use under this
462−License of the Program or a work on which the Program is based. The
463−work thus licensed is called the contributor's "contributor version".
464−
465− A contributor's "essential patent claims" are all patent claims
466−owned or controlled by the contributor, whether already acquired or
467−hereafter acquired, that would be infringed by some manner, permitted
468−by this License, of making, using, or selling its contributor version,
469−but do not include claims that would be infringed only as a
470−consequence of further modification of the contributor version. For
471−purposes of this definition, "control" includes the right to grant
472−patent sublicenses in a manner consistent with the requirements of
473−this License.
474−
475− Each contributor grants you a non-exclusive, worldwide, royalty-free
476−patent license under the contributor's essential patent claims, to
477−make, use, sell, offer for sale, import and otherwise run, modify and
478−propagate the contents of its contributor version.
479−
480− In the following three paragraphs, a "patent license" is any express
481−agreement or commitment, however denominated, not to enforce a patent
482−(such as an express permission to practice a patent or covenant not to
483−sue for patent infringement). To "grant" such a patent license to a
484−party means to make such an agreement or commitment not to enforce a
485−patent against the party.
486−
487− If you convey a covered work, knowingly relying on a patent license,
488−and the Corresponding Source of the work is not available for anyone
489−to copy, free of charge and under the terms of this License, through a
490−publicly available network server or other readily accessible means,
491−then you must either (1) cause the Corresponding Source to be so
492−available, or (2) arrange to deprive yourself of the benefit of the
493−patent license for this particular work, or (3) arrange, in a manner
494−consistent with the requirements of this License, to extend the patent
495−license to downstream recipients. "Knowingly relying" means you have
496−actual knowledge that, but for the patent license, your conveying the
497−covered work in a country, or your recipient's use of the covered work
498−in a country, would infringe one or more identifiable patents in that
499−country that you have reason to believe are valid.
500−
501− If, pursuant to or in connection with a single transaction or
502−arrangement, you convey, or propagate by procuring conveyance of, a
503−covered work, and grant a patent license to some of the parties
504−receiving the covered work authorizing them to use, propagate, modify
505−or convey a specific copy of the covered work, then the patent license
506−you grant is automatically extended to all recipients of the covered
507−work and works based on it.
508−
509− A patent license is "discriminatory" if it does not include within
510−the scope of its coverage, prohibits the exercise of, or is
511−conditioned on the non-exercise of one or more of the rights that are
512−specifically granted under this License. You may not convey a covered
513−work if you are a party to an arrangement with a third party that is
514−in the business of distributing software, under which you make payment
515−to the third party based on the extent of your activity of conveying
516−the work, and under which the third party grants, to any of the
517−parties who would receive the covered work from you, a discriminatory
518−patent license (a) in connection with copies of the covered work
519−conveyed by you (or copies made from those copies), or (b) primarily
520−for and in connection with specific products or compilations that
521−contain the covered work, unless you entered into that arrangement,
522−or that patent license was granted, prior to 28 March 2007.
523−
524− Nothing in this License shall be construed as excluding or limiting
525−any implied license or other defenses to infringement that may
526−otherwise be available to you under applicable patent law.
527−
528− 12. No Surrender of Others' Freedom.
529−
530− If conditions are imposed on you (whether by court order, agreement or
531−otherwise) that contradict the conditions of this License, they do not
532−excuse you from the conditions of this License. If you cannot convey a
533−covered work so as to satisfy simultaneously your obligations under this
534−License and any other pertinent obligations, then as a consequence you may
535−not convey it at all. For example, if you agree to terms that obligate you
536−to collect a royalty for further conveying from those to whom you convey
537−the Program, the only way you could satisfy both those terms and this
538−License would be to refrain entirely from conveying the Program.
539−
540− 13. Remote Network Interaction; Use with the GNU General Public License.
541−
542− Notwithstanding any other provision of this License, if you modify the
543−Program, your modified version must prominently offer all users
544−interacting with it remotely through a computer network (if your version
545−supports such interaction) an opportunity to receive the Corresponding
546−Source of your version by providing access to the Corresponding Source
547−from a network server at no charge, through some standard or customary
548−means of facilitating copying of software. This Corresponding Source
549−shall include the Corresponding Source for any work covered by version 3
550−of the GNU General Public License that is incorporated pursuant to the
551−following paragraph.
552−
553− Notwithstanding any other provision of this License, you have
554−permission to link or combine any covered work with a work licensed
555−under version 3 of the GNU General Public License into a single
556−combined work, and to convey the resulting work. The terms of this
557−License will continue to apply to the part which is the covered work,
558−but the work with which it is combined will remain governed by version
559−3 of the GNU General Public License.
560−
561− 14. Revised Versions of this License.
562−
563− The Free Software Foundation may publish revised and/or new versions of
564−the GNU Affero General Public License from time to time. Such new versions
565−will be similar in spirit to the present version, but may differ in detail to
566−address new problems or concerns.
567−
568− Each version is given a distinguishing version number. If the
569−Program specifies that a certain numbered version of the GNU Affero General
570−Public License "or any later version" applies to it, you have the
571−option of following the terms and conditions either of that numbered
572−version or of any later version published by the Free Software
573−Foundation. If the Program does not specify a version number of the
574−GNU Affero General Public License, you may choose any version ever published
575−by the Free Software Foundation.
576−
577− If the Program specifies that a proxy can decide which future
578−versions of the GNU Affero General Public License can be used, that proxy's
579−public statement of acceptance of a version permanently authorizes you
580−to choose that version for the Program.
581−
582− Later license versions may give you additional or different
583−permissions. However, no additional obligations are imposed on any
584−author or copyright holder as a result of your choosing to follow a
585−later version.
586−
587− 15. Disclaimer of Warranty.
588−
589− THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
590−APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
591−HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
592−OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
593−THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
594−PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
595−IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
596−ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
597−
598− 16. Limitation of Liability.
599−
600− IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
601−WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
602−THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
603−GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
604−USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
605−DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
606−PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
607−EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
608−SUCH DAMAGES.
609−
610− 17. Interpretation of Sections 15 and 16.
611−
612− If the disclaimer of warranty and limitation of liability provided
613−above cannot be given local legal effect according to their terms,
614−reviewing courts shall apply local law that most closely approximates
615−an absolute waiver of all civil liability in connection with the
616−Program, unless a warranty or assumption of liability accompanies a
617−copy of the Program in return for a fee.
618−
619− END OF TERMS AND CONDITIONS
620−
621− How to Apply These Terms to Your New Programs
622−
623− If you develop a new program, and you want it to be of the greatest
624−possible use to the public, the best way to achieve this is to make it
625−free software which everyone can redistribute and change under these terms.
626−
627− To do so, attach the following notices to the program. It is safest
628−to attach them to the start of each source file to most effectively
629−state the exclusion of warranty; and each file should have at least
630−the "copyright" line and a pointer to where the full notice is found.
631−
632− <one line to give the program's name and a brief idea of what it does.>
633− Copyright (C) <year> <name of author>
634−
635− This program is free software: you can redistribute it and/or modify
636− it under the terms of the GNU Affero General Public License as published by
637− the Free Software Foundation, either version 3 of the License, or
638− (at your option) any later version.
639−
640− This program is distributed in the hope that it will be useful,
641− but WITHOUT ANY WARRANTY; without even the implied warranty of
642− MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
643− GNU Affero General Public License for more details.
644−
645− You should have received a copy of the GNU Affero General Public License
646− along with this program. If not, see <http://www.gnu.org/licenses/>.
647−
648−Also add information on how to contact you by electronic and paper mail.
649−
650− If your software can interact with users remotely through a computer
651−network, you should also make sure that it provides a way for users to
652−get its source. For example, if your program is a web application, its
653−interface could display a "Source" link that leads users to an archive
654−of the code. There are many ways you could offer source, and different
655−solutions will be better for different programs; see section 13 for the
656−specific requirements.
657−
658− You should also get your employer (if you work as a programmer) or school,
659−if any, to sign a "copyright disclaimer" for the program, if necessary.
660−For more information on this, and how to apply and follow the GNU AGPL, see
661−<http://www.gnu.org/licenses/>.
Makefiledeleted−107
@@ -1,107 +0,0 @@
1−# -*- coding: utf-8; mode: makefile-gmake -*-
2−# SPDX-License-Identifier: AGPL-3.0-or-later
3−
4−.DEFAULT_GOAL=help
5−export MTOOLS=./manage
6−
7−include utils/makefile.include
8−
9−all: clean install
10−
11−PHONY += help
12−
13−help:
14− @./manage --help
15− @echo '----'
16− @echo 'run - run developer instance'
17− @echo 'install - developer install of searx into virtualenv'
18− @echo 'uninstall - uninstall developer installation'
19− @echo 'clean - clean up working tree'
20− @echo 'search.checker - check search engines'
21− @echo 'test - run shell & CI tests'
22− @echo 'test.sh - test shell scripts'
23− @echo 'ci.test - run CI tests'
24−
25−
26−PHONY += run
27−run: install
28− $(Q) ( \
29− sleep 2 ; \
30− xdg-open http://127.0.0.1:8888/ ; \
31− ) &
32− SEARX_DEBUG=1 ./manage pyenv.cmd python ./searx/webapp.py
33−
34−PHONY += install uninstall
35−install uninstall:
36− $(Q)./manage pyenv.$@
37−
38−PHONY += clean
39−clean: py.clean docs.clean node.clean test.clean
40− $(Q)./manage build_msg CLEAN "common files"
41− $(Q)find . -name '*.orig' -exec rm -f {} +
42− $(Q)find . -name '*.rej' -exec rm -f {} +
43− $(Q)find . -name '*~' -exec rm -f {} +
44− $(Q)find . -name '*.bak' -exec rm -f {} +
45−
46−PHONY += search.checker search.checker.%
47−search.checker: install
48− $(Q)./manage pyenv.cmd searx-checker -v
49−
50−search.checker.%: install
51− $(Q)./manage pyenv.cmd searx-checker -v "$(subst _, ,$(patsubst search.checker.%,%,$@))"
52−
53−PHONY += ci.test test test.sh
54−ci.test: test.pep8 test.pylint test.unit test.robot
55−test: ci.test
56−test.sh:
57− $(Q)shellcheck -x -s bash \
58− utils/brand.env \
59− ./manage \
60− utils/lib.sh \
61− utils/filtron.sh \
62− utils/searx.sh \
63− utils/morty.sh \
64− utils/lxc.sh \
65− utils/lxc-searx.env \
66− .config.sh
67− $(Q)./manage build_msg TEST "$@ OK"
68−
69−
70−# wrap ./manage script
71−
72−MANAGE += buildenv
73−MANAGE += babel.compile
74−MANAGE += data.all data.languages data.useragents
75−MANAGE += docs.html docs.live docs.gh-pages docs.prebuild docs.clean
76−MANAGE += docker.build docker.push
77−MANAGE += gecko.driver
78−MANAGE += node.env node.clean
79−MANAGE += py.build py.clean
80−MANAGE += pyenv pyenv.install pyenv.uninstall
81−MANAGE += pypi.upload pypi.upload.test
82−MANAGE += test.pylint test.pep8 test.unit test.coverage test.robot test.clean
83−MANAGE += themes.all themes.oscar themes.simple themes.bootstrap
84−
85−PHONY += $(MANAGE)
86−
87−$(MANAGE):
88− $(Q)$(MTOOLS) $@
89−
90−# deprecated
91−
92−PHONY += docs docs-clean docs-live docker themes
93−
94−docs: docs.html
95− $(Q)./manage build_msg WARN $@ is deprecated use docs.html
96−
97−docs-clean: docs.clean
98− $(Q)./manage build_msg WARN $@ is deprecated use docs.clean
99−
100−docs-live: docs.live
101− $(Q)./manage build_msg WARN $@ is deprecated use docs.live
102−
103−docker: docker.build
104− $(Q)./manage build_msg WARN $@ is deprecated use docker.build
105−
106−themes: themes.all
107− $(Q)./manage build_msg WARN $@ is deprecated use themes.all
PULL_REQUEST_TEMPLATE.mddeleted−25
@@ -1,25 +0,0 @@
1−## What does this PR do?
2−
3−<!-- MANDATORY -->
4−
5−<!-- explain the changes in your PR, algorithms, design, architecture -->
6−
7−## Why is this change important?
8−
9−<!-- MANDATORY -->
10−
11−<!-- explain the motivation behind your PR -->
12−
13−## How to test this PR locally?
14−
15−<!-- commands to run the tests or instructions to test the changes-->
16−
17−## Author's checklist
18−
19−<!-- additional notes for reviewiers -->
20−
21−## Related issues
22−
23−<!--
24−Closes #234
25−-->
README.rstdeleted−73
@@ -1,73 +0,0 @@
1−.. SPDX-License-Identifier: AGPL-3.0-or-later
2−
3−.. figure:: https://raw.githubusercontent.com/searx/searx/master/searx/static/themes/oscar/img/logo_searx_a.png
4− :target: https://searx.github.io/searx/
5− :alt: searX
6− :width: 100%
7− :align: center
8−
9−-------
10−
11−|searx install|
12−|searx homepage|
13−|searx wiki|
14−|AGPL License|
15−|Issues|
16−|commits|
17−|OpenCollective searx backers|
18−|OpenCollective searx sponsors|
19−
20−Privacy-respecting, hackable `metasearch engine`_ / *pronunciation* **sɜːks**.
21−
22−.. _metasearch engine: https://en.wikipedia.org/wiki/Metasearch_engine
23−
24−.. |searx install| image:: https://img.shields.io/badge/-install-blue
25− :target: https://searx.github.io/searx/admin/installation.html
26−
27−.. |searx homepage| image:: https://img.shields.io/badge/-homepage-blue
28− :target: https://searx.github.io/searx
29−
30−.. |searx wiki| image:: https://img.shields.io/badge/-wiki-blue
31− :target: https://github.com/searx/searx/wiki
32−
33−.. |AGPL License| image:: https://img.shields.io/badge/license-AGPL-blue.svg
34− :target: https://github.com/searx/searx/blob/master/LICENSE
35−
36−.. |Issues| image:: https://img.shields.io/github/issues/searx/searx?color=yellow&label=issues
37− :target: https://github.com/searx/searx/issues
38−
39−.. |PR| image:: https://img.shields.io/github/issues-pr-raw/searx/searx?color=yellow&label=PR
40− :target: https://github.com/searx/searx/pulls
41−
42−.. |commits| image:: https://img.shields.io/github/commit-activity/y/searx/searx?color=yellow&label=commits
43− :target: https://github.com/searx/searx/commits/master
44−
45−.. |OpenCollective searx backers| image:: https://opencollective.com/searx/backers/badge.svg
46− :target: https://opencollective.com/searx#backer
47−
48−.. |OpenCollective searx sponsors| image:: https://opencollective.com/searx/sponsors/badge.svg
49− :target: https://opencollective.com/searx#sponsor
50−
51−
52−If you are looking for running instances, ready to use, then visit searx.space_.
53−
54−Otherwise jump to the user_, admin_ and developer_ handbooks you will find on
55−our homepage_.
56−
57−.. _searx.space: https://searx.space
58−.. _user: https://searx.github.io/searx/user
59−.. _admin: https://searx.github.io/searx/admin
60−.. _developer: https://searx.github.io/searx/dev
61−.. _homepage: https://searx.github.io/searx
62−
63−contact:
64− openhub_ // twitter_ // IRC: #searx @ Libera (irc.libera.chat)
65−
66−.. _openhub: https://www.openhub.net/p/searx
67−.. _twitter: https://twitter.com/Searx_engine
68−
69−-------
70−
71−|gluten free|
72−
73−.. |gluten free| image:: https://forthebadge.com/images/featured/featured-gluten-free.svg
docs/dev/reST.rst → _downloads/ad0ebe55d6b53b1559e0ca8dee6f30b9/reST.rstrenamed+26−35
@@ -15,8 +15,8 @@ generated and deployed at :docs:`github.io <.>`. For build prerequisites read
1515:ref:`docs build`.
1616
1717The source files of Searx's documentation are located at :origin:`docs`. Sphinx
18−assumes source files to be encoded in UTF-8 by defaul. Run :ref:`make docs.live
19−<make docs.live>` to build HTML while editing.
18+assumes source files to be encoded in UTF-8 by defaul. Run :ref:`make docs-live
19+<make docs-live>` to build HTML while editing.
2020
2121.. sidebar:: Further reading
2222
@@ -319,18 +319,14 @@ To list all anchors of the inventory (e.g. ``python``) use:
319319.. code:: sh
320320
321321 $ python -m sphinx.ext.intersphinx https://docs.python.org/3/objects.inv
322− ...
323− $ python -m sphinx.ext.intersphinx https://searx.github.io/searx/objects.inv
324− ...
325322
326323Literal blocks
327324==============
328325
329326The simplest form of :duref:`literal-blocks` is a indented block introduced by
330327two colons (``::``). For highlighting use :dudir:`highlight` or :ref:`reST
331−code` directive. To include literals from external files use
332−:rst:dir:`literalinclude` or :ref:`kernel-include <kernel-include-directive>`
333−directive (latter one expands environment variables in the path name).
328+code` directive. To include literals from external files use directive
329+:rst:dir:`literalinclude`.
334330
335331.. _reST literal:
336332
@@ -1276,33 +1272,28 @@ Templating
12761272
12771273.. sidebar:: Build environment
12781274
1279− All *generic-doc* tasks are running in the :ref:`make install`.
1275+ All *generic-doc* tasks are running in the :ref:`build environment <make
1276+ pyenv>`.
12801277
12811278Templating is suitable for documentation which is created generic at the build
1282−time. The sphinx-jinja_ extension evaluates jinja_ templates in the :ref:`make
1283−install` (with searx modules installed). We use this e.g. to build chapter:
1284−:ref:`engines generic`. Below the jinja directive from the
1279+time. The sphinx-jinja_ extension evaluates jinja_ templates in the :ref:`build
1280+environment <make pyenv>` (with searx modules installed). We use this e.g. to
1281+build chapter: :ref:`engines generic`. Below the jinja directive from the
12851282:origin:`docs/admin/engines.rst` is shown:
12861283
12871284.. literalinclude:: ../admin/engines.rst
12881285 :language: reST
12891286 :start-after: .. _configured engines:
12901287
1291−The context for the template is selected in the line ``.. jinja:: searx``. In
1292−sphinx's build configuration (:origin:`docs/conf.py`) the ``searx`` context
1293−contains the ``engines`` and ``plugins``.
1288+The context for the template is selected in the line ``.. jinja:: webapp``. In
1289+sphinx's build configuration (:origin:`docs/conf.py`) the ``webapp`` context
1290+points to the name space of the python module: ``webapp``.
12941291
12951292.. code:: py
12961293
1297− import searx.search
1298− import searx.engines
1299− import searx.plugins
1300− searx.search.initialize()
1294+ from searx import webapp
13011295 jinja_contexts = {
1302− 'searx': {
1303− 'engines': searx.engines.engines,
1304− 'plugins': searx.plugins.plugins
1305− },
1296+ 'webapp': dict(**webapp.__dict__)
13061297 }
13071298
13081299
@@ -1399,27 +1390,27 @@ The next example shows the difference of ``\tfrac`` (*textstyle*) and ``\dfrac``
13991390
14001391.. _readability: https://docs.python-guide.org/writing/style/
14011392.. _Sphinx-Primer:
1402− https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html
1393+ http://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html
14031394.. _reST: https://docutils.sourceforge.io/rst.html
14041395.. _Sphinx Roles:
14051396 https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html
1406−.. _Sphinx: https://www.sphinx-doc.org
1407−.. _`sphinx-doc FAQ`: https://www.sphinx-doc.org/en/stable/faq.html
1397+.. _Sphinx: http://www.sphinx-doc.org
1398+.. _`sphinx-doc FAQ`: http://www.sphinx-doc.org/en/stable/faq.html
14081399.. _Sphinx markup constructs:
1409− https://www.sphinx-doc.org/en/stable/markup/index.html
1400+ http://www.sphinx-doc.org/en/stable/markup/index.html
14101401.. _`sphinx cross references`:
1411− https://www.sphinx-doc.org/en/stable/markup/inline.html#cross-referencing-arbitrary-locations
1402+ http://www.sphinx-doc.org/en/stable/markup/inline.html#cross-referencing-arbitrary-locations
14121403.. _sphinx.ext.extlinks:
14131404 https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html
1414−.. _intersphinx: https://www.sphinx-doc.org/en/stable/ext/intersphinx.html
1415−.. _sphinx config: https://www.sphinx-doc.org/en/stable/config.html
1416−.. _Sphinx's autodoc: https://www.sphinx-doc.org/en/stable/ext/autodoc.html
1405+.. _intersphinx: http://www.sphinx-doc.org/en/stable/ext/intersphinx.html
1406+.. _sphinx config: http://www.sphinx-doc.org/en/stable/config.html
1407+.. _Sphinx's autodoc: http://www.sphinx-doc.org/en/stable/ext/autodoc.html
14171408.. _Sphinx's Python domain:
1418− https://www.sphinx-doc.org/en/stable/domains.html#the-python-domain
1409+ http://www.sphinx-doc.org/en/stable/domains.html#the-python-domain
14191410.. _Sphinx's C domain:
1420− https://www.sphinx-doc.org/en/stable/domains.html#cross-referencing-c-constructs
1411+ http://www.sphinx-doc.org/en/stable/domains.html#cross-referencing-c-constructs
14211412.. _doctree:
1422− https://www.sphinx-doc.org/en/master/extdev/tutorial.html?highlight=doctree#build-phases
1413+ http://www.sphinx-doc.org/en/master/extdev/tutorial.html?highlight=doctree#build-phases
14231414.. _docutils: http://docutils.sourceforge.net/docs/index.html
14241415.. _docutils FAQ: http://docutils.sourceforge.net/FAQ.html
14251416.. _linuxdoc: https://return42.github.io/linuxdoc
@@ -1432,5 +1423,5 @@ The next example shows the difference of ``\tfrac`` (*textstyle*) and ``\dfrac``
14321423.. _ImageMagick: https://www.imagemagick.org
14331424
14341425.. _`Emacs Table Mode`: https://www.emacswiki.org/emacs/TableMode
1435−.. _`Online Tables Generator`: https://www.tablesgenerator.com/text_tables
1426+.. _`Online Tables Generator`: http://www.tablesgenerator.com/text_tables
14361427.. _`OASIS XML Exchange Table Model`: https://www.oasis-open.org/specs/tm9901.html
_images/DOT-57a4a7f78690d0b6b884bc59f36e84cfb0b61f76.dotnew file+3
@@ -0,0 +1,3 @@
1+digraph foo {
2+ "bar" -> "baz";
3+}
_images/DOT-57a4a7f78690d0b6b884bc59f36e84cfb0b61f76.svgnew file+31
@@ -0,0 +1,31 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
3+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
5+ -->
6+<!-- Title: foo Pages: 1 -->
7+<svg width="62pt" height="116pt"
8+ viewBox="0.00 0.00 62.00 116.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 112)">
10+<title>foo</title>
11+<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-112 58,-112 58,4 -4,4"/>
12+<!-- bar -->
13+<g id="node1" class="node">
14+<title>bar</title>
15+<ellipse fill="none" stroke="#000000" cx="27" cy="-90" rx="27" ry="18"/>
16+<text text-anchor="middle" x="27" y="-86.3" font-family="Times,serif" font-size="14.00" fill="#000000">bar</text>
17+</g>
18+<!-- baz -->
19+<g id="node2" class="node">
20+<title>baz</title>
21+<ellipse fill="none" stroke="#000000" cx="27" cy="-18" rx="27" ry="18"/>
22+<text text-anchor="middle" x="27" y="-14.3" font-family="Times,serif" font-size="14.00" fill="#000000">baz</text>
23+</g>
24+<!-- bar&#45;&gt;baz -->
25+<g id="edge1" class="edge">
26+<title>bar&#45;&gt;baz</title>
27+<path fill="none" stroke="#000000" d="M27,-71.8314C27,-64.131 27,-54.9743 27,-46.4166"/>
28+<polygon fill="#000000" stroke="#000000" points="30.5001,-46.4132 27,-36.4133 23.5001,-46.4133 30.5001,-46.4132"/>
29+</g>
30+</g>
31+</svg>
_images/SVG-1fb7029fa2cc454a267bae271cccb2c591387416.svgnew file+13
@@ -0,0 +1,13 @@
1+<?xml version="1.0" encoding="UTF-8"?>
2+<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
3+ baseProfile="full" width="70px" height="40px"
4+ viewBox="0 0 700 400"
5+ >
6+ <line x1="180" y1="370"
7+ x2="500" y2="50"
8+ stroke="black" stroke-width="15px"
9+ />
10+ <polygon points="585 0 525 25 585 50"
11+ transform="rotate(135 525 25)"
12+ />
13+</svg>
docs/admin/arch_public.dot → _images/arch_public.dotrenamed+4−4
@@ -4,11 +4,11 @@ digraph G {
44 edge [fontname="Sans"];
55
66 browser [label="Browser", shape=Mdiamond];
7− rp [label="Reverse Proxy", href="https://searx.github.io/searx/utils/filtron.sh.html#public-reverse-proxy"];
8− filtron [label="Filtron", href="https://searx.github.io/searx/utils/filtron.sh.html"];
9− morty [label="Morty", href="https://searx.github.io/searx/utils/morty.sh.html"];
7+ rp [label="Reverse Proxy", href="https://asciimoo.github.io/searx/utils/filtron.sh.html#public-reverse-proxy"];
8+ filtron [label="Filtron", href="https://asciimoo.github.io/searx/utils/filtron.sh.html"];
9+ morty [label="Morty", href="https://asciimoo.github.io/searx/utils/morty.sh.html"];
1010 static [label="Static files", href="url to configure static files"];
11− uwsgi [label="uwsgi", href="https://searx.github.io/searx/utils/searx.sh.html"]
11+ uwsgi [label="uwsgi", href="https://asciimoo.github.io/searx/utils/searx.sh.html"]
1212 searx1 [label="Searx #1"];
1313 searx2 [label="Searx #2"];
1414 searx3 [label="Searx #3"];
_images/arch_public.svgnew file+156
@@ -0,0 +1,156 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
3+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
5+ -->
6+<!-- Title: G Pages: 1 -->
7+<svg width="618pt" height="529pt"
8+ viewBox="0.00 0.00 618.00 529.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 525)">
10+<title>G</title>
11+<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-525 614,-525 614,4 -4,4"/>
12+<g id="clust1" class="cluster">
13+<title>cluster_searx</title>
14+<polygon fill="#fafafa" stroke="#000000" points="8,-8 8,-444 602,-444 602,-8 8,-8"/>
15+<text text-anchor="middle" x="305" y="-428.8" font-family="Sans" font-size="14.00" fill="#000000">Searx instance</text>
16+</g>
17+<!-- browser -->
18+<g id="node1" class="node">
19+<title>browser</title>
20+<polygon fill="#ffffcc" stroke="#000000" points="75,-521 5.2878,-503 75,-485 144.7122,-503 75,-521"/>
21+<polyline fill="none" stroke="#000000" points="16.9067,-506.0001 16.9067,-499.9999 "/>
22+<polyline fill="none" stroke="#000000" points="63.3811,-488.0001 86.6189,-488.0001 "/>
23+<polyline fill="none" stroke="#000000" points="133.0933,-499.9999 133.0933,-506.0001 "/>
24+<polyline fill="none" stroke="#000000" points="86.6189,-517.9999 63.3811,-517.9999 "/>
25+<text text-anchor="middle" x="75" y="-499.3" font-family="Sans" font-size="14.00" fill="#000000">Browser</text>
26+</g>
27+<!-- rp -->
28+<g id="node2" class="node">
29+<title>rp</title>
30+<g id="a_node2"><a xlink:href="https://asciimoo.github.io/searx/utils/filtron.sh.html#public-reverse-proxy" xlink:title="Reverse Proxy">
31+<polygon fill="#ffffcc" stroke="#000000" points="134,-413 16,-413 16,-377 134,-377 134,-413"/>
32+<text text-anchor="middle" x="75" y="-391.3" font-family="Sans" font-size="14.00" fill="#000000">Reverse Proxy</text>
33+</a>
34+</g>
35+</g>
36+<!-- browser&#45;&gt;rp -->
37+<g id="edge1" class="edge">
38+<title>browser&#45;&gt;rp</title>
39+<path fill="none" stroke="#000000" d="M75,-484.6793C75,-467.821 75,-442.5651 75,-423.147"/>
40+<polygon fill="#000000" stroke="#000000" points="78.5001,-423.0501 75,-413.0502 71.5001,-423.0502 78.5001,-423.0501"/>
41+<text text-anchor="middle" x="98" y="-455.8" font-family="Sans" font-size="14.00" fill="#000000">HTTPS</text>
42+</g>
43+<!-- filtron -->
44+<g id="node3" class="node">
45+<title>filtron</title>
46+<g id="a_node3"><a xlink:href="https://asciimoo.github.io/searx/utils/filtron.sh.html" xlink:title="Filtron">
47+<polygon fill="#ffffcc" stroke="#000000" points="105.5,-288 44.5,-288 44.5,-252 105.5,-252 105.5,-288"/>
48+<text text-anchor="middle" x="75" y="-266.3" font-family="Sans" font-size="14.00" fill="#000000">Filtron</text>
49+</a>
50+</g>
51+</g>
52+<!-- rp&#45;&gt;filtron -->
53+<g id="edge4" class="edge">
54+<title>rp&#45;&gt;filtron</title>
55+<path fill="none" stroke="#000000" d="M75,-376.8239C75,-356.2723 75,-322.5472 75,-298.4893"/>
56+<polygon fill="#000000" stroke="#000000" points="78.5001,-298.198 75,-288.198 71.5001,-298.198 78.5001,-298.198"/>
57+<text text-anchor="middle" x="93.5" y="-328.8" font-family="Sans" font-size="14.00" fill="#000000">HTTP</text>
58+</g>
59+<!-- morty -->
60+<g id="node4" class="node">
61+<title>morty</title>
62+<g id="a_node4"><a xlink:href="https://asciimoo.github.io/searx/utils/morty.sh.html" xlink:title="Morty">
63+<polygon fill="#ffffcc" stroke="#000000" points="180.5,-288 123.5,-288 123.5,-252 180.5,-252 180.5,-288"/>
64+<text text-anchor="middle" x="152" y="-266.3" font-family="Sans" font-size="14.00" fill="#000000">Morty</text>
65+</a>
66+</g>
67+</g>
68+<!-- rp&#45;&gt;morty -->
69+<g id="edge2" class="edge">
70+<title>rp&#45;&gt;morty</title>
71+<path fill="none" stroke="#000000" d="M89.8355,-376.705C98.0006,-366.2543 108.0569,-352.7317 116,-340 124.4983,-326.3785 132.7784,-310.5167 139.2508,-297.3397"/>
72+<polygon fill="#000000" stroke="#000000" points="142.4243,-298.8167 143.6215,-288.2897 136.1209,-295.7724 142.4243,-298.8167"/>
73+<text text-anchor="middle" x="268" y="-328.8" font-family="Sans" font-size="14.00" fill="#000000">optional: images and HTML pages proxy</text>
74+</g>
75+<!-- static -->
76+<g id="node5" class="node">
77+<title>static</title>
78+<g id="a_node5"><a xlink:href="url to configure static files" xlink:title="Static files">
79+<polygon fill="#ffffcc" stroke="#000000" points="594,-413 504,-413 504,-377 594,-377 594,-413"/>
80+<text text-anchor="middle" x="549" y="-391.3" font-family="Sans" font-size="14.00" fill="#000000">Static files</text>
81+</a>
82+</g>
83+</g>
84+<!-- rp&#45;&gt;static -->
85+<g id="edge3" class="edge">
86+<title>rp&#45;&gt;static</title>
87+<path fill="none" stroke="#000000" d="M134.074,-395C226.433,-395 403.7479,-395 493.718,-395"/>
88+<polygon fill="#000000" stroke="#000000" points="493.7212,-398.5001 503.7212,-395 493.7211,-391.5001 493.7212,-398.5001"/>
89+<text text-anchor="middle" x="319" y="-401.8" font-family="Sans" font-size="14.00" fill="#000000">optional: reverse proxy serves directly static files</text>
90+</g>
91+<!-- uwsgi -->
92+<g id="node6" class="node">
93+<title>uwsgi</title>
94+<g id="a_node6"><a xlink:href="https://asciimoo.github.io/searx/utils/searx.sh.html" xlink:title="uwsgi">
95+<polygon fill="#ffffcc" stroke="#000000" points="188,-163 130,-163 130,-127 188,-127 188,-163"/>
96+<text text-anchor="middle" x="159" y="-141.3" font-family="Sans" font-size="14.00" fill="#000000">uwsgi</text>
97+</a>
98+</g>
99+</g>
100+<!-- filtron&#45;&gt;uwsgi -->
101+<g id="edge5" class="edge">
102+<title>filtron&#45;&gt;uwsgi</title>
103+<path fill="none" stroke="#000000" d="M87.2143,-251.8239C101.3983,-230.7169 124.9198,-195.7146 141.1515,-171.5603"/>
104+<polygon fill="#000000" stroke="#000000" points="144.0983,-173.4502 146.7709,-163.198 138.2883,-169.5459 144.0983,-173.4502"/>
105+<text text-anchor="middle" x="139.5" y="-203.8" font-family="Sans" font-size="14.00" fill="#000000">HTTP</text>
106+</g>
107+<!-- searx1 -->
108+<g id="node7" class="node">
109+<title>searx1</title>
110+<polygon fill="#ffffcc" stroke="#000000" points="99.5,-52 16.5,-52 16.5,-16 99.5,-16 99.5,-52"/>
111+<text text-anchor="middle" x="58" y="-30.3" font-family="Sans" font-size="14.00" fill="#000000">Searx #1</text>
112+</g>
113+<!-- uwsgi&#45;&gt;searx1 -->
114+<g id="edge6" class="edge">
115+<title>uwsgi&#45;&gt;searx1</title>
116+<path fill="none" stroke="#000000" d="M142.3219,-126.6706C125.7281,-108.4339 100.1175,-80.2876 81.4738,-59.7979"/>
117+<polygon fill="#000000" stroke="#000000" points="84.0217,-57.3975 74.7029,-52.3566 78.8442,-62.1086 84.0217,-57.3975"/>
118+</g>
119+<!-- searx2 -->
120+<g id="node8" class="node">
121+<title>searx2</title>
122+<polygon fill="#ffffcc" stroke="#000000" points="200.5,-52 117.5,-52 117.5,-16 200.5,-16 200.5,-52"/>
123+<text text-anchor="middle" x="159" y="-30.3" font-family="Sans" font-size="14.00" fill="#000000">Searx #2</text>
124+</g>
125+<!-- uwsgi&#45;&gt;searx2 -->
126+<g id="edge7" class="edge">
127+<title>uwsgi&#45;&gt;searx2</title>
128+<path fill="none" stroke="#000000" d="M159,-126.6706C159,-109.2373 159,-82.7482 159,-62.5489"/>
129+<polygon fill="#000000" stroke="#000000" points="162.5001,-62.3566 159,-52.3566 155.5001,-62.3567 162.5001,-62.3566"/>
130+</g>
131+<!-- searx3 -->
132+<g id="node9" class="node">
133+<title>searx3</title>
134+<polygon fill="#ffffcc" stroke="#000000" points="301.5,-52 218.5,-52 218.5,-16 301.5,-16 301.5,-52"/>
135+<text text-anchor="middle" x="260" y="-30.3" font-family="Sans" font-size="14.00" fill="#000000">Searx #3</text>
136+</g>
137+<!-- uwsgi&#45;&gt;searx3 -->
138+<g id="edge8" class="edge">
139+<title>uwsgi&#45;&gt;searx3</title>
140+<path fill="none" stroke="#000000" d="M175.6781,-126.6706C192.2719,-108.4339 217.8825,-80.2876 236.5262,-59.7979"/>
141+<polygon fill="#000000" stroke="#000000" points="239.1558,-62.1086 243.2971,-52.3566 233.9783,-57.3975 239.1558,-62.1086"/>
142+</g>
143+<!-- searx4 -->
144+<g id="node10" class="node">
145+<title>searx4</title>
146+<polygon fill="#ffffcc" stroke="#000000" points="402.5,-52 319.5,-52 319.5,-16 402.5,-16 402.5,-52"/>
147+<text text-anchor="middle" x="361" y="-30.3" font-family="Sans" font-size="14.00" fill="#000000">Searx #4</text>
148+</g>
149+<!-- uwsgi&#45;&gt;searx4 -->
150+<g id="edge9" class="edge">
151+<title>uwsgi&#45;&gt;searx4</title>
152+<path fill="none" stroke="#000000" d="M188.3725,-128.8596C222.8149,-109.9334 280.1532,-78.4257 319.2181,-56.9594"/>
153+<polygon fill="#000000" stroke="#000000" points="321.1614,-59.8852 328.2399,-52.0018 317.7903,-53.7504 321.1614,-59.8852"/>
154+</g>
155+</g>
156+</svg>
docs/dev/hello.dot → _images/hello.dotrenamed

The content is the same.

_images/hello.svgnew file+30
@@ -0,0 +1,30 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
3+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
5+ -->
6+<!-- Title: G Pages: 1 -->
7+<svg width="76pt" height="116pt"
8+ viewBox="0.00 0.00 75.59 116.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 112)">
10+<title>G</title>
11+<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-112 71.594,-112 71.594,4 -4,4"/>
12+<!-- Hello -->
13+<g id="node1" class="node">
14+<title>Hello</title>
15+<ellipse fill="none" stroke="#000000" cx="33.797" cy="-90" rx="30.5947" ry="18"/>
16+<text text-anchor="middle" x="33.797" y="-86.3" font-family="Times,serif" font-size="14.00" fill="#000000">Hello</text>
17+</g>
18+<!-- World -->
19+<g id="node2" class="node">
20+<title>World</title>
21+<ellipse fill="none" stroke="#000000" cx="33.797" cy="-18" rx="33.5952" ry="18"/>
22+<text text-anchor="middle" x="33.797" y="-14.3" font-family="Times,serif" font-size="14.00" fill="#000000">World</text>
23+</g>
24+<!-- Hello&#45;&#45;World -->
25+<g id="edge1" class="edge">
26+<title>Hello&#45;&#45;World</title>
27+<path fill="none" stroke="#000000" d="M33.797,-71.8314C33.797,-61 33.797,-47.2876 33.797,-36.4133"/>
28+</g>
29+</g>
30+</svg>
_images/math/07c9ff4251510b06013159f4e45ec9ab97044096.svgnew file+25
@@ -0,0 +1,25 @@
1+<?xml version='1.0' encoding='UTF-8'?>
2+<!-- This file was generated by dvisvgm 2.6.3 -->
3+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='36.523255pt' height='48.422712pt' viewBox='57.608781 53.798251 36.523255 48.422712'>
4+<defs>
5+<path id='g0-0' d='M9.191532 -3.20797C9.428643 -3.20797 9.679701 -3.20797 9.679701 -3.486924S9.428643 -3.765878 9.191532 -3.765878H1.645828C1.408717 -3.765878 1.157659 -3.765878 1.157659 -3.486924S1.408717 -3.20797 1.645828 -3.20797H9.191532Z'/>
6+<path id='g2-43' d='M5.565131 -3.221918H9.414695C9.609963 -3.221918 9.861021 -3.221918 9.861021 -3.472976C9.861021 -3.737983 9.62391 -3.737983 9.414695 -3.737983H5.565131V-7.587547C5.565131 -7.782814 5.565131 -8.033873 5.314072 -8.033873C5.049066 -8.033873 5.049066 -7.796762 5.049066 -7.587547V-3.737983H1.199502C1.004234 -3.737983 0.753176 -3.737983 0.753176 -3.486924C0.753176 -3.221918 0.990286 -3.221918 1.199502 -3.221918H5.049066V0.627646C5.049066 0.822914 5.049066 1.073973 5.300125 1.073973C5.565131 1.073973 5.565131 0.836862 5.565131 0.627646V-3.221918Z'/>
7+<path id='g2-49' d='M4.016936 -8.940473C4.016936 -9.26127 4.016936 -9.275218 3.737983 -9.275218C3.403238 -8.89863 2.705853 -8.382565 1.26924 -8.382565V-7.978082C1.590037 -7.978082 2.287422 -7.978082 3.054545 -8.340722V-1.073973C3.054545 -0.571856 3.012702 -0.404483 1.785305 -0.404483H1.352927V0C1.729514 -0.027895 3.082441 -0.027895 3.542715 -0.027895S5.341968 -0.027895 5.718555 0V-0.404483H5.286177C4.05878 -0.404483 4.016936 -0.571856 4.016936 -1.073973V-8.940473Z'/>
8+<path id='g1-120' d='M6.611208 -5.69066C6.164882 -5.606974 5.997509 -5.272229 5.997509 -5.007223C5.997509 -4.672478 6.262516 -4.560897 6.457783 -4.560897C6.876214 -4.560897 7.169116 -4.923537 7.169116 -5.300125C7.169116 -5.885928 6.499626 -6.150934 5.913823 -6.150934C5.063014 -6.150934 4.588792 -5.314072 4.463263 -5.049066C4.142466 -6.095143 3.277709 -6.150934 3.02665 -6.150934C1.603985 -6.150934 0.850809 -4.323786 0.850809 -4.016936C0.850809 -3.961146 0.9066 -3.891407 1.004234 -3.891407C1.115816 -3.891407 1.143711 -3.975093 1.171606 -4.030884C1.645828 -5.579078 2.580324 -5.87198 2.984807 -5.87198C3.612453 -5.87198 3.737983 -5.286177 3.737983 -4.951432C3.737983 -4.644583 3.654296 -4.323786 3.486924 -3.654296L3.012702 -1.743462C2.803487 -0.9066 2.399004 -0.139477 1.659776 -0.139477C1.590037 -0.139477 1.241345 -0.139477 0.948443 -0.320797C1.45056 -0.418431 1.562142 -0.836862 1.562142 -1.004234C1.562142 -1.283188 1.352927 -1.45056 1.08792 -1.45056C0.753176 -1.45056 0.390535 -1.157659 0.390535 -0.711333C0.390535 -0.125529 1.046077 0.139477 1.645828 0.139477C2.315318 0.139477 2.789539 -0.390535 3.082441 -0.962391C3.305604 -0.139477 4.002989 0.139477 4.519054 0.139477C5.941719 0.139477 6.694894 -1.687671 6.694894 -1.994521C6.694894 -2.064259 6.639103 -2.12005 6.555417 -2.12005C6.429888 -2.12005 6.41594 -2.050311 6.374097 -1.93873C5.997509 -0.711333 5.188543 -0.139477 4.560897 -0.139477C4.072727 -0.139477 3.807721 -0.502117 3.807721 -1.073973C3.807721 -1.380822 3.863512 -1.603985 4.086675 -2.524533L4.574844 -4.42142C4.78406 -5.258281 5.258281 -5.87198 5.899875 -5.87198C5.927771 -5.87198 6.318306 -5.87198 6.611208 -5.69066Z'/>
9+<path id='g1-121' d='M3.668244 1.562142C3.291656 2.092154 2.747696 2.566376 2.064259 2.566376C1.896887 2.566376 1.227397 2.538481 1.018182 1.896887C1.060025 1.910834 1.129763 1.910834 1.157659 1.910834C1.57609 1.910834 1.855044 1.548194 1.855044 1.227397S1.590037 0.795019 1.380822 0.795019C1.157659 0.795019 0.669489 0.962391 0.669489 1.645828C0.669489 2.357161 1.26924 2.84533 2.064259 2.84533C3.459029 2.84533 4.867746 1.562142 5.258281 0.013948L6.625156 -5.425654C6.639103 -5.495392 6.666999 -5.579078 6.666999 -5.662765C6.666999 -5.87198 6.499626 -6.011457 6.290411 -6.011457C6.164882 -6.011457 5.87198 -5.955666 5.760399 -5.537235L4.728269 -1.436613C4.658531 -1.185554 4.658531 -1.157659 4.546949 -1.004234C4.267995 -0.613699 3.807721 -0.139477 3.138232 -0.139477C2.357161 -0.139477 2.287422 -0.9066 2.287422 -1.283188C2.287422 -2.078207 2.66401 -3.152179 3.040598 -4.156413C3.194022 -4.560897 3.277709 -4.756164 3.277709 -5.035118C3.277709 -5.620922 2.859278 -6.150934 2.175841 -6.150934C0.892653 -6.150934 0.376588 -4.128518 0.376588 -4.016936C0.376588 -3.961146 0.432379 -3.891407 0.530012 -3.891407C0.655542 -3.891407 0.669489 -3.947198 0.72528 -4.142466C1.060025 -5.314072 1.590037 -5.87198 2.133998 -5.87198C2.259527 -5.87198 2.496638 -5.87198 2.496638 -5.411706C2.496638 -5.049066 2.343213 -4.644583 2.133998 -4.11457C1.45056 -2.287422 1.45056 -1.827148 1.45056 -1.492403C1.45056 -0.167372 2.399004 0.139477 3.096389 0.139477C3.500872 0.139477 4.002989 0.013948 4.491158 -0.502117L4.505106 -0.488169C4.29589 0.334745 4.156413 0.878705 3.668244 1.562142Z'/>
10+<path id='g1-122' d='M1.771357 -1.129763C2.371108 -1.8132 2.859278 -2.245579 3.556663 -2.873225C4.393524 -3.598506 4.756164 -3.947198 4.951432 -4.156413C5.927771 -5.118804 6.41594 -5.927771 6.41594 -6.039352S6.304359 -6.150934 6.276463 -6.150934C6.178829 -6.150934 6.150934 -6.095143 6.081196 -5.997509C5.732503 -5.397758 5.397758 -5.104857 5.035118 -5.104857C4.742217 -5.104857 4.588792 -5.230386 4.323786 -5.565131C4.030884 -5.913823 3.793773 -6.150934 3.38929 -6.150934C2.371108 -6.150934 1.75741 -4.881694 1.75741 -4.588792C1.75741 -4.546949 1.771357 -4.463263 1.896887 -4.463263C2.008468 -4.463263 2.022416 -4.519054 2.064259 -4.616687C2.30137 -5.174595 2.970859 -5.272229 3.235866 -5.272229C3.528767 -5.272229 3.807721 -5.174595 4.100623 -5.049066C4.630635 -4.825903 4.853798 -4.825903 4.993275 -4.825903C5.090909 -4.825903 5.1467 -4.825903 5.216438 -4.839851C4.756164 -4.29589 4.002989 -3.626401 3.375342 -3.054545L1.966625 -1.75741C1.115816 -0.892653 0.599751 -0.069738 0.599751 0.027895C0.599751 0.111582 0.669489 0.139477 0.753176 0.139477S0.850809 0.125529 0.948443 -0.041843C1.171606 -0.390535 1.617933 -0.9066 2.133998 -0.9066C2.426899 -0.9066 2.566376 -0.808966 2.84533 -0.460274C3.110336 -0.153425 3.347447 0.139477 3.793773 0.139477C5.160648 0.139477 5.941719 -1.63188 5.941719 -1.952677C5.941719 -2.008468 5.927771 -2.092154 5.788294 -2.092154C5.676712 -2.092154 5.662765 -2.036364 5.620922 -1.896887C5.314072 -1.073973 4.491158 -0.739228 3.947198 -0.739228C3.654296 -0.739228 3.375342 -0.836862 3.082441 -0.962391C2.524533 -1.185554 2.371108 -1.185554 2.189788 -1.185554C2.050311 -1.185554 1.896887 -1.185554 1.771357 -1.129763Z'/>
11+</defs>
12+<g id='page1'>
13+<use x='59.270442' y='62.786766' xlink:href='#g2-49'/>
14+<rect x='58.804295' y='68.456606' height='0.55789' width='7.760768'/>
15+<use x='58.804295' y='81.789907' xlink:href='#g1-120'/>
16+<use x='70.860038' y='72.222482' xlink:href='#g2-43'/>
17+<use x='85.942577' y='62.786766' xlink:href='#g2-49'/>
18+<rect x='85.777106' y='68.456606' height='0.55789' width='7.159416'/>
19+<use x='85.777106' y='81.789907' xlink:href='#g1-121'/>
20+<rect x='57.608781' y='86.175621' height='0.55789' width='36.523255'/>
21+<use x='60.284264' y='99.508922' xlink:href='#g1-121'/>
22+<use x='70.543155' y='99.508922' xlink:href='#g0-0'/>
23+<use x='84.490862' y='99.508922' xlink:href='#g1-122'/>
24+</g>
25+</svg>
_images/math/3b8127a8eed95247f9249ea6c85e8e86df1baa82.svgnew file+25
@@ -0,0 +1,25 @@
1+<?xml version='1.0' encoding='UTF-8'?>
2+<!-- This file was generated by dvisvgm 2.6.3 -->
3+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='23.092891pt' height='29.523663pt' viewBox='57.608781 53.79825 23.092891 29.523663'>
4+<defs>
5+<path id='g0-0' d='M6.434044 -2.245569C6.600021 -2.245569 6.775761 -2.245569 6.775761 -2.440836S6.600021 -2.636103 6.434044 -2.636103H1.152075C0.986098 -2.636103 0.810358 -2.636103 0.810358 -2.440836S0.986098 -2.245569 1.152075 -2.245569H6.434044Z'/>
6+<path id='g2-43' d='M3.993208 -2.245569H6.717181C6.853868 -2.245569 7.039372 -2.245569 7.039372 -2.440836S6.853868 -2.636103 6.717181 -2.636103H3.993208V-5.36984C3.993208 -5.506526 3.993208 -5.69203 3.797941 -5.69203S3.602674 -5.506526 3.602674 -5.36984V-2.636103H0.868938C0.732251 -2.636103 0.546747 -2.636103 0.546747 -2.440836S0.732251 -2.245569 0.868938 -2.245569H3.602674V0.488167C3.602674 0.624854 3.602674 0.810358 3.797941 0.810358S3.993208 0.624854 3.993208 0.488167V-2.245569Z'/>
7+<path id='g2-49' d='M2.870423 -6.248541C2.870423 -6.482861 2.870423 -6.502388 2.645866 -6.502388C2.040539 -5.877534 1.181365 -5.877534 0.868938 -5.877534V-5.57487C1.064205 -5.57487 1.640242 -5.57487 2.147936 -5.828717V-0.771304C2.147936 -0.419824 2.118646 -0.302664 1.239945 -0.302664H0.927518V0C1.269235 -0.02929 2.118646 -0.02929 2.50918 -0.02929S3.749124 -0.02929 4.090841 0V-0.302664H3.778414C2.899713 -0.302664 2.870423 -0.41006 2.870423 -0.771304V-6.248541Z'/>
8+<path id='g1-120' d='M3.260957 -2.94853C3.319537 -3.202377 3.544094 -4.100605 4.227528 -4.100605C4.276345 -4.100605 4.510665 -4.100605 4.715696 -3.973681C4.442322 -3.924865 4.247055 -3.680781 4.247055 -3.446461C4.247055 -3.290247 4.354452 -3.104744 4.618062 -3.104744C4.832856 -3.104744 5.145283 -3.280484 5.145283 -3.671018C5.145283 -4.178712 4.569245 -4.315398 4.237292 -4.315398C3.671018 -4.315398 3.329301 -3.797941 3.21214 -3.573384C2.968057 -4.217765 2.440836 -4.315398 2.157699 -4.315398C1.142311 -4.315398 0.585801 -3.055927 0.585801 -2.811843C0.585801 -2.71421 0.683434 -2.71421 0.702961 -2.71421C0.781068 -2.71421 0.810358 -2.733737 0.829884 -2.821607C1.161838 -3.856521 1.806219 -4.100605 2.138172 -4.100605C2.323676 -4.100605 2.665393 -4.012735 2.665393 -3.446461C2.665393 -3.143797 2.499416 -2.489653 2.138172 -1.122785C1.981959 -0.517457 1.640242 -0.107397 1.210655 -0.107397C1.152075 -0.107397 0.927518 -0.107397 0.722488 -0.23432C0.966571 -0.283137 1.181365 -0.488167 1.181365 -0.761541C1.181365 -1.025151 0.966571 -1.103258 0.820121 -1.103258C0.527221 -1.103258 0.283137 -0.849411 0.283137 -0.536984C0.283137 -0.08787 0.771304 0.107397 1.200891 0.107397C1.845272 0.107397 2.196753 -0.576037 2.226043 -0.634617C2.343203 -0.273374 2.694683 0.107397 3.280484 0.107397C4.286108 0.107397 4.842619 -1.152075 4.842619 -1.396158C4.842619 -1.493792 4.754749 -1.493792 4.725459 -1.493792C4.637589 -1.493792 4.618062 -1.454738 4.598535 -1.386395C4.276345 -0.341717 3.612438 -0.107397 3.300011 -0.107397C2.91924 -0.107397 2.763027 -0.419824 2.763027 -0.751778C2.763027 -0.966571 2.821607 -1.181365 2.929003 -1.610952L3.260957 -2.94853Z'/>
9+<path id='g1-121' d='M4.744986 -3.719834C4.784039 -3.856521 4.784039 -3.876048 4.784039 -3.944391C4.784039 -4.120131 4.647352 -4.208002 4.500902 -4.208002C4.403268 -4.208002 4.247055 -4.149422 4.159185 -4.002971C4.139658 -3.954155 4.061551 -3.651491 4.022498 -3.475751C3.954155 -3.221904 3.885811 -2.958293 3.827231 -2.694683L3.387881 -0.937281C3.348827 -0.790831 2.929003 -0.107397 2.284623 -0.107397C1.786692 -0.107397 1.679295 -0.536984 1.679295 -0.898228C1.679295 -1.347342 1.845272 -1.952669 2.177226 -2.811843C2.333439 -3.21214 2.372493 -3.319537 2.372493 -3.514804C2.372493 -3.954155 2.060066 -4.315398 1.571899 -4.315398C0.644381 -4.315398 0.283137 -2.899713 0.283137 -2.811843C0.283137 -2.71421 0.38077 -2.71421 0.400297 -2.71421C0.497931 -2.71421 0.507694 -2.733737 0.556511 -2.88995C0.820121 -3.807704 1.210655 -4.100605 1.542608 -4.100605C1.620715 -4.100605 1.786692 -4.100605 1.786692 -3.788178C1.786692 -3.544094 1.689059 -3.290247 1.620715 -3.104744C1.230181 -2.069829 1.054441 -1.513318 1.054441 -1.054441C1.054441 -0.185504 1.669532 0.107397 2.245569 0.107397C2.62634 0.107397 2.958293 -0.05858 3.231667 -0.331954C3.104744 0.17574 2.987583 0.654144 2.59705 1.171601C2.343203 1.503555 1.972196 1.786692 1.523082 1.786692C1.386395 1.786692 0.947044 1.757402 0.781068 1.376632C0.937281 1.376632 1.064205 1.376632 1.200891 1.259471C1.298525 1.171601 1.396158 1.044678 1.396158 0.859174C1.396158 0.556511 1.132548 0.517457 1.034915 0.517457C0.810358 0.517457 0.488167 0.673671 0.488167 1.152075C0.488167 1.640242 0.917754 2.001486 1.523082 2.001486C2.528706 2.001486 3.534331 1.113021 3.807704 0.009763L4.744986 -3.719834Z'/>
10+<path id='g1-122' d='M1.298525 -0.810358C1.825745 -1.376632 2.108882 -1.620715 2.460363 -1.923379C2.460363 -1.933142 3.06569 -2.4506 3.417171 -2.80208C4.344688 -3.710071 4.559482 -4.178712 4.559482 -4.217765C4.559482 -4.315398 4.471612 -4.315398 4.452085 -4.315398C4.383742 -4.315398 4.354452 -4.295872 4.305635 -4.208002C4.012735 -3.739361 3.807704 -3.583148 3.573384 -3.583148S3.221904 -3.729598 3.075454 -3.895575C2.88995 -4.120131 2.723973 -4.315398 2.401783 -4.315398C1.669532 -4.315398 1.220418 -3.407407 1.220418 -3.202377C1.220418 -3.15356 1.249708 -3.09498 1.337578 -3.09498S1.444975 -3.143797 1.464502 -3.202377C1.650005 -3.651491 2.216279 -3.661254 2.294386 -3.661254C2.499416 -3.661254 2.68492 -3.592911 2.909477 -3.514804C3.300011 -3.368354 3.407407 -3.368354 3.661254 -3.368354C3.309774 -2.94853 2.489653 -2.245569 2.304149 -2.089356L1.425448 -1.269235C0.761541 -0.615091 0.419824 -0.05858 0.419824 0.009763C0.419824 0.107397 0.517457 0.107397 0.536984 0.107397C0.615091 0.107397 0.634617 0.08787 0.693197 -0.019527C0.917754 -0.361244 1.210655 -0.624854 1.523082 -0.624854C1.747639 -0.624854 1.845272 -0.536984 2.089356 -0.253847C2.255333 -0.048817 2.431073 0.107397 2.71421 0.107397C3.680781 0.107397 4.247055 -1.132548 4.247055 -1.396158C4.247055 -1.444975 4.208002 -1.493792 4.129895 -1.493792C4.042025 -1.493792 4.022498 -1.435212 3.993208 -1.366868C3.768651 -0.732251 3.143797 -0.546747 2.821607 -0.546747C2.62634 -0.546747 2.4506 -0.605327 2.245569 -0.673671C1.913616 -0.800594 1.767165 -0.839648 1.562135 -0.839648C1.542608 -0.839648 1.386395 -0.839648 1.298525 -0.810358Z'/>
11+</defs>
12+<g id='page1'>
13+<use x='59.153464' y='60.090183' xlink:href='#g2-49'/>
14+<rect x='58.804295' y='61.81595' height='0.55789' width='5.580027'/>
15+<use x='58.804295' y='70.391549' xlink:href='#g1-120'/>
16+<use x='65.579836' y='65.581827' xlink:href='#g2-43'/>
17+<use x='74.496784' y='60.090183' xlink:href='#g2-49'/>
18+<rect x='74.369089' y='61.81595' height='0.55789' width='5.137078'/>
19+<use x='74.369089' y='70.391549' xlink:href='#g1-121'/>
20+<rect x='57.608781' y='72.847884' height='0.55789' width='23.092891'/>
21+<use x='60.304908' y='81.423483' xlink:href='#g1-121'/>
22+<use x='65.441996' y='81.423483' xlink:href='#g0-0'/>
23+<use x='73.035735' y='81.423483' xlink:href='#g1-122'/>
24+</g>
25+</svg>
_images/math/6673b43f9fe29455c1fcd1164e5844698cc64d38.svgnew file+22
@@ -0,0 +1,22 @@
1+<?xml version='1.0' encoding='UTF-8'?>
2+<!-- This file was generated by dvisvgm 2.6.3 -->
3+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='69.686469pt' height='12.418845pt' viewBox='56.413267 54.399982 69.686469 12.418845'>
4+<defs>
5+<path id='g2-43' d='M5.565131 -3.221918H9.414695C9.609963 -3.221918 9.861021 -3.221918 9.861021 -3.472976C9.861021 -3.737983 9.62391 -3.737983 9.414695 -3.737983H5.565131V-7.587547C5.565131 -7.782814 5.565131 -8.033873 5.314072 -8.033873C5.049066 -8.033873 5.049066 -7.796762 5.049066 -7.587547V-3.737983H1.199502C1.004234 -3.737983 0.753176 -3.737983 0.753176 -3.486924C0.753176 -3.221918 0.990286 -3.221918 1.199502 -3.221918H5.049066V0.627646C5.049066 0.822914 5.049066 1.073973 5.300125 1.073973C5.565131 1.073973 5.565131 0.836862 5.565131 0.627646V-3.221918Z'/>
6+<path id='g2-61' d='M9.414695 -4.519054C9.609963 -4.519054 9.861021 -4.519054 9.861021 -4.770112C9.861021 -5.035118 9.62391 -5.035118 9.414695 -5.035118H1.199502C1.004234 -5.035118 0.753176 -5.035118 0.753176 -4.78406C0.753176 -4.519054 0.990286 -4.519054 1.199502 -4.519054H9.414695ZM9.414695 -1.924782C9.609963 -1.924782 9.861021 -1.924782 9.861021 -2.175841C9.861021 -2.440847 9.62391 -2.440847 9.414695 -2.440847H1.199502C1.004234 -2.440847 0.753176 -2.440847 0.753176 -2.189788C0.753176 -1.924782 0.990286 -1.924782 1.199502 -1.924782H9.414695Z'/>
7+<path id='g0-97' d='M4.198257 -1.659776C4.128518 -1.422665 4.128518 -1.39477 3.93325 -1.129763C3.626401 -0.739228 3.012702 -0.139477 2.357161 -0.139477C1.785305 -0.139477 1.464508 -0.655542 1.464508 -1.478456C1.464508 -2.245579 1.896887 -3.807721 2.161893 -4.393524C2.636115 -5.369863 3.291656 -5.87198 3.835616 -5.87198C4.756164 -5.87198 4.937484 -4.728269 4.937484 -4.616687C4.937484 -4.60274 4.895641 -4.42142 4.881694 -4.393524L4.198257 -1.659776ZM5.090909 -5.230386C4.937484 -5.593026 4.560897 -6.150934 3.835616 -6.150934C2.259527 -6.150934 0.557908 -4.11457 0.557908 -2.050311C0.557908 -0.669489 1.366874 0.139477 2.315318 0.139477C3.082441 0.139477 3.737983 -0.460274 4.128518 -0.920548C4.267995 -0.097634 4.923537 0.139477 5.341968 0.139477S6.095143 -0.111582 6.346202 -0.613699C6.569365 -1.08792 6.764633 -1.93873 6.764633 -1.994521C6.764633 -2.064259 6.708842 -2.12005 6.625156 -2.12005C6.499626 -2.12005 6.485679 -2.050311 6.429888 -1.841096C6.220672 -1.018182 5.955666 -0.139477 5.383811 -0.139477C4.979328 -0.139477 4.951432 -0.502117 4.951432 -0.781071C4.951432 -1.101868 4.993275 -1.255293 5.118804 -1.799253C5.216438 -2.147945 5.286177 -2.454795 5.397758 -2.859278C5.913823 -4.951432 6.039352 -5.453549 6.039352 -5.537235C6.039352 -5.732503 5.885928 -5.885928 5.676712 -5.885928C5.230386 -5.885928 5.118804 -5.397758 5.090909 -5.230386Z'/>
8+<path id='g0-98' d='M3.221918 -9.331009C3.235866 -9.3868 3.263761 -9.470486 3.263761 -9.540224C3.263761 -9.679701 3.124284 -9.679701 3.096389 -9.679701C3.082441 -9.679701 2.580324 -9.637858 2.329265 -9.609963C2.092154 -9.596015 1.882939 -9.56812 1.63188 -9.554172C1.297136 -9.526276 1.199502 -9.512329 1.199502 -9.26127C1.199502 -9.121793 1.338979 -9.121793 1.478456 -9.121793C2.189788 -9.121793 2.189788 -8.996264 2.189788 -8.856787C2.189788 -8.759153 2.078207 -8.35467 2.022416 -8.103611L1.687671 -6.764633C1.548194 -6.206725 0.753176 -3.040598 0.697385 -2.789539C0.627646 -2.440847 0.627646 -2.203736 0.627646 -2.022416C0.627646 -0.599751 1.422665 0.139477 2.329265 0.139477C3.947198 0.139477 5.620922 -1.93873 5.620922 -3.961146C5.620922 -5.244334 4.895641 -6.150934 3.849564 -6.150934C3.124284 -6.150934 2.468742 -5.551183 2.203736 -5.272229L3.221918 -9.331009ZM2.343213 -0.139477C1.896887 -0.139477 1.408717 -0.474222 1.408717 -1.562142C1.408717 -2.022416 1.45056 -2.287422 1.701619 -3.263761C1.743462 -3.445081 1.966625 -4.337733 2.022416 -4.519054C2.050311 -4.630635 2.873225 -5.87198 3.821669 -5.87198C4.435367 -5.87198 4.714321 -5.258281 4.714321 -4.533001C4.714321 -3.863512 4.323786 -2.287422 3.975093 -1.562142C3.626401 -0.808966 2.984807 -0.139477 2.343213 -0.139477Z'/>
9+<path id='g0-99' d='M5.453549 -5.244334C5.188543 -5.244334 5.063014 -5.244334 4.867746 -5.076961C4.78406 -5.007223 4.630635 -4.798007 4.630635 -4.574844C4.630635 -4.29589 4.839851 -4.128518 5.104857 -4.128518C5.439601 -4.128518 5.816189 -4.407472 5.816189 -4.96538C5.816189 -5.634869 5.174595 -6.150934 4.212204 -6.150934C2.385056 -6.150934 0.557908 -4.156413 0.557908 -2.175841C0.557908 -0.962391 1.311083 0.139477 2.733748 0.139477C4.630635 0.139477 5.830137 -1.338979 5.830137 -1.520299C5.830137 -1.603985 5.746451 -1.673724 5.69066 -1.673724C5.648817 -1.673724 5.634869 -1.659776 5.50934 -1.534247C4.616687 -0.348692 3.291656 -0.139477 2.761644 -0.139477C1.799253 -0.139477 1.492403 -0.976339 1.492403 -1.673724C1.492403 -2.161893 1.729514 -3.514819 2.231631 -4.463263C2.594271 -5.118804 3.347447 -5.87198 4.226152 -5.87198C4.407472 -5.87198 5.174595 -5.844085 5.453549 -5.244334Z'/>
10+<path id='g1-50' d='M1.239945 -0.751778L2.274859 -1.757402C3.797941 -3.104744 4.383742 -3.631964 4.383742 -4.608299C4.383742 -5.72132 3.505041 -6.502388 2.313913 -6.502388C1.210655 -6.502388 0.488167 -5.60416 0.488167 -4.735222C0.488167 -4.188475 0.976334 -4.188475 1.005625 -4.188475C1.171601 -4.188475 1.513318 -4.305635 1.513318 -4.705932C1.513318 -4.959779 1.337578 -5.213626 0.995861 -5.213626C0.917754 -5.213626 0.898228 -5.213626 0.868938 -5.203863C1.093495 -5.83848 1.620715 -6.199724 2.186989 -6.199724C3.075454 -6.199724 3.495277 -5.408893 3.495277 -4.608299C3.495277 -3.827231 3.00711 -3.055927 2.470126 -2.4506L0.595564 -0.361244C0.488167 -0.253847 0.488167 -0.23432 0.488167 0H4.110368L4.383742 -1.698822H4.139658C4.090841 -1.405922 4.022498 -0.976334 3.924865 -0.829884C3.856521 -0.751778 3.21214 -0.751778 2.997347 -0.751778H1.239945Z'/>
11+</defs>
12+<g id='page1'>
13+<use x='56.413267' y='65.753425' xlink:href='#g0-97'/>
14+<use x='63.582369' y='60.691915' xlink:href='#g1-50'/>
15+<use x='72.061649' y='65.753425' xlink:href='#g2-43'/>
16+<use x='85.783204' y='65.753425' xlink:href='#g0-98'/>
17+<use x='91.589827' y='60.691915' xlink:href='#g1-50'/>
18+<use x='100.843973' y='65.753425' xlink:href='#g2-61'/>
19+<use x='115.340392' y='65.753425' xlink:href='#g0-99'/>
20+<use x='121.218045' y='60.691915' xlink:href='#g1-50'/>
21+</g>
22+</svg>
_images/math/a6a994cb6e7278ec30eaebe7e636046d3deccb5b.svgnew file+43
@@ -0,0 +1,43 @@
1+<?xml version='1.0' encoding='UTF-8'?>
2+<!-- This file was generated by dvisvgm 2.6.3 -->
3+<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='134.289458pt' height='28.68903pt' viewBox='165.981071 78.308016 134.289458 28.68903'>
4+<defs>
5+<path id='g2-32' d='M6.555417 -9.344956C6.555417 -9.358904 6.611208 -9.540224 6.611208 -9.554172C6.611208 -9.679701 6.499626 -9.679701 6.457783 -9.679701C6.332254 -9.679701 6.318306 -9.609963 6.262516 -9.400747L3.961146 -0.167372C2.803487 -0.306849 2.371108 -0.892653 2.371108 -1.729514C2.371108 -2.036364 2.371108 -2.357161 3.02665 -4.086675C3.20797 -4.588792 3.277709 -4.770112 3.277709 -5.021171C3.277709 -5.648817 2.831382 -6.150934 2.175841 -6.150934C0.892653 -6.150934 0.376588 -4.128518 0.376588 -4.016936C0.376588 -3.961146 0.432379 -3.891407 0.530012 -3.891407C0.655542 -3.891407 0.669489 -3.947198 0.72528 -4.142466C1.060025 -5.355915 1.617933 -5.87198 2.133998 -5.87198C2.259527 -5.87198 2.496638 -5.858032 2.496638 -5.411706C2.496638 -5.355915 2.496638 -5.049066 2.259527 -4.435367C1.506351 -2.454795 1.506351 -2.147945 1.506351 -1.827148C1.506351 -0.488169 2.622167 0.027895 3.87746 0.125529C3.765878 0.557908 3.668244 1.004234 3.556663 1.436613C3.333499 2.273474 3.235866 2.66401 3.235866 2.719801C3.235866 2.84533 3.347447 2.84533 3.38929 2.84533C3.417186 2.84533 3.472976 2.84533 3.500872 2.789539C3.556663 2.733748 4.128518 0.390535 4.184309 0.139477C4.700374 0.139477 5.802242 0.139477 7.057534 -1.157659C7.517808 -1.659776 7.936239 -2.30137 8.17335 -2.901121C8.312827 -3.263761 8.647572 -4.505106 8.647572 -5.216438C8.647572 -6.0533 8.229141 -6.150934 8.089664 -6.150934C7.754919 -6.150934 7.44807 -5.816189 7.44807 -5.537235C7.44807 -5.369863 7.545704 -5.272229 7.601494 -5.216438C7.727024 -5.090909 8.103611 -4.714321 8.103611 -3.989041C8.103611 -3.486924 7.824658 -2.454795 6.932005 -1.45056C5.760399 -0.139477 4.686426 -0.139477 4.267995 -0.139477L6.555417 -9.344956Z'/>
6+<path id='g2-58' d='M2.566376 -0.669489C2.566376 -1.073973 2.231631 -1.352927 1.896887 -1.352927C1.492403 -1.352927 1.21345 -1.018182 1.21345 -0.683437C1.21345 -0.278954 1.548194 0 1.882939 0C2.287422 0 2.566376 -0.334745 2.566376 -0.669489Z'/>
7+<path id='g2-64' d='M6.332254 -4.658531C6.248568 -5.439601 5.760399 -6.374097 4.505106 -6.374097C2.538481 -6.374097 0.530012 -4.379577 0.530012 -2.161893C0.530012 -1.311083 1.115816 0.292902 3.012702 0.292902C6.304359 0.292902 7.713076 -4.505106 7.713076 -6.41594C7.713076 -8.424408 6.583313 -9.972603 4.798007 -9.972603C2.775592 -9.972603 2.175841 -8.201245 2.175841 -7.824658C2.175841 -7.699128 2.259527 -7.392279 2.650062 -7.392279C3.138232 -7.392279 3.347447 -7.838605 3.347447 -8.075716C3.347447 -8.508095 2.915068 -8.508095 2.733748 -8.508095C3.305604 -9.540224 4.365629 -9.637858 4.742217 -9.637858C5.969614 -9.637858 6.750685 -8.661519 6.750685 -7.099377C6.750685 -6.206725 6.485679 -5.174595 6.346202 -4.658531H6.332254ZM3.054545 -0.083686C1.743462 -0.083686 1.520299 -1.115816 1.520299 -1.701619C1.520299 -2.315318 1.910834 -3.75193 2.12005 -4.267995C2.30137 -4.686426 3.096389 -6.095143 4.546949 -6.095143C5.816189 -6.095143 6.109091 -4.993275 6.109091 -4.2401C6.109091 -3.20797 5.202491 -0.083686 3.054545 -0.083686Z'/>
8+<path id='g2-72' d='M10.432877 -8.508095C10.558406 -8.982316 10.586301 -9.121793 11.576588 -9.121793C11.827646 -9.121793 11.967123 -9.121793 11.967123 -9.372852C11.967123 -9.526276 11.841594 -9.526276 11.757908 -9.526276C11.506849 -9.526276 11.213948 -9.498381 10.948941 -9.498381H9.303113C9.038107 -9.498381 8.745205 -9.526276 8.480199 -9.526276C8.382565 -9.526276 8.215193 -9.526276 8.215193 -9.26127C8.215193 -9.121793 8.312827 -9.121793 8.577833 -9.121793C9.414695 -9.121793 9.414695 -9.010212 9.414695 -8.856787C9.414695 -8.828892 9.414695 -8.745205 9.358904 -8.53599L8.508095 -5.160648H4.29589L5.132752 -8.508095C5.258281 -8.982316 5.286177 -9.121793 6.276463 -9.121793C6.527522 -9.121793 6.666999 -9.121793 6.666999 -9.372852C6.666999 -9.526276 6.541469 -9.526276 6.457783 -9.526276C6.206725 -9.526276 5.913823 -9.498381 5.648817 -9.498381H4.002989C3.737983 -9.498381 3.445081 -9.526276 3.180075 -9.526276C3.082441 -9.526276 2.915068 -9.526276 2.915068 -9.26127C2.915068 -9.121793 3.012702 -9.121793 3.277709 -9.121793C4.11457 -9.121793 4.11457 -9.010212 4.11457 -8.856787C4.11457 -8.828892 4.11457 -8.745205 4.05878 -8.53599L2.175841 -1.03213C2.050311 -0.54396 2.022416 -0.404483 1.060025 -0.404483C0.739228 -0.404483 0.641594 -0.404483 0.641594 -0.139477C0.641594 0 0.795019 0 0.836862 0C1.08792 0 1.380822 -0.027895 1.645828 -0.027895H3.291656C3.556663 -0.027895 3.849564 0 4.11457 0C4.226152 0 4.379577 0 4.379577 -0.265006C4.379577 -0.404483 4.254047 -0.404483 4.044832 -0.404483C3.194022 -0.404483 3.194022 -0.516065 3.194022 -0.655542C3.194022 -0.669489 3.194022 -0.767123 3.221918 -0.878705L4.184309 -4.756164H8.410461C8.17335 -3.835616 7.462017 -0.920548 7.434122 -0.836862C7.280697 -0.418431 7.057534 -0.418431 6.23462 -0.404483C6.067248 -0.404483 5.941719 -0.404483 5.941719 -0.139477C5.941719 0 6.095143 0 6.136986 0C6.388045 0 6.680946 -0.027895 6.945953 -0.027895H8.591781C8.856787 -0.027895 9.149689 0 9.414695 0C9.526276 0 9.679701 0 9.679701 -0.265006C9.679701 -0.404483 9.554172 -0.404483 9.344956 -0.404483C8.494147 -0.404483 8.494147 -0.516065 8.494147 -0.655542C8.494147 -0.669489 8.494147 -0.767123 8.522042 -0.878705L10.432877 -8.508095Z'/>
9+<path id='g2-116' d='M2.803487 -5.606974H4.086675C4.351681 -5.606974 4.491158 -5.606974 4.491158 -5.858032C4.491158 -6.011457 4.407472 -6.011457 4.128518 -6.011457H2.901121L3.417186 -8.047821C3.472976 -8.243088 3.472976 -8.270984 3.472976 -8.368618C3.472976 -8.591781 3.291656 -8.71731 3.110336 -8.71731C2.998755 -8.71731 2.677958 -8.675467 2.566376 -8.229141L2.022416 -6.011457H0.711333C0.432379 -6.011457 0.306849 -6.011457 0.306849 -5.746451C0.306849 -5.606974 0.404483 -5.606974 0.669489 -5.606974H1.910834L0.990286 -1.924782C0.878705 -1.436613 0.836862 -1.297136 0.836862 -1.115816C0.836862 -0.460274 1.297136 0.139477 2.078207 0.139477C3.486924 0.139477 4.2401 -1.896887 4.2401 -1.994521C4.2401 -2.078207 4.184309 -2.12005 4.100623 -2.12005C4.072727 -2.12005 4.016936 -2.12005 3.989041 -2.064259C3.975093 -2.050311 3.961146 -2.036364 3.863512 -1.8132C3.57061 -1.115816 2.929016 -0.139477 2.12005 -0.139477C1.701619 -0.139477 1.673724 -0.488169 1.673724 -0.795019C1.673724 -0.808966 1.673724 -1.073973 1.715567 -1.241345L2.803487 -5.606974Z'/>
10+<path id='g1-105' d='M3.807721 -3.249813C3.87746 -3.417186 3.87746 -3.445081 3.87746 -3.486924S3.87746 -3.556663 3.807721 -3.724035L1.366874 -10.139975C1.283188 -10.377086 1.199502 -10.460772 1.046077 -10.460772S0.767123 -10.335243 0.767123 -10.181818C0.767123 -10.139975 0.767123 -10.11208 0.836862 -9.958655L3.305604 -3.486924L0.836862 2.956912C0.767123 3.110336 0.767123 3.138232 0.767123 3.20797C0.767123 3.361395 0.892653 3.486924 1.046077 3.486924C1.227397 3.486924 1.283188 3.347447 1.338979 3.20797L3.807721 -3.249813Z'/>
11+<path id='g1-106' d='M2.217684 -9.958655C2.217684 -10.209714 2.217684 -10.460772 1.93873 -10.460772S1.659776 -10.209714 1.659776 -9.958655V2.984807C1.659776 3.235866 1.659776 3.486924 1.93873 3.486924S2.217684 3.235866 2.217684 2.984807V-9.958655Z'/>
12+<path id='g3-40' d='M4.533001 3.38929C4.533001 3.347447 4.533001 3.319552 4.29589 3.082441C2.901121 1.673724 2.12005 -0.627646 2.12005 -3.472976C2.12005 -6.178829 2.775592 -8.508095 4.393524 -10.153923C4.533001 -10.279452 4.533001 -10.307347 4.533001 -10.349191C4.533001 -10.432877 4.463263 -10.460772 4.407472 -10.460772C4.226152 -10.460772 3.082441 -9.456538 2.399004 -8.089664C1.687671 -6.680946 1.366874 -5.188543 1.366874 -3.472976C1.366874 -2.231631 1.562142 -0.571856 2.287422 0.920548C3.110336 2.594271 4.254047 3.500872 4.407472 3.500872C4.463263 3.500872 4.533001 3.472976 4.533001 3.38929Z'/>
13+<path id='g3-41' d='M3.93325 -3.472976C3.93325 -4.533001 3.793773 -6.262516 3.012702 -7.880448C2.189788 -9.554172 1.046077 -10.460772 0.892653 -10.460772C0.836862 -10.460772 0.767123 -10.432877 0.767123 -10.349191C0.767123 -10.307347 0.767123 -10.279452 1.004234 -10.042341C2.399004 -8.633624 3.180075 -6.332254 3.180075 -3.486924C3.180075 -0.781071 2.524533 1.548194 0.9066 3.194022C0.767123 3.319552 0.767123 3.347447 0.767123 3.38929C0.767123 3.472976 0.836862 3.500872 0.892653 3.500872C1.073973 3.500872 2.217684 2.496638 2.901121 1.129763C3.612453 -0.292902 3.93325 -1.799253 3.93325 -3.472976Z'/>
14+<path id='g3-61' d='M9.414695 -4.519054C9.609963 -4.519054 9.861021 -4.519054 9.861021 -4.770112C9.861021 -5.035118 9.62391 -5.035118 9.414695 -5.035118H1.199502C1.004234 -5.035118 0.753176 -5.035118 0.753176 -4.78406C0.753176 -4.519054 0.990286 -4.519054 1.199502 -4.519054H9.414695ZM9.414695 -1.924782C9.609963 -1.924782 9.861021 -1.924782 9.861021 -2.175841C9.861021 -2.440847 9.62391 -2.440847 9.414695 -2.440847H1.199502C1.004234 -2.440847 0.753176 -2.440847 0.753176 -2.189788C0.753176 -1.924782 0.990286 -1.924782 1.199502 -1.924782H9.414695Z'/>
15+<path id='g3-94' d='M3.417186 -9.679701L1.590037 -7.782814L1.8132 -7.573599L3.403238 -9.010212L5.007223 -7.573599L5.230386 -7.782814L3.417186 -9.679701Z'/>
16+<path id='g3-105' d='M2.426899 -8.591781C2.426899 -8.954421 2.133998 -9.275218 1.743462 -9.275218C1.380822 -9.275218 1.073973 -8.982316 1.073973 -8.605729C1.073973 -8.187298 1.408717 -7.922291 1.743462 -7.922291C2.175841 -7.922291 2.426899 -8.284932 2.426899 -8.591781ZM0.502117 -5.997509V-5.593026C1.39477 -5.593026 1.520299 -5.50934 1.520299 -4.825903V-1.03213C1.520299 -0.404483 1.366874 -0.404483 0.460274 -0.404483V0C0.850809 -0.027895 1.520299 -0.027895 1.924782 -0.027895C2.078207 -0.027895 2.887173 -0.027895 3.361395 0V-0.404483C2.454795 -0.404483 2.399004 -0.474222 2.399004 -1.018182V-6.150934L0.502117 -5.997509Z'/>
17+<path id='g0-126' d='M3.556663 -7.671233H6.262516C6.499626 -7.671233 6.653051 -7.671233 6.653051 -7.838605C6.653051 -8.019925 6.485679 -8.019925 6.220672 -8.019925H3.640349C3.737983 -8.368618 3.737983 -8.396513 3.821669 -8.745205C3.891407 -8.996264 4.016936 -9.484433 4.016936 -9.512329C4.016936 -9.637858 3.93325 -9.679701 3.821669 -9.679701C3.556663 -9.679701 2.454795 -9.56812 2.12005 -9.540224C2.008468 -9.526276 1.855044 -9.512329 1.855044 -9.247323C1.855044 -9.093898 1.994521 -9.093898 2.189788 -9.093898C2.859278 -9.093898 2.887173 -8.996264 2.887173 -8.856787C2.887173 -8.759153 2.761644 -8.298879 2.691905 -8.019925H1.910834C1.63188 -8.019925 1.478456 -8.019925 1.478456 -7.838605C1.478456 -7.671233 1.603985 -7.671233 1.868991 -7.671233H2.608219L0.822914 -0.557908C0.767123 -0.348692 0.767123 -0.320797 0.767123 -0.237111C0.767123 0.069738 1.004234 0.153425 1.171606 0.153425C1.436613 0.153425 1.63188 -0.041843 1.687671 -0.223163C1.715567 -0.292902 1.868991 -0.920548 1.952677 -1.26924L2.273474 -2.510585C2.315318 -2.719801 2.454795 -3.249813 2.496638 -3.459029C2.566376 -3.682192 2.66401 -4.11457 2.677958 -4.156413C2.789539 -4.393524 3.542715 -5.858032 4.937484 -5.858032C5.551183 -5.858032 5.69066 -5.355915 5.69066 -4.895641C5.69066 -4.030884 5.049066 -2.329265 4.798007 -1.687671C4.714321 -1.464508 4.644583 -1.26924 4.644583 -1.004234C4.644583 -0.278954 5.160648 0.153425 5.788294 0.153425C7.127273 0.153425 7.615442 -1.910834 7.615442 -1.994521C7.615442 -2.133998 7.489913 -2.133998 7.44807 -2.133998C7.308593 -2.133998 7.308593 -2.092154 7.238854 -1.882939C6.834371 -0.460274 6.206725 -0.153425 5.830137 -0.153425C5.565131 -0.153425 5.481445 -0.320797 5.481445 -0.613699C5.481445 -0.962391 5.634869 -1.352927 5.718555 -1.590037C5.955666 -2.203736 6.583313 -3.87746 6.583313 -4.658531C6.583313 -5.676712 5.941719 -6.164882 4.979328 -6.164882C4.546949 -6.164882 3.710087 -6.067248 2.915068 -5.104857L3.556663 -7.671233Z'/>
18+</defs>
19+<g id='page1'>
20+<use x='165.981071' y='97.429622' xlink:href='#g3-105'/>
21+<use x='169.774676' y='97.429622' xlink:href='#g0-126'/>
22+<use x='180.971707' y='87.993906' xlink:href='#g2-64'/>
23+<rect x='178.505856' y='93.663745' height='0.55789' width='12.899852'/>
24+<use x='178.505856' y='106.997046' xlink:href='#g2-64'/>
25+<use x='186.474036' y='106.997046' xlink:href='#g2-116'/>
26+<use x='192.601222' y='97.429622' xlink:href='#g1-106'/>
27+<use x='198.80019' y='97.429622' xlink:href='#g2-32'/>
28+<use x='208.179277' y='97.429622' xlink:href='#g3-40'/>
29+<use x='213.490324' y='97.429622' xlink:href='#g2-116'/>
30+<use x='218.42201' y='97.429622' xlink:href='#g3-41'/>
31+<use x='223.733057' y='97.429622' xlink:href='#g1-105'/>
32+<use x='233.031506' y='97.429622' xlink:href='#g3-61'/>
33+<use x='251.068923' y='93.903964' xlink:href='#g3-94'/>
34+<use x='247.527926' y='97.429622' xlink:href='#g2-72'/>
35+<use x='259.920966' y='97.429622' xlink:href='#g1-106'/>
36+<use x='266.119934' y='97.429622' xlink:href='#g2-32'/>
37+<use x='275.499021' y='97.429622' xlink:href='#g3-40'/>
38+<use x='280.810068' y='97.429622' xlink:href='#g2-116'/>
39+<use x='285.741754' y='97.429622' xlink:href='#g3-41'/>
40+<use x='291.052801' y='97.429622' xlink:href='#g1-105'/>
41+<use x='296.476924' y='97.429622' xlink:href='#g2-58'/>
42+</g>
43+</svg>
docs/blog/searx-admin-engines.png → _images/searx-admin-engines.pngrenamed

Binary file not shown.

docs/blog/searxpy3.png → _images/searxpy3.pngrenamed

Binary file not shown.

docs/dev/svg_image.svg → _images/svg_image.svgrenamed

The content is the same.

docs/admin/api.rst → _sources/admin/api.rst.txtrenamed

The content is the same.

docs/admin/architecture.rst → _sources/admin/architecture.rst.txtrenamed

The content is the same.

docs/admin/buildhosts.rst → _sources/admin/buildhosts.rst.txtrenamed+8−8
@@ -17,17 +17,17 @@ Buildhosts
1717To get best results from build, its recommend to install additional packages
1818on build hosts (see :ref:`searx.sh`).::
1919
20− sudo -H ./utils/searx.sh install buildhost
20+ sudo -H ./utils/searx.sh buildhost
2121
2222This will install packages needed by searx:
2323
24−.. kernel-include:: $DOCS_BUILD/includes/searx.rst
24+.. include:: ../../build/docs/includes/searx.rst
2525 :start-after: START distro-packages
2626 :end-before: END distro-packages
2727
2828and packages needed to build docuemtation and run tests:
2929
30−.. kernel-include:: $DOCS_BUILD/includes/searx.rst
30+.. include:: ../../build/docs/includes/searx.rst
3131 :start-after: START build-packages
3232 :end-before: END build-packages
3333
@@ -49,9 +49,9 @@ Build docs
4949 - dvisvgm_
5050
5151Most of the sphinx requirements are installed from :origin:`setup.py` and the
52−docs can be build from scratch with ``make docs.html``. For better math and
53−image processing additional packages are needed. The XeTeX_ needed not only for
54−PDF creation, its also needed for :ref:`math` when HTML output is build.
52+docs can be build from scratch with ``make docs``. For better math and image
53+processing additional packages are needed. The XeTeX_ needed not only for PDF
54+creation, its also needed for :ref:`math` when HTML output is build.
5555
5656To be able to do :ref:`sphinx:math-support` without CDNs, the math are rendered
5757as images (``sphinx.ext.imgmath`` extension).
@@ -64,10 +64,10 @@ to ``imgmath``:
6464 :start-after: # sphinx.ext.imgmath setup
6565 :end-before: # sphinx.ext.imgmath setup END
6666
67−If your docs build (``make docs.html``) shows warnings like this::
67+If your docs build (``make docs``) shows warnings like this::
6868
6969 WARNING: dot(1) not found, for better output quality install \
70− graphviz from https://www.graphviz.org
70+ graphviz from http://www.graphviz.org
7171 ..
7272 WARNING: LaTeX command 'latex' cannot be run (needed for math \
7373 display), check the imgmath_latex setting
docs/admin/engines.rst → _sources/admin/engines.rst.txtrenamed+12−29
@@ -1,28 +1,14 @@
1+.. _engines generic:
2+
13=======
24Engines
35=======
46
5−Special Engine Settings
6−=======================
7−
87.. sidebar:: Further reading ..
98
109 - :ref:`settings engine`
11− - :ref:`engine settings` & :ref:`engine file`
12−
13−.. toctree::
14− :maxdepth: 1
15−
16− engines/recoll.rst
17−
18−
19−.. _engines generic:
20−
21−General Engine Settings
22−=======================
23−
24−Explanation of the :ref:`general engine configuration` shown in the table
25−:ref:`configured engines`.
10+ - :ref:`engine settings`
11+ - :ref:`engine file`
2612
2713============= =========== ==================== ============
2814:ref:`engine settings` :ref:`engine file`
@@ -33,20 +19,20 @@ Engine .. Paging support **P**
3319------------------------- -------------------- ------------
3420Shortcut **S** Language support **L**
3521Timeout **TO** Time range support **TR**
36−Disabled **D** Engine type **ET**
22+Disabled **D** Offline **O**
3723------------- ----------- -------------------- ------------
3824Safe search **SS**
3925------------- ----------- ---------------------------------
4026Weigth **W**
4127------------- ----------- ---------------------------------
4228Disabled **D**
43−------------- ----------- ---------------------------------
44−Show errors **DE**
4529============= =========== =================================
4630
31+Configuration defaults (at built time):
32+
4733.. _configured engines:
4834
49−.. jinja:: searx
35+.. jinja:: webapp
5036
5137 .. flat-table:: Engines configured at built time (defaults)
5238 :header-rows: 1
@@ -62,10 +48,9 @@ Show errors **DE**
6248 - SS
6349 - D
6450 - TR
65− - ET
66− - W
67− - D
68− - DE
51+ - O
52+ - W
53+ - D
6954
7055 {% for name, mod in engines.items() %}
7156
@@ -79,10 +64,8 @@ Show errors **DE**
7964 - {{(mod.safesearch and "y") or ""}}
8065 - {{(mod.disabled and "y") or ""}}
8166 - {{(mod.time_range_support and "y") or ""}}
82− - {{mod.engine_type or ""}}
67+ - {{(mod.offline and "y") or ""}}
8368 - {{mod.weight or 1 }}
8469 - {{(mod.disabled and "y") or ""}}
85− - {{(mod.display_error_messages and "y") or ""}}
8670
8771 {% endfor %}
88−
_sources/admin/filtron.rst.txtnew file+200
@@ -0,0 +1,200 @@
1+
2+.. _searx filtron:
3+
4+==========================
5+How to protect an instance
6+==========================
7+
8+.. sidebar:: further reading
9+
10+ - :ref:`filtron.sh`
11+ - :ref:`nginx searx site`
12+
13+
14+.. contents:: Contents
15+ :depth: 2
16+ :local:
17+ :backlinks: entry
18+
19+.. _filtron: https://github.com/asciimoo/filtron
20+
21+Searx depends on external search services. To avoid the abuse of these services
22+it is advised to limit the number of requests processed by searx.
23+
24+An application firewall, filtron_ solves exactly this problem. Filtron is just
25+a middleware between your web server (nginx, apache, ...) and searx, we describe
26+such infratructures in chapter: :ref:`architecture`.
27+
28+
29+filtron & go
30+============
31+
32+.. _Go: https://golang.org/
33+.. _filtron README: https://github.com/asciimoo/filtron/blob/master/README.md
34+
35+Filtron needs Go_ installed. If Go_ is preinstalled, filtron_ is simply
36+installed by ``go get`` package management (see `filtron README`_). If you use
37+filtron as middleware, a more isolated setup is recommended. To simplify such
38+an installation and the maintenance of, use our script :ref:`filtron.sh`.
39+
40+.. _Sample configuration of filtron:
41+
42+Sample configuration of filtron
43+===============================
44+
45+.. sidebar:: Tooling box
46+
47+ - :origin:`/etc/filtron/rules.json <utils/templates/etc/filtron/rules.json>`
48+
49+An example configuration can be find below. This configuration limits the access
50+of:
51+
52+- scripts or applications (roboagent limit)
53+- webcrawlers (botlimit)
54+- IPs which send too many requests (IP limit)
55+- too many json, csv, etc. requests (rss/json limit)
56+- the same UserAgent of if too many requests (useragent limit)
57+
58+.. code:: json
59+
60+ [
61+ { "name": "search request",
62+ "filters": [
63+ "Param:q",
64+ "Path=^(/|/search)$"
65+ ],
66+ "interval": "<time-interval-in-sec (int)>",
67+ "limit": "<max-request-number-in-interval (int)>",
68+ "subrules": [
69+ {
70+ "name": "roboagent limit",
71+ "interval": "<time-interval-in-sec (int)>",
72+ "limit": "<max-request-number-in-interval (int)>",
73+ "filters": [
74+ "Header:User-Agent=(curl|cURL|Wget|python-requests|Scrapy|FeedFetcher|Go-http-client)"
75+ ],
76+ "actions": [
77+ { "name": "log"},
78+ { "name": "block",
79+ "params": {
80+ "message": "Rate limit exceeded"
81+ }
82+ }
83+ ]
84+ },
85+ {
86+ "name": "botlimit",
87+ "limit": 0,
88+ "stop": true,
89+ "filters": [
90+ "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)"
91+ ],
92+ "actions": [
93+ { "name": "log"},
94+ { "name": "block",
95+ "params": {
96+ "message": "Rate limit exceeded"
97+ }
98+ }
99+ ]
100+ },
101+ {
102+ "name": "IP limit",
103+ "interval": "<time-interval-in-sec (int)>",
104+ "limit": "<max-request-number-in-interval (int)>",
105+ "stop": true,
106+ "aggregations": [
107+ "Header:X-Forwarded-For"
108+ ],
109+ "actions": [
110+ { "name": "log"},
111+ { "name": "block",
112+ "params": {
113+ "message": "Rate limit exceeded"
114+ }
115+ }
116+ ]
117+ },
118+ {
119+ "name": "rss/json limit",
120+ "interval": "<time-interval-in-sec (int)>",
121+ "limit": "<max-request-number-in-interval (int)>",
122+ "stop": true,
123+ "filters": [
124+ "Param:format=(csv|json|rss)"
125+ ],
126+ "actions": [
127+ { "name": "log"},
128+ { "name": "block",
129+ "params": {
130+ "message": "Rate limit exceeded"
131+ }
132+ }
133+ ]
134+ },
135+ {
136+ "name": "useragent limit",
137+ "interval": "<time-interval-in-sec (int)>",
138+ "limit": "<max-request-number-in-interval (int)>",
139+ "aggregations": [
140+ "Header:User-Agent"
141+ ],
142+ "actions": [
143+ { "name": "log"},
144+ { "name": "block",
145+ "params": {
146+ "message": "Rate limit exceeded"
147+ }
148+ }
149+ ]
150+ }
151+ ]
152+ }
153+ ]
154+
155+
156+.. _filtron route request:
157+
158+Route request through filtron
159+=============================
160+
161+.. sidebar:: further reading
162+
163+ - :ref:`filtron.sh overview`
164+ - :ref:`installation nginx`
165+ - :ref:`installation apache`
166+
167+Filtron can be started using the following command:
168+
169+.. code:: sh
170+
171+ $ filtron -rules rules.json
172+
173+It listens on ``127.0.0.1:4004`` and forwards filtered requests to
174+``127.0.0.1:8888`` by default.
175+
176+Use it along with ``nginx`` with the following example configuration.
177+
178+.. code:: nginx
179+
180+ # https://example.org/searx
181+
182+ location /searx {
183+ proxy_pass http://127.0.0.1:4004/;
184+
185+ proxy_set_header Host $http_host;
186+ proxy_set_header Connection $http_connection;
187+ proxy_set_header X-Real-IP $remote_addr;
188+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
189+ proxy_set_header X-Scheme $scheme;
190+ proxy_set_header X-Script-Name /searx;
191+ }
192+
193+ location /searx/static {
194+ /usr/local/searx/searx-src/searx/static;
195+ }
196+
197+
198+Requests are coming from port 4004 going through filtron and then forwarded to
199+port 8888 where a searx is being run. For a complete setup see: :ref:`nginx
200+searx site`.
docs/admin/index.rst → _sources/admin/index.rst.txtrenamed

The content is the same.

docs/admin/installation-apache.rst → _sources/admin/installation-apache.rst.txtrenamed+7−8
@@ -180,6 +180,10 @@ modules and create a `Location`_ configuration for the searx site. In most
180180distributions you have to un-comment the lines in the main configuration file,
181181except in :ref:`The Debian Layout`.
182182
183+To pass the HTTP HOST header
184+With ProxyPreserveHost_ the incoming Host HTTP request header is passed to the
185+proxied host.
186+
183187.. tabs::
184188
185189 .. group-tab:: Ubuntu / debian
@@ -227,11 +231,6 @@ except in :ref:`The Debian Layout`.
227231 LoadModule proxy_module modules/mod_proxy.so
228232 LoadModule proxy_http_module modules/mod_proxy_http.so
229233
230−With ProxyPreserveHost_ the incoming Host HTTP request header is passed to the
231−proxied host.
232−
233−.. _apache searx via filtron plus morty:
234−
235234.. tabs::
236235
237236 .. group-tab:: searx via filtron plus morty
@@ -286,15 +285,15 @@ proxied host.
286285
287286 </Location>
288287
289− For a fully result proxification add :ref:`morty's <searx morty>` **public
290− URL** to your :origin:`searx/settings.yml`:
288+ Note that reverse proxy advised to be used in case of single-user or
289+ low-traffic instances. For a fully result proxification add :ref:`morty's
290+ <searx morty>` **public URL** to your :origin:`searx/settings.yml`:
291291
292292 .. code:: yaml
293293
294294 result_proxy:
295295 # replace example.org with your server's public name
296296 url : https://example.org/morty
297− key : !!binary "insert_your_morty_proxy_key_here"
298297
299298 server:
300299 image_proxy : True
_sources/admin/installation-docker.rst.txtnew file+28
@@ -0,0 +1,28 @@
1+.. _installation docker:
2+
3+===================
4+Docker installation
5+===================
6+
7+.. contents:: Contents
8+ :depth: 2
9+ :local:
10+ :backlinks: entry
11+
12+Make sure you have installed Docker. For instance, you can deploy searx like this:
13+
14+.. code:: sh
15+
16+ docker pull wonderfall/searx
17+ docker run -d --name searx -p $PORT:8888 wonderfall/searx
18+
19+Go to ``http://localhost:$PORT``.
20+
21+See https://hub.docker.com/r/wonderfall/searx/ for more informations. It's also
22+possible to build searx from the embedded Dockerfile.
23+
24+.. code:: sh
25+
26+ git clone https://github.com/asciimoo/searx.git
27+ cd searx
28+ docker build -t whatever/searx .
docs/admin/installation-nginx.rst → _sources/admin/installation-nginx.rst.txtrenamed+13−15
@@ -9,7 +9,7 @@ Install with nginx
99.. _nginx server configuration:
1010 https://docs.nginx.com/nginx/admin-guide/web-server/web-server/#setting-up-virtual-servers
1111.. _nginx beginners guide:
12− https://nginx.org/en/docs/beginners_guide.html
12+ http://nginx.org/en/docs/beginners_guide.html
1313.. _Getting Started wiki:
1414 https://www.nginx.com/resources/wiki/start/
1515.. _uWSGI support from nginx:
@@ -163,8 +163,6 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
163163 Create configuration at ``/etc/nginx/conf.d/searx`` and place a
164164 symlink to sites-enabled:
165165
166−.. _nginx searx via filtron plus morty:
167−
168166.. tabs::
169167
170168 .. group-tab:: searx via filtron plus morty
@@ -182,7 +180,7 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
182180 location /searx {
183181 proxy_pass http://127.0.0.1:4004/;
184182
185− proxy_set_header Host $host;
183+ proxy_set_header Host $http_host;
186184 proxy_set_header Connection $http_connection;
187185 proxy_set_header X-Real-IP $remote_addr;
188186 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@@ -190,8 +188,8 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
190188 proxy_set_header X-Script-Name /searx;
191189 }
192190
193− location /searx/static/ {
194− alias /usr/local/searx/searx-src/searx/static/;
191+ location /searx/static {
192+ /usr/local/searx/searx-src/searx/static;
195193 }
196194
197195
@@ -205,28 +203,28 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
205203 location /morty {
206204 proxy_pass http://127.0.0.1:3000/;
207205
208− proxy_set_header Host $host;
206+ proxy_set_header Host $http_host;
209207 proxy_set_header Connection $http_connection;
210208 proxy_set_header X-Real-IP $remote_addr;
211209 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
212210 proxy_set_header X-Scheme $scheme;
213211 }
214212
215− For a fully result proxification add :ref:`morty's <searx morty>` **public
216− URL** to your :origin:`searx/settings.yml`:
213+ Note that reverse proxy advised to be used in case of single-user or
214+ low-traffic instances. For a fully result proxification add :ref:`morty's
215+ <searx morty>` **public URL** to your :origin:`searx/settings.yml`:
217216
218217 .. code:: yaml
219218
220219 result_proxy:
221220 # replace example.org with your server's public name
222221 url : https://example.org/morty
223− key : !!binary "insert_your_morty_proxy_key_here"
224222
225223 server:
226224 image_proxy : True
227225
228226
229− .. group-tab:: proxy or uWSGI
227+ .. group-tab:: proxy or uWSGI
230228
231229 Be warned, with this setup, your instance isn't :ref:`protected <searx
232230 filtron>`. Nevertheless it is good enough for intranet usage and it is a
@@ -309,8 +307,8 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
309307 proxy_buffering off;
310308 }
311309
312− location /searx/static/ {
313− alias /usr/local/searx/searx-src/searx/static/;
310+ location /searx/static {
311+ alias /usr/local/searx/searx-src/searx/static;
314312 }
315313
316314 The ``X-Script-Name /searx`` is needed by the searx implementation to
@@ -328,8 +326,8 @@ Started wiki`_ is always a good resource *to keep in the pocket*.
328326 uwsgi_pass unix:/run/uwsgi/app/searx/socket;
329327 }
330328
331− location /searx/static/ {
332− alias /usr/local/searx/searx-src/searx/;
329+ location /searx/static {
330+ alias /usr/local/searx/searx-src/searx;
333331 }
334332
335333 For searx to work correctly the ``base_url`` must be set in the
docs/admin/installation-searx.rst → _sources/admin/installation-searx.rst.txtrenamed+13−41
@@ -17,7 +17,7 @@ universe repository.
1717Install packages
1818================
1919
20−.. kernel-include:: $DOCS_BUILD/includes/searx.rst
20+.. include:: ../../build/docs/includes/searx.rst
2121 :start-after: START distro-packages
2222 :end-before: END distro-packages
2323
@@ -30,7 +30,7 @@ Install packages
3030Create user
3131===========
3232
33−.. kernel-include:: $DOCS_BUILD/includes/searx.rst
33+.. include:: ../../build/docs/includes/searx.rst
3434 :start-after: START create user
3535 :end-before: END create user
3636
@@ -41,68 +41,40 @@ install searx & dependencies
4141
4242Start a interactive shell from new created user and clone searx:
4343
44−.. kernel-include:: $DOCS_BUILD/includes/searx.rst
44+.. include:: ../../build/docs/includes/searx.rst
4545 :start-after: START clone searx
4646 :end-before: END clone searx
4747
4848In the same shell create *virtualenv*:
4949
50−.. kernel-include:: $DOCS_BUILD/includes/searx.rst
50+.. include:: ../../build/docs/includes/searx.rst
5151 :start-after: START create virtualenv
5252 :end-before: END create virtualenv
5353
5454To install searx's dependencies, exit the searx *bash* session you opened above
55−and restart a new. Before install, first check if your *virtualenv* was sourced
55+and restart a new. Before install, first check if your *virualenv* was sourced
5656from the login (*~/.profile*):
5757
58−.. kernel-include:: $DOCS_BUILD/includes/searx.rst
58+.. include:: ../../build/docs/includes/searx.rst
5959 :start-after: START manage.sh update_packages
6060 :end-before: END manage.sh update_packages
6161
6262.. tip::
6363
64− Open a second terminal for the configuration tasks and leave the ``(searx)$``
64+ Open a second terminal for the configuration tasks and left the ``(searx)$``
6565 terminal open for the tasks below.
6666
67−
68−.. _use_default_settings.yml:
69−
7067Configuration
71−=============
72−
73−.. sidebar:: ``use_default_settings: True``
68+==============
7469
75− - :ref:`settings global`
76− - :ref:`settings location`
77− - :ref:`settings use_default_settings`
78− - :origin:`/etc/searx/settings.yml <utils/templates/etc/searx/use_default_settings.yml>`
70+Create a copy of the :origin:`searx/settings.yml` configuration file in system's
71+*/etc* folder. Configure like shown below -- replace ``searx@\$(uname -n)`` with
72+a name of your choice -- *and/or* edit ``/etc/searx/settings.yml`` if necessary.
7973
80−To create a initial ``/etc/searx/settings.yml`` you can start with a copy of the
81−file :origin:`utils/templates/etc/searx/use_default_settings.yml`. This setup
82−:ref:`use default settings <settings use_default_settings>` from
83−:origin:`searx/settings.yml` and is recommended since :pull:`2291` is merged.
84−
85−For a *minimal setup*, configure like shown below – replace ``searx@$(uname
86−-n)`` with a name of your choice, set ``ultrasecretkey`` -- *and/or* edit
87−``/etc/searx/settings.yml`` to your needs.
88−
89−.. kernel-include:: $DOCS_BUILD/includes/searx.rst
74+.. include:: ../../build/docs/includes/searx.rst
9075 :start-after: START searx config
9176 :end-before: END searx config
9277
93−.. tabs::
94−
95− .. group-tab:: Use default settings
96−
97− .. literalinclude:: ../../utils/templates/etc/searx/use_default_settings.yml
98− :language: yaml
99−
100− .. group-tab:: searx/settings.yml
101−
102− .. literalinclude:: ../../searx/settings.yml
103− :language: yaml
104−
105−
10678Check
10779=====
10880
@@ -110,7 +82,7 @@ To check your searx setup, optional enable debugging and start the *webapp*.
11082Searx looks at the exported environment ``$SEARX_SETTINGS_PATH`` for a
11183configuration file.
11284
113−.. kernel-include:: $DOCS_BUILD/includes/searx.rst
85+.. include:: ../../build/docs/includes/searx.rst
11486 :start-after: START check searx installation
11587 :end-before: END check searx installation
11688
docs/admin/installation-uwsgi.rst → _sources/admin/installation-uwsgi.rst.txtrenamed+11−12
@@ -104,23 +104,21 @@ restart the uwsgi application.
104104
105105 .. group-tab:: Ubuntu / debian
106106
107− .. kernel-include:: $DOCS_BUILD/includes/searx.rst
107+ .. literalinclude:: ../../build/docs/includes/searx.rst
108108 :start-after: START searx uwsgi-description ubuntu-20.04
109109 :end-before: END searx uwsgi-description ubuntu-20.04
110110
111− .. hotfix: a bug group-tab need this comment
112111
113112 .. group-tab:: Arch Linux
114113
115− .. kernel-include:: $DOCS_BUILD/includes/searx.rst
114+ .. literalinclude:: ../../build/docs/includes/searx.rst
116115 :start-after: START searx uwsgi-description arch
117116 :end-before: END searx uwsgi-description arch
118117
119− .. hotfix: a bug group-tab need this comment
120118
121119 .. group-tab:: Fedora / RHEL
122120
123− .. kernel-include:: $DOCS_BUILD/includes/searx.rst
121+ .. literalinclude:: ../../build/docs/includes/searx.rst
124122 :start-after: START searx uwsgi-description fedora
125123 :end-before: END searx uwsgi-description fedora
126124
@@ -129,22 +127,23 @@ restart the uwsgi application.
129127
130128 .. group-tab:: Ubuntu / debian
131129
132− .. kernel-include:: $DOCS_BUILD/includes/searx.rst
130+ .. literalinclude:: ../../build/docs/includes/searx.rst
131+ :language: ini
133132 :start-after: START searx uwsgi-appini ubuntu-20.04
134133 :end-before: END searx uwsgi-appini ubuntu-20.04
135134
136− .. hotfix: a bug group-tab need this comment
137−
138135 .. group-tab:: Arch Linux
139136
140− .. kernel-include:: $DOCS_BUILD/includes/searx.rst
137+ .. literalinclude:: ../../build/docs/includes/searx.rst
138+ :language: ini
141139 :start-after: START searx uwsgi-appini arch
142140 :end-before: END searx uwsgi-appini arch
143141
144− .. hotfix: a bug group-tab need this comment
145−
146142 .. group-tab:: Fedora / RHEL
147143
148− .. kernel-include:: $DOCS_BUILD/includes/searx.rst
144+ .. literalinclude:: ../../build/docs/includes/searx.rst
145+ :language: ini
149146 :start-after: START searx uwsgi-appini fedora
150147 :end-before: END searx uwsgi-appini fedora
148+
149+
docs/admin/installation.rst → _sources/admin/installation.rst.txtrenamed+1−25
@@ -25,32 +25,16 @@ box <toolboxing>` as described below.
2525Installation scripts
2626====================
2727
28−.. sidebar:: Update OS first!
29−
30− To avoid unwanted side effects, update your OS before installing searx.
31−
3228The following will install a setup as shown in :ref:`architecture`. First you
3329need to get a clone. The clone is only needed for the installation procedure
3430and some maintenance tasks (alternatively you can create your own fork).
3531
36−For the installation procedure, use a *sudoer* login to run the scripts. If you
37−install from ``root``, take into account that the scripts are creating a
38−``searx``, a ``filtron`` and a ``morty`` user. In the installation procedure
39−these new created users do need read access to the clone of searx, which is not
40−the case if you clone into a folder below ``/root``.
41−
4232.. code:: bash
4333
4434 $ cd ~/Downloads
45− $ git clone https://github.com/searx/searx searx
35+ $ git clone https://github.com/asciimoo/searx searx
4636 $ cd searx
4737
48−.. sidebar:: further read
49−
50− - :ref:`toolboxing`
51− - :ref:`update searx`
52− - :ref:`inspect searx`
53−
5438**Install** :ref:`searx service <searx.sh>`
5539
5640This installs searx as described in :ref:`installation basic`.
@@ -76,11 +60,3 @@ If all services are running fine, you can add it to your HTTP server:
7660- :ref:`installation apache`
7761- :ref:`installation nginx`
7862
79−.. _git stash: https://git-scm.com/docs/git-stash
80−
81−.. tip::
82−
83− About script's installation options have a look at chapter :ref:`toolboxing
84− setup`. How to brand your instance see chapter :ref:`settings global`. To
85− *stash* your instance's setup, `git stash`_ your clone's :origin:`Makefile`
86− and :origin:`.config.sh` file .
docs/admin/morty.rst → _sources/admin/morty.rst.txtrenamed+4−11
@@ -16,22 +16,15 @@ By default searx can only act as an image proxy for result images, but it is
1616possible to proxify all the result URLs with an external service, morty_.
1717
1818To use this feature, morty has to be installed and activated in searx's
19−``settings.yml``. Add the following snippet to your ``settings.yml`` and
20−restart searx:
19+``settings.yml``.
20+
21+Add the following snippet to your ``settings.yml`` and restart searx:
2122
2223.. code:: yaml
2324
2425 result_proxy:
2526 url : http://127.0.0.1:3000/
26− key : !!binary "insert_your_morty_proxy_key_here"
27−
28−Note that the example above (``http://127.0.0.1:3000``) is only for single-user
29−instances without a HTTP proxy. If your morty service is public, the url is the
30−address of the reverse proxy (e.g ``https://example.org/morty``).
31−
32−For more information about *result proxy* have a look at *"searx via filtron
33−plus morty"* in the :ref:`nginx <nginx searx via filtron plus morty>` and
34−:ref:`apache <apache searx via filtron plus morty>` sections.
27+ key : your_morty_proxy_key
3528
3629``url``
3730 Is the address of the running morty service.
docs/admin/plugins.rst → _sources/admin/plugins.rst.txtrenamed+1−1
@@ -14,7 +14,7 @@ Configuration defaults (at built time):
1414
1515.. _configured plugins:
1616
17−.. jinja:: searx
17+.. jinja:: webapp
1818
1919 .. flat-table:: Plugins configured at built time (defaults)
2020 :header-rows: 1
_sources/admin/settings.rst.txtnew file+187
@@ -0,0 +1,187 @@
1+.. _settings.yml:
2+
3+================
4+``settings.yml``
5+================
6+
7+This page describe the options possibilities of the :origin:`searx/settings.yml`
8+file.
9+
10+.. sidebar:: Further reading ..
11+
12+ - :ref:`search API`
13+
14+.. contents:: Contents
15+ :depth: 2
16+ :local:
17+ :backlinks: entry
18+
19+.. _settings global:
20+
21+Global Settings
22+===============
23+
24+.. code:: yaml
25+
26+ server:
27+ port : 8888
28+ secret_key : "ultrasecretkey" # change this!
29+ debug : False # debug mode, only for development
30+ request_timeout : 2.0 # seconds
31+ base_url : False # set custom base_url (or False)
32+ themes_path : "" # custom ui themes path
33+ default_theme : oscar # ui theme
34+ useragent_suffix : "" # suffix of searx_useragent, could contain
35+ # informations like admins email address
36+ image_proxy : False # proxying image results through searx
37+ default_locale : "" # default interface locale
38+
39+ # uncomment below section if you want to use a proxy
40+
41+ #outgoing_proxies :
42+ # http : http://127.0.0.1:8080
43+ # https: http://127.0.0.1:8080
44+
45+ # uncomment below section only if you have more than one network interface
46+ # which can be the source of outgoing search requests
47+
48+ #source_ips:
49+ # - 1.1.1.1
50+ # - 1.1.1.2
51+
52+ locales:
53+ en : English
54+ de : Deutsch
55+ he : Hebrew
56+ hu : Magyar
57+ fr : Français
58+ es : Español
59+ it : Italiano
60+ nl : Nederlands
61+ ja : 日本語 (Japanese)
62+ tr : Türkçe
63+ ru : Russian
64+ ro : Romanian
65+
66+
67+``port`` :
68+ Port number of the searx web application if you run it directly using ``python
69+ searx/webapp.py``. Doesn't apply to searx running on Apache or Nginx.
70+
71+``secret_key`` :
72+ Used for cryptography purpose.
73+
74+``debug`` :
75+ Allow a more detailed log if you run searx directly. Display *detailed* error
76+ messages in the browser too, so this must be deactivated in production.
77+
78+``request_timeout`` :
79+ Global timeout of the requests made to others engines in seconds. A bigger
80+ timeout will allow to wait for answers from slow engines, but in consequence
81+ will slow searx reactivity (the result page may take the time specified in the
82+ timeout to load)
83+
84+``base_url`` :
85+ The base URL where searx is deployed. Used to create correct inbound links.
86+
87+``themes_path`` :
88+ Path to where the themes are located. If you didn't develop anything, leave it
89+ blank.
90+
91+``default_theme`` :
92+ Name of the theme you want to use by default on you searx instance.
93+
94+``useragent_suffix`` :
95+ Suffix to the user-agent searx uses to send requests to others engines. If an
96+ engine wish to block you, a contact info here may be useful to avoid that.
97+
98+``image_proxy`` :
99+ Allow your instance of searx of being able to proxy images. Uses memory space.
100+
101+``default_locale`` :
102+ Aearx interface language. If blank, the locale is detected by using the
103+ browser language. If it doesn't work, or you are deploying a language
104+ specific instance of searx, a locale can be defined using an ISO language
105+ code, like ``fr``, ``en``, ``de``.
106+
107+.. _requests proxies: http://docs.python-requests.org/en/latest/user/advanced/#proxies
108+.. _PR SOCKS support: https://github.com/kennethreitz/requests/pull/478
109+
110+``outgoing_proxies`` :
111+ Define a proxy you wish to use, see `requests proxies`_. SOCKS proxies are
112+ not supported / see `PR SOCKS support`.
113+
114+``source_ips`` :
115+ If you use multiple nework interfaces, define from which IP the requests must
116+ be made.
117+
118+``locales`` :
119+ Locales codes and their names. Available translations of searx interface.
120+
121+
122+.. _settings engine:
123+
124+Engine settings
125+===============
126+
127+.. sidebar:: Further reading ..
128+
129+ - :ref:`engines-dev`
130+
131+.. code:: yaml
132+
133+ - name : bing
134+ engine : bing
135+ shortcut : bi
136+ base_url : 'https://{language}.wikipedia.org/'
137+ categories : general
138+ timeout : 3.0
139+ api_key : 'apikey'
140+ disabled : True
141+ language : en_US
142+
143+``name`` :
144+ Name that will be used accross searx to define this engine. In settings, on
145+ the result page...
146+
147+``engine`` :
148+ Name of the python file used to handle requests and responses to and from this
149+ search engine.
150+
151+``shortcut`` :
152+ Code used to execute bang requests (in this case using ``!bi`` or ``?bi``)
153+
154+``base_url`` : optional
155+ Part of the URL that should be stable accross every request. Can be useful to
156+ use multiple sites using only one engine, or updating the site URL without
157+ touching at the code.
158+
159+``categories`` : optional
160+ Define in which categories this engine will be active. Most of the time, it is
161+ defined in the code of the engine, but in a few cases it is useful, like when
162+ describing multiple search engine using the same code.
163+
164+``timeout`` : optional
165+ Timeout of the search with the current search engine. **Be careful, it will
166+ modify the global timeout of searx.**
167+
168+``api_key`` : optional
169+ In a few cases, using an API needs the use of a secret key. How to obtain them
170+ is described in the file.
171+
172+``disabled`` : optional
173+ To disable by default the engine, but not deleting it. It will allow the user
174+ to manually activate it in the settings.
175+
176+``language`` : optional
177+ If you want to use another language for a specific engine, you can define it
178+ by using the full ISO code of language and country, like ``fr_FR``, ``en_US``,
179+ ``de_DE``.
180+
181+``weigth`` : default ``1``
182+ Weighting of the results of this engine.
183+
184+.. note::
185+
186+ A few more options are possible, but they are pretty specific to some
187+ engines, and so won't be described here.
_sources/admin/update-searx.rst.txtnew file+23
@@ -0,0 +1,23 @@
1+.. _update searx:
2+
3+=============
4+How to update
5+=============
6+
7+.. code:: sh
8+
9+ sudo -H -u searx -i
10+ (searx)$ git stash
11+ (searx)$ git pull origin master
12+ (searx)$ git stash apply
13+ (searx)$ ./manage.sh update_packages
14+
15+Restart uwsgi:
16+
17+.. tabs::
18+
19+ .. group-tab:: Ubuntu / debian
20+
21+ .. code:: sh
22+
23+ sudo -H systemctl restart uwsgi
docs/blog/admin.rst → _sources/blog/admin.rst.txtrenamed

The content is the same.

_sources/blog/index.rst.txtnew file+12
@@ -0,0 +1,12 @@
1+====
2+Blog
3+====
4+
5+.. toctree::
6+ :maxdepth: 2
7+ :caption: Contents
8+
9+ python3
10+ admin
11+ intro-offline
12+ private-engines
docs/blog/intro-offline.rst → _sources/blog/intro-offline.rst.txtrenamed

The content is the same.

docs/blog/private-engines.rst → _sources/blog/private-engines.rst.txtrenamed+1−3
@@ -7,15 +7,13 @@ enabled engines on their instances. It might be because they do not want to
77expose some private information through an offline engine. Or they
88would rather share engines only with their trusted friends or colleagues.
99
10−.. _private engines:
11−
1210Private engines
1311===============
1412
1513To solve this issue private engines were introduced in :pull:`1823`.
1614A new option was added to engines named `tokens`. It expects a list
1715of strings. If the user making a request presents one of the tokens
18−of an engine, they can access information about the engine
16+of an engine, he/she is able to access information about the engine
1917and make search requests.
2018
2119Example configuration to restrict access to the Arch Linux Wiki engine:
docs/blog/python3.rst → _sources/blog/python3.rst.txtrenamed+1−1
@@ -54,7 +54,7 @@ If you found bugs
5454Please open an issue on `GitHub`_. Make sure that you mention your Python
5555version in your issue, so we can investigate it properly.
5656
57−.. _GitHub: https://github.com/searx/searx/issues
57+.. _GitHub: https://github.com/asciimoo/searx/issues
5858
5959Acknowledgment
6060==============
docs/dev/contribution_guide.rst → _sources/dev/contribution_guide.rst.txtrenamed+25−29
@@ -87,7 +87,7 @@ In order to submit a patch, please follow the steps below:
8787
8888- Add yourself to the :origin:`AUTHORS.rst` file.
8989
90−- Choose meaningful commit messages, read `Conventional Commits`_
90+- Choose meaning full commit messages, read `Conventional Commits`_
9191
9292 .. code::
9393
@@ -117,8 +117,8 @@ Translation currently takes place on :ref:`transifex <translation>`.
117117Documentation
118118=============
119119
120−.. _Sphinx: https://www.sphinx-doc.org
121−.. _reST: https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html
120+.. _Sphinx: http://www.sphinx-doc.org
121+.. _reST: http://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html
122122
123123.. sidebar:: The reST sources
124124
@@ -132,58 +132,54 @@ Here is an example which makes a complete rebuild:
132132
133133.. code:: sh
134134
135− $ make docs.clean docs.html
135+ $ make docs-clean docs
136136 ...
137137 The HTML pages are in dist/docs.
138138
139−.. _make docs.live:
139+.. _make docs-live:
140140
141141live build
142142----------
143143
144−.. _sphinx-autobuild:
145− https://github.com/executablebooks/sphinx-autobuild/blob/master/README.md
146−
147−.. sidebar:: docs.clean
144+.. sidebar:: docs-clean
148145
149146 It is recommended to assert a complete rebuild before deploying (use
150− ``docs.clean``).
147+ ``docs-clean``).
151148
152149Live build is like WYSIWYG. If you want to edit the documentation, its
153−recommended to use. The Makefile target ``docs.live`` builds the docs, opens
150+recommended to use. The Makefile target ``docs-live`` builds the docs, opens
154151URL in your favorite browser and rebuilds every time a reST file has been
155152changed.
156153
157154.. code:: sh
158155
159− $ make docs.live
156+ $ make docs-live
160157 ...
161158 The HTML pages are in dist/docs.
162− ... Serving on http://0.0.0.0:8000
159+ ... Serving on http://0.0.0.0:8080
163160 ... Start watching changes
164161
165−Live builds are implemented by sphinx-autobuild_. Use environment
166−``$(SPHINXOPTS)`` to pass arguments to the sphinx-autobuild_ command. Except
167−option ``--host`` (which is always set to ``0.0.0.0``) you can pass any
168−argument. E.g to find and use a free port, use:
169−
170−.. code:: sh
171−
172− $ SPHINXOPTS="--port 0" make docs.live
173− ...
174− ... Serving on http://0.0.0.0:50593
175− ...
176−
177162
178163.. _deploy on github.io:
179164
180165deploy on github.io
181166-------------------
182167
183−To deploy documentation at :docs:`github.io <.>` use Makefile target :ref:`make
184−docs.gh-pages`, which builds the documentation and runs all the needed git add,
185−commit and push:
168+To deploy documentation at :docs:`github.io <.>` use Makefile target
169+:ref:`make gh-pages`, which will builds the documentation, clones searx into a sub
170+folder ``gh-pages``, cleans it, copies the doc build into and runs all the
171+needed git add, commit and push:
186172
187173.. code:: sh
188174
189− $ make docs.clean docs.gh-pages
175+ $ make docs-clean gh-pages
176+ ...
177+ SPHINX docs --> file://<...>/dist/docs
178+ The HTML pages are in dist/docs.
179+ ...
180+ Cloning into 'gh-pages' ...
181+ ...
182+ cd gh-pages; git checkout gh-pages >/dev/null
183+ Switched to a new branch 'gh-pages'
184+ ...
185+ doc available at --> https://asciimoo.github.io/searx
docs/dev/engine_overview.rst → _sources/dev/engine_overview.rst.txtrenamed+31−70
@@ -18,9 +18,6 @@ engines. Adapters are stored under the folder :origin:`searx/engines`.
1818 :depth: 3
1919 :backlinks: entry
2020
21−
22−.. _general engine configuration:
23−
2421general engine configuration
2522============================
2623
@@ -37,36 +34,30 @@ settings. However, the standard way is the following:
3734engine file
3835-----------
3936
40−======================= =========== ========================================================
37+======================= =========== ===========================================
4138argument type information
42−======================= =========== ========================================================
39+======================= =========== ===========================================
4340categories list pages, in which the engine is working
4441paging boolean support multible pages
42+language_support boolean support language choosing
4543time_range_support boolean support search time range
46−engine_type str ``online`` by default, other possibles values are
47− ``offline``, ``online_dictionnary``, ``online_currency``
48−======================= =========== ========================================================
44+offline boolean engine runs offline
45+======================= =========== ===========================================
4946
5047.. _engine settings:
5148
5249settings.yml
5350------------
5451
55−======================= =========== =============================================
52+======================= =========== ===========================================
5653argument type information
57−======================= =========== =============================================
54+======================= =========== ===========================================
5855name string name of search-engine
5956engine string name of searx-engine
6057 (filename without ``.py``)
61−enable_http bool enable HTTP
62− (by default only HTTPS is enabled).
6358shortcut string shortcut of search-engine
6459timeout string specific timeout for search-engine
65−display_error_messages boolean display error messages on the web UI
66−proxies dict set proxies for a specific engine
67− (e.g. ``proxies : {http: socks5://proxy:port,
68− https: socks5://proxy:port}``)
69−======================= =========== =============================================
60+======================= =========== ===========================================
7061
7162
7263overrides
@@ -98,6 +89,7 @@ example code
9889 # engine dependent config
9990 categories = ['general']
10091 paging = True
92+ language_support = True
10193
10294
10395making a request
@@ -112,48 +104,21 @@ passed arguments
112104These arguments can be used to construct the search query. Furthermore,
113105parameters with default value can be redefined for special purposes.
114106
115−If the ``engine_type`` is ``online```:
116−
117−====================== ============== ========================================================================
118−argument type default-value, information
119−====================== ============== ========================================================================
120−url str ``''``
121−method str ``'GET'``
122−headers set ``{}``
123−data set ``{}``
124−cookies set ``{}``
125−verify bool ``True``
126−headers.User-Agent str a random User-Agent
127−category str current category, like ``'general'``
128−safesearch int ``0``, between ``0`` and ``2`` (normal, moderate, strict)
129−time_range Optional[str] ``None``, can be ``day``, ``week``, ``month``, ``year``
130−pageno int current pagenumber
131−language str specific language code like ``'en_US'``, or ``'all'`` if unspecified
132−====================== ============== ========================================================================
133−
134−
135−If the ``engine_type`` is ``online_dictionnary```, in addition to the ``online`` arguments:
136−
137107====================== ============ ========================================================================
138108argument type default-value, information
139109====================== ============ ========================================================================
140−from_lang str specific language code like ``'en_US'``
141−to_lang str specific language code like ``'en_US'``
142−query str the text query without the languages
143−====================== ============ ========================================================================
144−
145−If the ``engine_type`` is ``online_currency```, in addition to the ``online`` arguments:
146−
110+url string ``''``
111+method string ``'GET'``
112+headers set ``{}``
113+data set ``{}``
114+cookies set ``{}``
115+verify boolean ``True``
116+headers.User-Agent string a random User-Agent
117+category string current category, like ``'general'``
118+started datetime current date-time
119+pageno int current pagenumber
120+language string specific language code like ``'en_US'``, or ``'all'`` if unspecified
147121====================== ============ ========================================================================
148−argument type default-value, information
149−====================== ============ ========================================================================
150−amount float the amount to convert
151−from str ISO 4217 code
152−to str ISO 4217 code
153−from_name str currency name
154−to_name str currency name
155−====================== ============ ========================================================================
156−
157122
158123parsed arguments
159124----------------
@@ -162,20 +127,16 @@ The function ``def request(query, params):`` always returns the ``params``
162127variable. Inside searx, the following paramters can be used to specify a search
163128request:
164129
165−=================== =========== ==========================================================================
166−argument type information
167−=================== =========== ==========================================================================
168−url str requested url
169−method str HTTP request method
170−headers set HTTP header information
171−data set HTTP data information
172−cookies set HTTP cookies
173−verify bool Performing SSL-Validity check
174−follow_redirects bool Follow redirects
175−max_redirects int maximum redirects, hard limit
176−soft_max_redirects int maximum redirects, soft limit. Record an error but don't stop the engine
177−raise_for_httperror bool True by default: raise an exception if the HTTP code of response is >= 300
178−=================== =========== ==========================================================================
130+============ =========== =========================================================
131+argument type information
132+============ =========== =========================================================
133+url string requested url
134+method string HTTP request method
135+headers set HTTP header information
136+data set HTTP data information (parsed if ``method != 'GET'``)
137+cookies set HTTP cookies
138+verify boolean Performing SSL-Validity check
139+============ =========== =========================================================
179140
180141
181142example code
@@ -294,7 +255,7 @@ latitude latitude of result (in decimal format)
294255longitude longitude of result (in decimal format)
295256boundingbox boundingbox of result (array of 4. values
296257 ``[lat-min, lat-max, lon-min, lon-max]``)
297−geojson geojson of result (https://geojson.org/)
258+geojson geojson of result (http://geojson.org)
298259osm.type type of osm-object (if OSM-Result)
299260osm.id id of osm-object (if OSM-Result)
300261address.name name of object
docs/dev/index.rst → _sources/dev/index.rst.txtrenamed

The content is the same.

_sources/dev/makefile.rst.txtnew file+221
@@ -0,0 +1,221 @@
1+.. _makefile:
2+
3+================
4+Makefile Targets
5+================
6+
7+.. _gnu-make: https://www.gnu.org/software/make/manual/make.html#Introduction
8+
9+.. sidebar:: build environment
10+
11+ Before looking deeper at the targets, first read about :ref:`makefile setup`
12+ and :ref:`make pyenv`.
13+
14+ To install system requirements follow :ref:`buildhosts`.
15+
16+With the aim to simplify development cycles, started with :pull:`1756` a
17+``Makefile`` based boilerplate was added. If you are not familiar with
18+Makefiles, we recommend to read gnu-make_ introduction.
19+
20+The usage is simple, just type ``make {target-name}`` to *build* a target.
21+Calling the ``help`` target gives a first overview (``make help``):
22+
23+.. program-output:: bash -c "cd ..; make --no-print-directory help"
24+
25+
26+.. contents:: Contents
27+ :depth: 2
28+ :local:
29+ :backlinks: entry
30+
31+
32+.. _makefile setup:
33+
34+Makefile setup
35+==============
36+
37+.. _git stash: https://git-scm.com/docs/git-stash
38+
39+.. sidebar:: fork & upstream
40+
41+ Commit changes in your (local) branch, fork or whatever, but do not push them
42+ upstream / `git stash`_ is your friend.
43+
44+The main setup is done in the :origin:`Makefile`.
45+
46+.. literalinclude:: ../../Makefile
47+ :start-after: START Makefile setup
48+ :end-before: END Makefile setup
49+
50+:GIT_URL: Changes this, to point to your searx fork.
51+:GIT_BRANCH: Changes this, to point to your searx branch.
52+:SEARX_URL: Changes this, to point to your searx instance.
53+:DOCS_URL: If you host your own (*brand*) documentation, change this URL.
54+
55+If you change any of this build environment variables, you have to run ``make
56+buildenv``::
57+
58+ $ make buildenv
59+ build searx/brand.py
60+ build utils/brand.env
61+
62+.. _make pyenv:
63+
64+Python environment
65+==================
66+
67+.. sidebar:: activate environment
68+
69+ ``source ./local/py3/bin/activate``
70+
71+With Makefile we do no longer need to build up the virualenv manually (as
72+described in the :ref:`devquickstart` guide). Jump into your git working tree
73+and release a ``make pyenv``:
74+
75+.. code:: sh
76+
77+ $ cd ~/searx-clone
78+ $ make pyenv
79+ PYENV usage: source ./local/py3/bin/activate
80+ ...
81+
82+With target ``pyenv`` a development environment (aka virtualenv) was build up in
83+``./local/py3/``. To make a *developer install* of searx (:origin:`setup.py`)
84+into this environment, use make target ``install``:
85+
86+.. code:: sh
87+
88+ $ make install
89+ PYENV usage: source ./local/py3/bin/activate
90+ PYENV using virtualenv from ./local/py3
91+ PYENV install .
92+
93+You have never to think about intermediate targets like ``pyenv`` or
94+``install``, the ``Makefile`` chains them as requisites. Just run your main
95+target.
96+
97+.. sidebar:: drop environment
98+
99+ To get rid of the existing environment before re-build use :ref:`clean target
100+ <make clean>` first.
101+
102+If you think, something goes wrong with your ./local environment or you change
103+the :origin:`setup.py` file (or the requirements listed in
104+:origin:`requirements-dev.txt` and :origin:`requirements.txt`), you have to call
105+:ref:`make clean`.
106+
107+
108+.. _make run:
109+
110+``make run``
111+============
112+
113+To get up a running a developer instance simply call ``make run``. This enables
114+*debug* option in :origin:`searx/settings.yml`, starts a ``./searx/webapp.py``
115+instance, disables *debug* option again and opens the URL in your favorite WEB
116+browser (:man:`xdg-open`):
117+
118+.. code:: sh
119+
120+ $ make run
121+ PYENV usage: source ./local/py3/bin/activate
122+ PYENV install .
123+ ./local/py3/bin/python ./searx/webapp.py
124+ ...
125+ INFO:werkzeug: * Running on http://127.0.0.1:8888/ (Press CTRL+C to quit)
126+ ...
127+
128+.. _make clean:
129+
130+``make clean``
131+==============
132+
133+Drop all intermediate files, all builds, but keep sources untouched. Includes
134+target ``pyclean`` which drops ./local environment. Before calling ``make
135+clean`` stop all processes using :ref:`make pyenv`.
136+
137+.. code:: sh
138+
139+ $ make clean
140+ CLEAN pyclean
141+ CLEAN clean
142+
143+.. _make docs:
144+
145+``make docs docs-live docs-clean``
146+==================================
147+
148+We describe the usage of the ``doc*`` targets in the :ref:`How to contribute /
149+Documentation <contrib docs>` section. If you want to edit the documentation
150+read our :ref:`make docs-live` section. If you are working in your own brand,
151+adjust your :ref:`Makefile setup <makefile setup>`.
152+
153+
154+.. _make gh-pages:
155+
156+``make gh-pages``
157+=================
158+
159+To deploy on github.io first adjust your :ref:`Makefile setup <makefile
160+setup>`. For any further read :ref:`deploy on github.io`.
161+
162+.. _make test:
163+
164+``make test``
165+=============
166+
167+Runs a series of tests: ``test.pep8``, ``test.unit``, ``test.robot`` and does
168+additional :ref:`pylint checks <make pylint>`. You can run tests selective,
169+e.g.:
170+
171+.. code:: sh
172+
173+ $ make test.pep8 test.unit test.sh
174+ . ./local/py3/bin/activate; ./manage.sh pep8_check
175+ [!] Running pep8 check
176+ . ./local/py3/bin/activate; ./manage.sh unit_tests
177+ [!] Running unit tests
178+
179+.. _make pylint:
180+
181+``make pylint``
182+===============
183+
184+.. _Pylint: https://www.pylint.org/
185+
186+Before commiting its recommend to do some (more) linting. Pylint_ is known as
187+one of the best source-code, bug and quality checker for the Python programming
188+language. Pylint_ is not yet a quality gate within our searx project (like
189+:ref:`test.pep8 <make test>` it is), but Pylint_ can help to improve code
190+quality anyway. The pylint profile we use at searx project is found in
191+project's root folder :origin:`.pylintrc`.
192+
193+Code quality is a ongoing process. Don't try to fix all messages from Pylint,
194+run Pylint and check if your changed lines are bringing up new messages. If so,
195+fix it. By this, code quality gets incremental better and if there comes the
196+day, the linting is balanced out, we might decide to add Pylint as a quality
197+gate.
198+
199+
200+``make pybuild``
201+================
202+
203+.. _PyPi: https://pypi.org/
204+.. _twine: https://twine.readthedocs.io/en/latest/
205+
206+Build Python packages in ``./dist/py``.
207+
208+.. code:: sh
209+
210+ $ make pybuild
211+ ...
212+ BUILD pybuild
213+ running sdist
214+ running egg_info
215+ ...
216+ $ ls ./dist/py/
217+ searx-0.15.0-py3-none-any.whl searx-0.15.0.tar.gz
218+
219+To upload packages to PyPi_, there is also a ``upload-pypi`` target. It needs
220+twine_ to be installed. Since you are not the owner of :pypi:`searx` you will
221+never need the latter.
docs/dev/plugins.rst → _sources/dev/plugins.rst.txtrenamed−15
@@ -30,21 +30,6 @@ Example plugin
3030 ctx['search'].suggestions.add('example')
3131 return True
3232
33−External plugins
34−================
35−
36−External plugins are standard python modules implementing all the requirements of the standard plugins.
37−Plugins can be enabled by adding them to :ref:`settings.yml`'s ``plugins`` section.
38−Example external plugin can be found `here <https://github.com/asciimoo/searx_external_plugin_example>`_.
39−
40−Register your plugin
41−====================
42−
43−To enable your plugin register your plugin in
44−searx > plugin > __init__.py.
45−And at the bottom of the file add your plugin like.
46−``plugins.register(name_of_python_file)``
47−
4833Plugin entry points
4934===================
5035
_sources/dev/quickstart.rst.txtnew file+132
@@ -0,0 +1,132 @@
1+.. _devquickstart:
2+
3+======================
4+Development Quickstart
5+======================
6+
7+.. sidebar:: :ref:`makefile`
8+
9+ For additional developer purpose there are :ref:`makefile`.
10+
11+This quickstart guide gets your environment set up with searx. Furthermore, it
12+gives a short introduction to the ``manage.sh`` script.
13+
14+How to setup your development environment
15+=========================================
16+
17+.. sidebar:: :ref:`make pyenv <make pyenv>`
18+
19+ Alternatively use the :ref:`make pyenv`.
20+
21+First, clone the source code of searx to the desired folder. In this case the
22+source is cloned to ``~/myprojects/searx``. Then create and activate the
23+searx-ve virtualenv and install the required packages using ``manage.sh``.
24+
25+.. code:: sh
26+
27+ cd ~/myprojects
28+ git clone https://github.com/asciimoo/searx.git
29+ cd searx
30+ python3 -m venv searx-ve
31+ . ./searx-ve/bin/activate
32+ ./manage.sh update_dev_packages
33+
34+
35+How to run tests
36+================
37+
38+.. sidebar:: :ref:`make test.unit <make test>`
39+
40+ Alternatively use the ``test.pep8``, ``test.unit``, ``test.robot`` targets.
41+
42+Tests can be run using the ``manage.sh`` script. Following tests and checks are
43+available:
44+
45+- Unit tests
46+- Selenium tests
47+- PEP8 validation
48+- Unit test coverage check
49+
50+For example unit tests are run with the command below:
51+
52+.. code:: sh
53+
54+ ./manage.sh unit_tests
55+
56+For further test options, please consult the help of the ``manage.sh`` script or
57+read :ref:`make test`.
58+
59+
60+How to compile styles and javascript
61+====================================
62+
63+.. _less: http://lesscss.org/
64+.. _NodeJS: https://nodejs.org
65+
66+How to build styles
67+-------------------
68+
69+Less_ is required to build the styles of searx. Less_ can be installed using
70+either NodeJS_ or Apt.
71+
72+.. code:: sh
73+
74+ sudo -H apt-get install nodejs
75+ sudo -H npm install -g less
76+
77+OR
78+
79+.. code:: sh
80+
81+ sudo -H apt-get install node-less
82+
83+After satisfying the requirements styles can be build using ``manage.sh``
84+
85+.. code:: sh
86+
87+ ./manage.sh styles
88+
89+
90+How to build the source of the themes
91+=====================================
92+
93+.. _grunt: https://gruntjs.com/
94+
95+Grunt_ must be installed in order to build the javascript sources. It depends on
96+NodeJS, so first Node has to be installed.
97+
98+.. code:: sh
99+
100+ sudo -H apt-get install nodejs
101+ make node.env
102+
103+After installing grunt, the files can be built using the following command:
104+
105+.. code:: sh
106+
107+ make themes
108+
109+
110+Tips for debugging/development
111+==============================
112+
113+.. sidebar:: :ref:`make run`
114+
115+ Makefile target ``run`` already enables debug option for your developer
116+ session / see :ref:`make run`.
117+
118+Turn on debug logging
119+ Whether you are working on a new engine or trying to eliminate a bug, it is
120+ always a good idea to turn on debug logging. When debug logging is enabled a
121+ stack trace appears, instead of the cryptic ``Internal Server Error``
122+ message. It can be turned on by setting ``debug: False`` to ``debug: True`` in
123+ :origin:`settings.yml <searx/settings.yml>`.
124+
125+.. sidebar:: :ref:`make test`
126+
127+ Alternatively use the :ref:`make test` targets.
128+
129+Run ``./manage.sh tests`` before creating a PR.
130+ Failing build on Travis is common because of PEP8 checks. So a new commit
131+ must be created containing these format fixes. This phase can be skipped if
132+ ``./manage.sh tests`` is run locally before creating a PR.
_sources/dev/reST.rst.txtnew file+1427
@@ -0,0 +1,1427 @@
1+.. _reST primer:
2+
3+===========
4+reST primer
5+===========
6+
7+.. sidebar:: KISS_ and readability_
8+
9+ Instead of defining more and more roles, we at searx encourage our
10+ contributors to follow principles like KISS_ and readability_.
11+
12+We at searx are using reStructuredText (aka reST_) markup for all kind of
13+documentation, with the builders from the Sphinx_ project a HTML output is
14+generated and deployed at :docs:`github.io <.>`. For build prerequisites read
15+:ref:`docs build`.
16+
17+The source files of Searx's documentation are located at :origin:`docs`. Sphinx
18+assumes source files to be encoded in UTF-8 by defaul. Run :ref:`make docs-live
19+<make docs-live>` to build HTML while editing.
20+
21+.. sidebar:: Further reading
22+
23+ - Sphinx-Primer_
24+ - `Sphinx markup constructs`_
25+ - reST_, docutils_, `docutils FAQ`_
26+ - Sphinx_, `sphinx-doc FAQ`_
27+ - `sphinx config`_, doctree_
28+ - `sphinx cross references`_
29+ - linuxdoc_
30+ - intersphinx_
31+ - sphinx-jinja_
32+ - `Sphinx's autodoc`_
33+ - `Sphinx's Python domain`_, `Sphinx's C domain`_
34+ - SVG_, ImageMagick_
35+ - DOT_, `Graphviz's dot`_, Graphviz_
36+
37+
38+.. contents:: Contents
39+ :depth: 3
40+ :local:
41+ :backlinks: entry
42+
43+Sphinx_ and reST_ have their place in the python ecosystem. Over that reST is
44+used in popular projects, e.g the Linux kernel documentation `[kernel doc]`_.
45+
46+.. _[kernel doc]: https://www.kernel.org/doc/html/latest/doc-guide/sphinx.html
47+
48+.. sidebar:: Content matters
49+
50+ The readability_ of the reST sources has its value, therefore we recommend to
51+ make sparse usage of reST markup / .. content matters!
52+
53+**reST** is a plaintext markup language, its markup is *mostly* intuitive and
54+you will not need to learn much to produce well formed articles with. I use the
55+word *mostly*: like everything in live, reST has its advantages and
56+disadvantages, some markups feel a bit grumpy (especially if you are used to
57+other plaintext markups).
58+
59+Soft skills
60+===========
61+
62+Before going any deeper into the markup let's face on some **soft skills** a
63+trained author brings with, to reach a well feedback from readers:
64+
65+- Documentation is dedicated to an audience and answers questions from the
66+ audience point of view.
67+- Don't detail things which are general knowledge from the audience point of
68+ view.
69+- Limit the subject, use cross links for any further reading.
70+
71+To be more concrete what a *point of view* means. In the (:origin:`docs`)
72+folder we have three sections (and the *blog* folder), each dedicate to a
73+different group of audience.
74+
75+User's POV: :origin:`docs/user`
76+ A typical user knows about search engines and might have heard about
77+ meta crawlers and privacy.
78+
79+Admin's POV: :origin:`docs/admin`
80+ A typical Admin knows about setting up services on a linux system, but he does
81+ not know all the pros and cons of a searx setup.
82+
83+Developer's POV: :origin:`docs/dev`
84+ Depending on the readability_ of code, a typical developer is able to read and
85+ understand source code. Describe what a item aims to do (e.g. a function).
86+ If the chronological order matters, describe it. Name the *out-of-limits
87+ conditions* and all the side effects a external developer will not know.
88+
89+.. _reST inline markup:
90+
91+Basic inline markup
92+===================
93+
94+.. sidebar:: Inline markup
95+
96+ - :ref:`reST roles`
97+ - :ref:`reST smart ref`
98+
99+Basic inline markup is done with asterisks and backquotes. If asterisks or
100+backquotes appear in running text and could be confused with inline markup
101+delimiters, they have to be escaped with a backslash (``\*pointer``).
102+
103+.. table:: basic inline markup
104+ :widths: 4 3 7
105+
106+ ================================================ ==================== ========================
107+ description rendered markup
108+ ================================================ ==================== ========================
109+ one asterisk for emphasis *italics* ``*italics*``
110+ two asterisks for strong emphasis **boldface** ``**boldface**``
111+ backquotes for code samples and literals ``foo()`` ````foo()````
112+ quote asterisks or backquotes \*foo is a pointer ``\*foo is a pointer``
113+ ================================================ ==================== ========================
114+
115+.. _reST basic structure:
116+
117+Basic article structure
118+=======================
119+
120+The basic structure of an article makes use of heading adornments to markup
121+chapter, sections and subsections.
122+
123+.. _reST template:
124+
125+reST template
126+-------------
127+
128+reST template for an simple article:
129+
130+.. code:: reST
131+
132+ .. _doc refname:
133+
134+ ==============
135+ Document title
136+ ==============
137+
138+ Lorem ipsum dolor sit amet, consectetur adipisici elit .. Further read
139+ :ref:`chapter refname`.
140+
141+ .. _chapter refname:
142+
143+ Chapter
144+ =======
145+
146+ Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
147+ aliquid ex ea commodi consequat ...
148+
149+ .. _section refname:
150+
151+ Section
152+ -------
153+
154+ lorem ..
155+
156+ .. _subsection refname:
157+
158+ Subsection
159+ ~~~~~~~~~~
160+
161+ lorem ..
162+
163+
164+Headings
165+--------
166+
167+#. title - with overline for document title:
168+
169+ .. code:: reST
170+
171+ ==============
172+ Document title
173+ ==============
174+
175+
176+#. chapter - with anchor named ``anchor name``:
177+
178+ .. code:: reST
179+
180+ .. _anchor name:
181+
182+ Chapter
183+ =======
184+
185+#. section
186+
187+ .. code:: reST
188+
189+ Section
190+ -------
191+
192+#. subsection
193+
194+ .. code:: reST
195+
196+ Subsection
197+ ~~~~~~~~~~
198+
199+
200+
201+Anchors & Links
202+===============
203+
204+.. _reST anchor:
205+
206+Anchors
207+-------
208+
209+.. _ref role:
210+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-ref
211+
212+To refer a point in the documentation a anchor is needed. The :ref:`reST
213+template <reST template>` shows an example where a chapter titled *"Chapters"*
214+gets an anchor named ``chapter title``. Another example from *this* document,
215+where the anchor named ``reST anchor``:
216+
217+.. code:: reST
218+
219+ .. _reST anchor:
220+
221+ Anchors
222+ -------
223+
224+ To refer a point in the documentation a anchor is needed ...
225+
226+To refer anchors use the `ref role`_ markup:
227+
228+.. code:: reST
229+
230+ Visit chapter :ref:`reST anchor`. Or set hyperlink text manualy :ref:`foo
231+ bar <reST anchor>`.
232+
233+.. admonition:: ``:ref:`` role
234+ :class: rst-example
235+
236+ Visist chapter :ref:`reST anchor`. Or set hyperlink text manualy :ref:`foo
237+ bar <reST anchor>`.
238+
239+.. _reST ordinary ref:
240+
241+Link ordinary URL
242+-----------------
243+
244+If you need to reference external URLs use *named* hyperlinks to maintain
245+readability of reST sources. Here is a example taken from *this* article:
246+
247+.. code:: reST
248+
249+ .. _Sphinx Field Lists:
250+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html
251+
252+ With the *named* hyperlink `Sphinx Field Lists`_, the raw text is much more
253+ readable.
254+
255+ And this shows the alternative (less readable) hyperlink markup `Sphinx Field
256+ Lists
257+ <https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html>`__.
258+
259+.. admonition:: Named hyperlink
260+ :class: rst-example
261+
262+ With the *named* hyperlink `Sphinx Field Lists`_, the raw text is much more
263+ readable.
264+
265+ And this shows the alternative (less readable) hyperlink markup `Sphinx Field
266+ Lists
267+ <https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html>`__.
268+
269+
270+.. _reST smart ref:
271+
272+Smart refs
273+----------
274+
275+With the power of sphinx.ext.extlinks_ and intersphinx_ referencing external
276+content becomes smart.
277+
278+.. table:: smart refs with sphinx.ext.extlinks_ and intersphinx_
279+ :widths: 4 3 7
280+
281+ ========================== ================================== ====================================
282+ refer ... rendered example markup
283+ ========================== ================================== ====================================
284+ :rst:role:`rfc` :rfc:`822` ``:rfc:`822```
285+ :rst:role:`pep` :pep:`8` ``:pep:`8```
286+ sphinx.ext.extlinks_
287+ --------------------------------------------------------------------------------------------------
288+ project's wiki article :wiki:`Offline-engines` ``:wiki:`Offline-engines```
289+ to docs public URL :docs:`dev/reST.html` ``:docs:`dev/reST.html```
290+ files & folders origin :origin:`docs/dev/reST.rst` ``:origin:`docs/dev/reST.rst```
291+ pull request :pull:`1756` ``:pull:`1756```
292+ patch :patch:`af2cae6` ``:patch:`af2cae6```
293+ PyPi package :pypi:`searx` ``:pypi:`searx```
294+ manual page man :man:`bash` ``:man:`bash```
295+ intersphinx_
296+ --------------------------------------------------------------------------------------------------
297+ external anchor :ref:`python:and` ``:ref:`python:and```
298+ external doc anchor :doc:`jinja:templates` ``:doc:`jinja:templates```
299+ python code object :py:obj:`datetime.datetime` ``:py:obj:`datetime.datetime```
300+ flask code object :py:obj:`flask.Flask` ``:py:obj:`flask.Flask```
301+ ========================== ================================== ====================================
302+
303+
304+Intersphinx is configured in :origin:`docs/conf.py`:
305+
306+.. code:: python
307+
308+ intersphinx_mapping = {
309+ "python": ("https://docs.python.org/3/", None),
310+ "flask": ("https://flask.palletsprojects.com/", None),
311+ "jinja": ("https://jinja.palletsprojects.com/", None),
312+ "linuxdoc" : ("https://return42.github.io/linuxdoc/", None),
313+ "sphinx" : ("https://www.sphinx-doc.org/en/master/", None),
314+ }
315+
316+
317+To list all anchors of the inventory (e.g. ``python``) use:
318+
319+.. code:: sh
320+
321+ $ python -m sphinx.ext.intersphinx https://docs.python.org/3/objects.inv
322+
323+Literal blocks
324+==============
325+
326+The simplest form of :duref:`literal-blocks` is a indented block introduced by
327+two colons (``::``). For highlighting use :dudir:`highlight` or :ref:`reST
328+code` directive. To include literals from external files use directive
329+:rst:dir:`literalinclude`.
330+
331+.. _reST literal:
332+
333+``::``
334+------
335+
336+.. code:: reST
337+
338+ ::
339+
340+ Literal block
341+
342+ Lorem ipsum dolor::
343+
344+ Literal block
345+
346+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
347+ eirmod tempor invidunt ut labore ::
348+
349+ Literal block
350+
351+.. admonition:: Literal block
352+ :class: rst-example
353+
354+ ::
355+
356+ Literal block
357+
358+ Lorem ipsum dolor::
359+
360+ Literal block
361+
362+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
363+ eirmod tempor invidunt ut labore ::
364+
365+ Literal block
366+
367+
368+.. _reST code:
369+
370+``code-block``
371+--------------
372+
373+.. _pygments: https://pygments.org/languages/
374+
375+.. sidebar:: Syntax highlighting
376+
377+ is handled by pygments_.
378+
379+The :rst:dir:`code-block` directive is a variant of the :dudir:`code` directive
380+with additional options. To learn more about code literals visit
381+:ref:`sphinx:code-examples`.
382+
383+.. code-block:: reST
384+
385+ The URL ``/stats`` handle is shown in :ref:`stats-handle`
386+
387+ .. code-block:: Python
388+ :caption: python code block
389+ :name: stats-handle
390+
391+ @app.route('/stats', methods=['GET'])
392+ def stats():
393+ """Render engine statistics page."""
394+ stats = get_engines_stats()
395+ return render(
396+ 'stats.html'
397+ , stats = stats )
398+
399+.. code-block:: reST
400+
401+.. admonition:: Code block
402+ :class: rst-example
403+
404+ The URL ``/stats`` handle is shown in :ref:`stats-handle`
405+
406+ .. code-block:: Python
407+ :caption: python code block
408+ :name: stats-handle
409+
410+ @app.route('/stats', methods=['GET'])
411+ def stats():
412+ """Render engine statistics page."""
413+ stats = get_engines_stats()
414+ return render(
415+ 'stats.html'
416+ , stats = stats )
417+
418+Unicode substitution
419+====================
420+
421+The :dudir:`unicode directive <unicode-character-codes>` converts Unicode
422+character codes (numerical values) to characters. This directive can only be
423+used within a substitution definition.
424+
425+.. code-block:: reST
426+
427+ .. |copy| unicode:: 0xA9 .. copyright sign
428+ .. |(TM)| unicode:: U+2122
429+
430+ Trademark |(TM)| and copyright |copy| glyphs.
431+
432+.. admonition:: Unicode
433+ :class: rst-example
434+
435+ .. |copy| unicode:: 0xA9 .. copyright sign
436+ .. |(TM)| unicode:: U+2122
437+
438+ Trademark |(TM)| and copyright |copy| glyphs.
439+
440+
441+.. _reST roles:
442+
443+Roles
444+=====
445+
446+.. sidebar:: Further reading
447+
448+ - `Sphinx Roles`_
449+ - :doc:`sphinx:usage/restructuredtext/domains`
450+
451+
452+A *custom interpreted text role* (:duref:`ref <roles>`) is an inline piece of
453+explicit markup. It signifies that that the enclosed text should be interpreted
454+in a specific way.
455+
456+The general markup is one of:
457+
458+.. code:: reST
459+
460+ :rolename:`ref-name`
461+ :rolename:`ref text <ref-name>`
462+
463+.. table:: smart refs with sphinx.ext.extlinks_ and intersphinx_
464+ :widths: 4 3 7
465+
466+ ========================== ================================== ====================================
467+ role rendered example markup
468+ ========================== ================================== ====================================
469+ :rst:role:`guilabel` :guilabel:`&Cancel` ``:guilabel:`&Cancel```
470+ :rst:role:`kbd` :kbd:`C-x C-f` ``:kbd:`C-x C-f```
471+ :rst:role:`menuselection` :menuselection:`Open --> File` ``:menuselection:`Open --> File```
472+ :rst:role:`download` :download:`this file <reST.rst>` ``:download:`this file <reST.rst>```
473+ math_ :math:`a^2 + b^2 = c^2` ``:math:`a^2 + b^2 = c^2```
474+ :rst:role:`ref` :ref:`svg image example` ``:ref:`svg image example```
475+ :rst:role:`command` :command:`ls -la` ``:command:`ls -la```
476+ :durole:`emphasis` :emphasis:`italic` ``:emphasis:`italic```
477+ :durole:`strong` :strong:`bold` ``:strong:`bold```
478+ :durole:`literal` :literal:`foo()` ``:literal:`foo()```
479+ :durole:`subscript` H\ :sub:`2`\ O ``H\ :sub:`2`\ O``
480+ :durole:`superscript` E = mc\ :sup:`2` ``E = mc\ :sup:`2```
481+ :durole:`title-reference` :title:`Time` ``:title:`Time```
482+ ========================== ================================== ====================================
483+
484+Figures & Images
485+================
486+
487+.. sidebar:: Image processing
488+
489+ With the directives from :ref:`linuxdoc <linuxdoc:kfigure>` the build process
490+ is flexible. To get best results in the generated output format, install
491+ ImageMagick_ and Graphviz_.
492+
493+Searx's sphinx setup includes: :ref:`linuxdoc:kfigure`. Scaleable here means;
494+scaleable in sense of the build process. Normally in absence of a converter
495+tool, the build process will break. From the authors POV it’s annoying to care
496+about the build process when handling with images, especially since he has no
497+access to the build process. With :ref:`linuxdoc:kfigure` the build process
498+continues and scales output quality in dependence of installed image processors.
499+
500+If you want to add an image, you should use the ``kernel-figure`` (inheritance
501+of :dudir:`figure`) and ``kernel-image`` (inheritance of :dudir:`image`)
502+directives. E.g. to insert a figure with a scaleable image format use SVG
503+(:ref:`svg image example`):
504+
505+.. code:: reST
506+
507+ .. _svg image example:
508+
509+ .. kernel-figure:: svg_image.svg
510+ :alt: SVG image example
511+
512+ Simple SVG image
513+
514+ To refer the figure, a caption block is needed: :ref:`svg image example`.
515+
516+.. _svg image example:
517+
518+.. kernel-figure:: svg_image.svg
519+ :alt: SVG image example
520+
521+ Simple SVG image.
522+
523+To refer the figure, a caption block is needed: :ref:`svg image example`.
524+
525+DOT files (aka Graphviz)
526+------------------------
527+
528+With :ref:`linuxdoc:kernel-figure` reST support for **DOT** formatted files is
529+given.
530+
531+- `Graphviz's dot`_
532+- DOT_
533+- Graphviz_
534+
535+A simple example is shown in :ref:`dot file example`:
536+
537+.. code:: reST
538+
539+ .. _dot file example:
540+
541+ .. kernel-figure:: hello.dot
542+ :alt: hello world
543+
544+ DOT's hello world example
545+
546+.. admonition:: hello.dot
547+ :class: rst-example
548+
549+ .. _dot file example:
550+
551+ .. kernel-figure:: hello.dot
552+ :alt: hello world
553+
554+ DOT's hello world example
555+
556+``kernel-render`` DOT
557+---------------------
558+
559+Embed *render* markups (or languages) like Graphviz's **DOT** is provided by the
560+:ref:`linuxdoc:kernel-render` directive. A simple example of embedded DOT_ is
561+shown in figure :ref:`dot render example`:
562+
563+.. code:: reST
564+
565+ .. _dot render example:
566+
567+ .. kernel-render:: DOT
568+ :alt: digraph
569+ :caption: Embedded DOT (Graphviz) code
570+
571+ digraph foo {
572+ "bar" -> "baz";
573+ }
574+
575+ Attribute ``caption`` is needed, if you want to refer the figure: :ref:`dot
576+ render example`.
577+
578+Please note :ref:`build tools <linuxdoc:kfigure_build_tools>`. If Graphviz_ is
579+installed, you will see an vector image. If not, the raw markup is inserted as
580+*literal-block*.
581+
582+.. admonition:: kernel-render DOT
583+ :class: rst-example
584+
585+ .. _dot render example:
586+
587+ .. kernel-render:: DOT
588+ :alt: digraph
589+ :caption: Embedded DOT (Graphviz) code
590+
591+ digraph foo {
592+ "bar" -> "baz";
593+ }
594+
595+ Attribute ``caption`` is needed, if you want to refer the figure: :ref:`dot
596+ render example`.
597+
598+``kernel-render`` SVG
599+---------------------
600+
601+A simple example of embedded SVG_ is shown in figure :ref:`svg render example`:
602+
603+.. code:: reST
604+
605+ .. _svg render example:
606+
607+ .. kernel-render:: SVG
608+ :caption: Embedded **SVG** markup
609+ :alt: so-nw-arrow
610+..
611+
612+ .. code:: xml
613+
614+ <?xml version="1.0" encoding="UTF-8"?>
615+ <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
616+ baseProfile="full" width="70px" height="40px"
617+ viewBox="0 0 700 400"
618+ >
619+ <line x1="180" y1="370"
620+ x2="500" y2="50"
621+ stroke="black" stroke-width="15px"
622+ />
623+ <polygon points="585 0 525 25 585 50"
624+ transform="rotate(135 525 25)"
625+ />
626+ </svg>
627+
628+.. admonition:: kernel-render SVG
629+ :class: rst-example
630+
631+ .. _svg render example:
632+
633+ .. kernel-render:: SVG
634+ :caption: Embedded **SVG** markup
635+ :alt: so-nw-arrow
636+
637+ <?xml version="1.0" encoding="UTF-8"?>
638+ <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
639+ baseProfile="full" width="70px" height="40px"
640+ viewBox="0 0 700 400"
641+ >
642+ <line x1="180" y1="370"
643+ x2="500" y2="50"
644+ stroke="black" stroke-width="15px"
645+ />
646+ <polygon points="585 0 525 25 585 50"
647+ transform="rotate(135 525 25)"
648+ />
649+ </svg>
650+
651+
652+
653+
654+.. _reST lists:
655+
656+List markups
657+============
658+
659+Bullet list
660+-----------
661+
662+List markup (:duref:`ref <bullet-lists>`) is simple:
663+
664+.. code:: reST
665+
666+ - This is a bulleted list.
667+
668+ 1. Nested lists are possible, but be aware that they must be separated from
669+ the parent list items by blank line
670+ 2. Second item of nested list
671+
672+ - It has two items, the second
673+ item uses two lines.
674+
675+ #. This is a numbered list.
676+ #. It has two items too.
677+
678+.. admonition:: bullet list
679+ :class: rst-example
680+
681+ - This is a bulleted list.
682+
683+ 1. Nested lists are possible, but be aware that they must be separated from
684+ the parent list items by blank line
685+ 2. Second item of nested list
686+
687+ - It has two items, the second
688+ item uses two lines.
689+
690+ #. This is a numbered list.
691+ #. It has two items too.
692+
693+
694+Horizontal list
695+---------------
696+
697+The :rst:dir:`.. hlist:: <hlist>` transforms a bullet list into a more compact
698+list.
699+
700+.. code:: reST
701+
702+ .. hlist::
703+
704+ - first list item
705+ - second list item
706+ - third list item
707+ ...
708+
709+.. admonition:: hlist
710+ :class: rst-example
711+
712+ .. hlist::
713+
714+ - first list item
715+ - second list item
716+ - third list item
717+ - next list item
718+ - next list item xxxx
719+ - next list item yyyy
720+ - next list item zzzz
721+
722+
723+Definition list
724+---------------
725+
726+.. sidebar:: Note ..
727+
728+ - the term cannot have more than one line of text
729+
730+ - there is **no blank line between term and definition block** // this
731+ distinguishes definition lists (:duref:`ref <definition-lists>`) from block
732+ quotes (:duref:`ref <block-quotes>`).
733+
734+Each definition list (:duref:`ref <definition-lists>`) item contains a term,
735+optional classifiers and a definition. A term is a simple one-line word or
736+phrase. Optional classifiers may follow the term on the same line, each after
737+an inline ' : ' (**space, colon, space**). A definition is a block indented
738+relative to the term, and may contain multiple paragraphs and other body
739+elements. There may be no blank line between a term line and a definition block
740+(*this distinguishes definition lists from block quotes*). Blank lines are
741+required before the first and after the last definition list item, but are
742+optional in-between.
743+
744+Definition lists are created as follows:
745+
746+.. code:: reST
747+
748+ term 1 (up to a line of text)
749+ Definition 1.
750+
751+ See the typo : this line is not a term!
752+
753+ And this is not term's definition. **There is a blank line** in between
754+ the line above and this paragraph. That's why this paragraph is taken as
755+ **block quote** (:duref:`ref <block-quotes>`) and not as term's definition!
756+
757+ term 2
758+ Definition 2, paragraph 1.
759+
760+ Definition 2, paragraph 2.
761+
762+ term 3 : classifier
763+ Definition 3.
764+
765+ term 4 : classifier one : classifier two
766+ Definition 4.
767+
768+.. admonition:: definition list
769+ :class: rst-example
770+
771+ term 1 (up to a line of text)
772+ Definition 1.
773+
774+ See the typo : this line is not a term!
775+
776+ And this is not term's definition. **There is a blank line** in between
777+ the line above and this paragraph. That's why this paragraph is taken as
778+ **block quote** (:duref:`ref <block-quotes>`) and not as term's definition!
779+
780+
781+ term 2
782+ Definition 2, paragraph 1.
783+
784+ Definition 2, paragraph 2.
785+
786+ term 3 : classifier
787+ Definition 3.
788+
789+ term 4 : classifier one : classifier two
790+
791+
792+Quoted paragraphs
793+-----------------
794+
795+Quoted paragraphs (:duref:`ref <block-quotes>`) are created by just indenting
796+them more than the surrounding paragraphs. Line blocks (:duref:`ref
797+<line-blocks>`) are a way of preserving line breaks:
798+
799+.. code:: reST
800+
801+ normal paragraph ...
802+ lorem ipsum.
803+
804+ Quoted paragraph ...
805+ lorem ipsum.
806+
807+ | These lines are
808+ | broken exactly like in
809+ | the source file.
810+
811+
812+.. admonition:: Quoted paragraph and line block
813+ :class: rst-example
814+
815+ normal paragraph ...
816+ lorem ipsum.
817+
818+ Quoted paragraph ...
819+ lorem ipsum.
820+
821+ | These lines are
822+ | broken exactly like in
823+ | the source file.
824+
825+
826+.. _reST field list:
827+
828+Field Lists
829+-----------
830+
831+.. _Sphinx Field Lists:
832+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/field-lists.html
833+
834+.. sidebar:: bibliographic fields
835+
836+ First lines fields are bibliographic fields, see `Sphinx Field Lists`_.
837+
838+Field lists are used as part of an extension syntax, such as options for
839+directives, or database-like records meant for further processing. Field lists
840+are mappings from field names to field bodies. They marked up like this:
841+
842+.. code:: reST
843+
844+ :fieldname: Field content
845+ :foo: first paragraph in field foo
846+
847+ second paragraph in field foo
848+
849+ :bar: Field content
850+
851+.. admonition:: Field List
852+ :class: rst-example
853+
854+ :fieldname: Field content
855+ :foo: first paragraph in field foo
856+
857+ second paragraph in field foo
858+
859+ :bar: Field content
860+
861+
862+They are commonly used in Python documentation:
863+
864+.. code:: python
865+
866+ def my_function(my_arg, my_other_arg):
867+ """A function just for me.
868+
869+ :param my_arg: The first of my arguments.
870+ :param my_other_arg: The second of my arguments.
871+
872+ :returns: A message (just for me, of course).
873+ """
874+
875+Further list blocks
876+-------------------
877+
878+- field lists (:duref:`ref <field-lists>`, with caveats noted in
879+ :ref:`reST field list`)
880+- option lists (:duref:`ref <option-lists>`)
881+- quoted literal blocks (:duref:`ref <quoted-literal-blocks>`)
882+- doctest blocks (:duref:`ref <doctest-blocks>`)
883+
884+
885+Admonitions
886+===========
887+
888+Sidebar
889+-------
890+
891+Sidebar is an eye catcher, often used for admonitions pointing further stuff or
892+site effects. Here is the source of the sidebar :ref:`on top of this page <reST
893+primer>`.
894+
895+.. code:: reST
896+
897+ .. sidebar:: KISS_ and readability_
898+
899+ Instead of defining more and more roles, we at searx encourage our
900+ contributors to follow principles like KISS_ and readability_.
901+
902+Generic admonition
903+------------------
904+
905+The generic :dudir:`admonition <admonitions>` needs a title:
906+
907+.. code:: reST
908+
909+ .. admonition:: generic admonition title
910+
911+ lorem ipsum ..
912+
913+
914+.. admonition:: generic admonition title
915+
916+ lorem ipsum ..
917+
918+
919+Specific admonitions
920+--------------------
921+
922+Specific admonitions: :dudir:`hint`, :dudir:`note`, :dudir:`tip` :dudir:`attention`,
923+:dudir:`caution`, :dudir:`danger`, :dudir:`error`, , :dudir:`important`, and
924+:dudir:`warning` .
925+
926+.. code:: reST
927+
928+ .. hint::
929+
930+ lorem ipsum ..
931+
932+ .. note::
933+
934+ lorem ipsum ..
935+
936+ .. warning::
937+
938+ lorem ipsum ..
939+
940+
941+.. hint::
942+
943+ lorem ipsum ..
944+
945+.. note::
946+
947+ lorem ipsum ..
948+
949+.. tip::
950+
951+ lorem ipsum ..
952+
953+.. attention::
954+
955+ lorem ipsum ..
956+
957+.. caution::
958+
959+ lorem ipsum ..
960+
961+.. danger::
962+
963+ lorem ipsum ..
964+
965+.. important::
966+
967+ lorem ipsum ..
968+
969+.. error::
970+
971+ lorem ipsum ..
972+
973+.. warning::
974+
975+ lorem ipsum ..
976+
977+
978+Tables
979+======
980+
981+.. sidebar:: Nested tables
982+
983+ Nested tables are ugly! Not all builder support nested tables, don't use
984+ them!
985+
986+ASCII-art tables like :ref:`reST simple table` and :ref:`reST grid table` might
987+be comfortable for readers of the text-files, but they have huge disadvantages
988+in the creation and modifying. First, they are hard to edit. Think about
989+adding a row or a column to a ASCII-art table or adding a paragraph in a cell,
990+it is a nightmare on big tables.
991+
992+
993+.. sidebar:: List tables
994+
995+ For meaningful patch and diff use :ref:`reST flat table`.
996+
997+Second the diff of modifying ASCII-art tables is not meaningful, e.g. widening a
998+cell generates a diff in which also changes are included, which are only
999+ascribable to the ASCII-art. Anyway, if you prefer ASCII-art for any reason,
1000+here are some helpers:
1001+
1002+* `Emacs Table Mode`_
1003+* `Online Tables Generator`_
1004+
1005+.. _reST simple table:
1006+
1007+Simple tables
1008+-------------
1009+
1010+:duref:`Simple tables <simple-tables>` allow *colspan* but not *rowspan*. If
1011+your table need some metadata (e.g. a title) you need to add the ``.. table::
1012+directive`` :dudir:`(ref) <table>` in front and place the table in its body:
1013+
1014+.. code:: reST
1015+
1016+ .. table:: foo gate truth table
1017+ :widths: grid
1018+ :align: left
1019+
1020+ ====== ====== ======
1021+ Inputs Output
1022+ ------------- ------
1023+ A B A or B
1024+ ====== ====== ======
1025+ False
1026+ --------------------
1027+ True
1028+ --------------------
1029+ True False True
1030+ (foo)
1031+ ------ ------ ------
1032+ False True
1033+ (foo)
1034+ ====== =============
1035+
1036+.. admonition:: Simple ASCII table
1037+ :class: rst-example
1038+
1039+ .. table:: foo gate truth table
1040+ :widths: grid
1041+ :align: left
1042+
1043+ ====== ====== ======
1044+ Inputs Output
1045+ ------------- ------
1046+ A B A or B
1047+ ====== ====== ======
1048+ False
1049+ --------------------
1050+ True
1051+ --------------------
1052+ True False True
1053+ (foo)
1054+ ------ ------ ------
1055+ False True
1056+ (foo)
1057+ ====== =============
1058+
1059+
1060+
1061+.. _reST grid table:
1062+
1063+Grid tables
1064+-----------
1065+
1066+:duref:`Grid tables <grid-tables>` allow colspan *colspan* and *rowspan*:
1067+
1068+.. code:: reST
1069+
1070+ .. table:: grid table example
1071+ :widths: 1 1 5
1072+
1073+ +------------+------------+-----------+
1074+ | Header 1 | Header 2 | Header 3 |
1075+ +============+============+===========+
1076+ | body row 1 | column 2 | column 3 |
1077+ +------------+------------+-----------+
1078+ | body row 2 | Cells may span columns.|
1079+ +------------+------------+-----------+
1080+ | body row 3 | Cells may | - Cells |
1081+ +------------+ span rows. | - contain |
1082+ | body row 4 | | - blocks. |
1083+ +------------+------------+-----------+
1084+
1085+.. admonition:: ASCII grid table
1086+ :class: rst-example
1087+
1088+ .. table:: grid table example
1089+ :widths: 1 1 5
1090+
1091+ +------------+------------+-----------+
1092+ | Header 1 | Header 2 | Header 3 |
1093+ +============+============+===========+
1094+ | body row 1 | column 2 | column 3 |
1095+ +------------+------------+-----------+
1096+ | body row 2 | Cells may span columns.|
1097+ +------------+------------+-----------+
1098+ | body row 3 | Cells may | - Cells |
1099+ +------------+ span rows. | - contain |
1100+ | body row 4 | | - blocks. |
1101+ +------------+------------+-----------+
1102+
1103+
1104+.. _reST flat table:
1105+
1106+flat-table
1107+----------
1108+
1109+The ``flat-table`` is a further developed variant of the :ref:`list tables
1110+<linuxdoc:list-table-directives>`. It is a double-stage list similar to the
1111+:dudir:`list-table` with some additional features:
1112+
1113+column-span: ``cspan``
1114+ with the role ``cspan`` a cell can be extended through additional columns
1115+
1116+row-span: ``rspan``
1117+ with the role ``rspan`` a cell can be extended through additional rows
1118+
1119+auto-span:
1120+ spans rightmost cell of a table row over the missing cells on the right side
1121+ of that table-row. With Option ``:fill-cells:`` this behavior can changed
1122+ from *auto span* to *auto fill*, which automatically inserts (empty) cells
1123+ instead of spanning the last cell.
1124+
1125+options:
1126+ :header-rows: [int] count of header rows
1127+ :stub-columns: [int] count of stub columns
1128+ :widths: [[int] [int] ... ] widths of columns
1129+ :fill-cells: instead of auto-span missing cells, insert missing cells
1130+
1131+roles:
1132+ :cspan: [int] additional columns (*morecols*)
1133+ :rspan: [int] additional rows (*morerows*)
1134+
1135+The example below shows how to use this markup. The first level of the staged
1136+list is the *table-row*. In the *table-row* there is only one markup allowed,
1137+the list of the cells in this *table-row*. Exception are *comments* ( ``..`` )
1138+and *targets* (e.g. a ref to :ref:`row 2 of table's body <row body 2>`).
1139+
1140+.. code:: reST
1141+
1142+ .. flat-table:: ``flat-table`` example
1143+ :header-rows: 2
1144+ :stub-columns: 1
1145+ :widths: 1 1 1 1 2
1146+
1147+ * - :rspan:`1` head / stub
1148+ - :cspan:`3` head 1.1-4
1149+
1150+ * - head 2.1
1151+ - head 2.2
1152+ - head 2.3
1153+ - head 2.4
1154+
1155+ * .. row body 1 / this is a comment
1156+
1157+ - row 1
1158+ - :rspan:`2` cell 1-3.1
1159+ - cell 1.2
1160+ - cell 1.3
1161+ - cell 1.4
1162+
1163+ * .. Comments and targets are allowed on *table-row* stage.
1164+ .. _`row body 2`:
1165+
1166+ - row 2
1167+ - cell 2.2
1168+ - :rspan:`1` :cspan:`1`
1169+ cell 2.3 with a span over
1170+
1171+ * col 3-4 &
1172+ * row 2-3
1173+
1174+ * - row 3
1175+ - cell 3.2
1176+
1177+ * - row 4
1178+ - cell 4.1
1179+ - cell 4.2
1180+ - cell 4.3
1181+ - cell 4.4
1182+
1183+ * - row 5
1184+ - cell 5.1 with automatic span to rigth end
1185+
1186+ * - row 6
1187+ - cell 6.1
1188+ - ..
1189+
1190+
1191+.. admonition:: List table
1192+ :class: rst-example
1193+
1194+ .. flat-table:: ``flat-table`` example
1195+ :header-rows: 2
1196+ :stub-columns: 1
1197+ :widths: 1 1 1 1 2
1198+
1199+ * - :rspan:`1` head / stub
1200+ - :cspan:`3` head 1.1-4
1201+
1202+ * - head 2.1
1203+ - head 2.2
1204+ - head 2.3
1205+ - head 2.4
1206+
1207+ * .. row body 1 / this is a comment
1208+
1209+ - row 1
1210+ - :rspan:`2` cell 1-3.1
1211+ - cell 1.2
1212+ - cell 1.3
1213+ - cell 1.4
1214+
1215+ * .. Comments and targets are allowed on *table-row* stage.
1216+ .. _`row body 2`:
1217+
1218+ - row 2
1219+ - cell 2.2
1220+ - :rspan:`1` :cspan:`1`
1221+ cell 2.3 with a span over
1222+
1223+ * col 3-4 &
1224+ * row 2-3
1225+
1226+ * - row 3
1227+ - cell 3.2
1228+
1229+ * - row 4
1230+ - cell 4.1
1231+ - cell 4.2
1232+ - cell 4.3
1233+ - cell 4.4
1234+
1235+ * - row 5
1236+ - cell 5.1 with automatic span to rigth end
1237+
1238+ * - row 6
1239+ - cell 6.1
1240+ - ..
1241+
1242+
1243+CSV table
1244+---------
1245+
1246+CSV table might be the choice if you want to include CSV-data from a outstanding
1247+(build) process into your documentation.
1248+
1249+.. code:: reST
1250+
1251+ .. csv-table:: CSV table example
1252+ :header: .. , Column 1, Column 2
1253+ :widths: 2 5 5
1254+ :stub-columns: 1
1255+ :file: csv_table.txt
1256+
1257+Content of file ``csv_table.txt``:
1258+
1259+.. literalinclude:: csv_table.txt
1260+
1261+.. admonition:: CSV table
1262+ :class: rst-example
1263+
1264+ .. csv-table:: CSV table example
1265+ :header: .. , Column 1, Column 2
1266+ :widths: 3 5 5
1267+ :stub-columns: 1
1268+ :file: csv_table.txt
1269+
1270+Templating
1271+==========
1272+
1273+.. sidebar:: Build environment
1274+
1275+ All *generic-doc* tasks are running in the :ref:`build environment <make
1276+ pyenv>`.
1277+
1278+Templating is suitable for documentation which is created generic at the build
1279+time. The sphinx-jinja_ extension evaluates jinja_ templates in the :ref:`build
1280+environment <make pyenv>` (with searx modules installed). We use this e.g. to
1281+build chapter: :ref:`engines generic`. Below the jinja directive from the
1282+:origin:`docs/admin/engines.rst` is shown:
1283+
1284+.. literalinclude:: ../admin/engines.rst
1285+ :language: reST
1286+ :start-after: .. _configured engines:
1287+
1288+The context for the template is selected in the line ``.. jinja:: webapp``. In
1289+sphinx's build configuration (:origin:`docs/conf.py`) the ``webapp`` context
1290+points to the name space of the python module: ``webapp``.
1291+
1292+.. code:: py
1293+
1294+ from searx import webapp
1295+ jinja_contexts = {
1296+ 'webapp': dict(**webapp.__dict__)
1297+ }
1298+
1299+
1300+Tabbed views
1301+============
1302+
1303+.. _sphinx-tabs: https://github.com/djungelorm/sphinx-tabs
1304+.. _basic-tabs: https://github.com/djungelorm/sphinx-tabs#basic-tabs
1305+.. _group-tabs: https://github.com/djungelorm/sphinx-tabs#group-tabs
1306+.. _code-tabs: https://github.com/djungelorm/sphinx-tabs#code-tabs
1307+
1308+With `sphinx-tabs`_ extension we have *tabbed views*. To provide installation
1309+instructions with one tab per distribution we use the `group-tabs`_ directive,
1310+others are basic-tabs_ and code-tabs_. Below a *group-tab* example from
1311+:ref:`docs build` is shown:
1312+
1313+.. literalinclude:: ../admin/buildhosts.rst
1314+ :language: reST
1315+ :start-after: .. SNIP sh lint requirements
1316+ :end-before: .. SNAP sh lint requirements
1317+
1318+.. _math:
1319+
1320+Math equations
1321+==============
1322+
1323+.. _Mathematics: https://en.wikibooks.org/wiki/LaTeX/Mathematics
1324+.. _amsmath user guide:
1325+ http://vesta.informatik.rwth-aachen.de/ftp/pub/mirror/ctan/macros/latex/required/amsmath/amsldoc.pdf
1326+
1327+.. sidebar:: About LaTeX
1328+
1329+ - `amsmath user guide`_
1330+ - Mathematics_
1331+ - :ref:`docs build`
1332+
1333+The input language for mathematics is LaTeX markup using the :ctan:`amsmath`
1334+package.
1335+
1336+To embed LaTeX markup in reST documents, use role :rst:role:`:math: <math>` for
1337+inline and directive :rst:dir:`.. math:: <math>` for block markup.
1338+
1339+.. code:: reST
1340+
1341+ In :math:numref:`schroedinger general` the time-dependent Schrödinger equation
1342+ is shown.
1343+
1344+ .. math::
1345+ :label: schroedinger general
1346+
1347+ \mathrm{i}\hbar\dfrac{\partial}{\partial t} |\,\psi (t) \rangle =
1348+ \hat{H} |\,\psi (t) \rangle.
1349+
1350+.. admonition:: LaTeX math equation
1351+ :class: rst-example
1352+
1353+ In :math:numref:`schroedinger general` the time-dependent Schrödinger equation
1354+ is shown.
1355+
1356+ .. math::
1357+ :label: schroedinger general
1358+
1359+ \mathrm{i}\hbar\dfrac{\partial}{\partial t} |\,\psi (t) \rangle =
1360+ \hat{H} |\,\psi (t) \rangle.
1361+
1362+
1363+The next example shows the difference of ``\tfrac`` (*textstyle*) and ``\dfrac``
1364+(*displaystyle*) used in a inline markup or another fraction.
1365+
1366+.. code:: reST
1367+
1368+ ``\tfrac`` **inline example** :math:`\tfrac{\tfrac{1}{x}+\tfrac{1}{y}}{y-z}`
1369+ ``\dfrac`` **inline example** :math:`\dfrac{\dfrac{1}{x}+\dfrac{1}{y}}{y-z}`
1370+
1371+.. admonition:: Line spacing
1372+ :class: rst-example
1373+
1374+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
1375+ eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
1376+ voluptua. ...
1377+ ``\tfrac`` **inline example** :math:`\tfrac{\tfrac{1}{x}+\tfrac{1}{y}}{y-z}`
1378+ At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
1379+ gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
1380+
1381+ Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
1382+ eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
1383+ voluptua. ...
1384+ ``\tfrac`` **inline example** :math:`\dfrac{\dfrac{1}{x}+\dfrac{1}{y}}{y-z}`
1385+ At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
1386+ gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
1387+
1388+
1389+.. _KISS: https://en.wikipedia.org/wiki/KISS_principle
1390+
1391+.. _readability: https://docs.python-guide.org/writing/style/
1392+.. _Sphinx-Primer:
1393+ http://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html
1394+.. _reST: https://docutils.sourceforge.io/rst.html
1395+.. _Sphinx Roles:
1396+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html
1397+.. _Sphinx: http://www.sphinx-doc.org
1398+.. _`sphinx-doc FAQ`: http://www.sphinx-doc.org/en/stable/faq.html
1399+.. _Sphinx markup constructs:
1400+ http://www.sphinx-doc.org/en/stable/markup/index.html
1401+.. _`sphinx cross references`:
1402+ http://www.sphinx-doc.org/en/stable/markup/inline.html#cross-referencing-arbitrary-locations
1403+.. _sphinx.ext.extlinks:
1404+ https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html
1405+.. _intersphinx: http://www.sphinx-doc.org/en/stable/ext/intersphinx.html
1406+.. _sphinx config: http://www.sphinx-doc.org/en/stable/config.html
1407+.. _Sphinx's autodoc: http://www.sphinx-doc.org/en/stable/ext/autodoc.html
1408+.. _Sphinx's Python domain:
1409+ http://www.sphinx-doc.org/en/stable/domains.html#the-python-domain
1410+.. _Sphinx's C domain:
1411+ http://www.sphinx-doc.org/en/stable/domains.html#cross-referencing-c-constructs
1412+.. _doctree:
1413+ http://www.sphinx-doc.org/en/master/extdev/tutorial.html?highlight=doctree#build-phases
1414+.. _docutils: http://docutils.sourceforge.net/docs/index.html
1415+.. _docutils FAQ: http://docutils.sourceforge.net/FAQ.html
1416+.. _linuxdoc: https://return42.github.io/linuxdoc
1417+.. _jinja: https://jinja.palletsprojects.com/
1418+.. _sphinx-jinja: https://github.com/tardyp/sphinx-jinja
1419+.. _SVG: https://www.w3.org/TR/SVG11/expanded-toc.html
1420+.. _DOT: https://graphviz.gitlab.io/_pages/doc/info/lang.html
1421+.. _`Graphviz's dot`: https://graphviz.gitlab.io/_pages/pdf/dotguide.pdf
1422+.. _Graphviz: https://graphviz.gitlab.io
1423+.. _ImageMagick: https://www.imagemagick.org
1424+
1425+.. _`Emacs Table Mode`: https://www.emacswiki.org/emacs/TableMode
1426+.. _`Online Tables Generator`: http://www.tablesgenerator.com/text_tables
1427+.. _`OASIS XML Exchange Table Model`: https://www.oasis-open.org/specs/tm9901.html
docs/dev/search_api.rst → _sources/dev/search_api.rst.txtrenamed+4−4
@@ -6,7 +6,7 @@ Search API
66
77The search supports both ``GET`` and ``POST``.
88
9−Furthermore, two endpoints ``/`` and ``/search`` are available for querying.
9+Furthermore, two enpoints ``/`` and ``/search`` are available for querying.
1010
1111
1212``GET /``
@@ -76,12 +76,12 @@ Parameters
7676 supports safe search in the preferences page of an instance.
7777
7878``theme`` : default ``oscar``
79− [ ``oscar``, ``simple`` ]
79+ [ ``oscar``, ``simple``, ``legacy``, ``pix-art``, ``courgette`` ]
8080
8181 Theme of instance.
8282
8383 Please note, available themes depend on an instance. It is possible that an
84− instance administrator deleted, created or renamed themes on their instance.
84+ instance administrator deleted, created or renamed themes on his/her instance.
8585 See the available options in the preferences page of the instance.
8686
8787``oscar-style`` : default ``logicodev``
@@ -91,7 +91,7 @@ Parameters
9191 ``oscar``.
9292
9393 Please note, available styles depend on an instance. It is possible that an
94− instance administrator deleted, created or renamed styles on their
94+ instance administrator deleted, created or renamed styles on his/her
9595 instance. See the available options in the preferences page of the instance.
9696
9797``enabled_plugins`` : optional
docs/dev/translation.rst → _sources/dev/translation.rst.txtrenamed

The content is the same.

docs/index.rst → _sources/index.rst.txtrenamed−1
@@ -30,7 +30,6 @@ anyone, you can set up your own, see :ref:`installation`.
3030 user/index
3131 admin/index
3232 dev/index
33− searx_extra/index
3433 utils/index
3534 blog/index
3635
docs/user/index.rst → _sources/user/index.rst.txtrenamed

The content is the same.

docs/user/own-instance.rst → _sources/user/own-instance.rst.txtrenamed+5−5
@@ -44,9 +44,9 @@ hidden from visited result pages.
4444What are the consequences of using public instances?
4545----------------------------------------------------
4646
47−If someone uses a public instance, they have to trust the administrator of that
47+If someone uses a public instance, he/she has to trust the administrator of that
4848instance. This means that the user of the public instance does not know whether
49−their requests are logged, aggregated and sent or sold to a third party.
49+his/her requests are logged, aggregated and sent or sold to a third party.
5050
5151Also, public instances without proper protection are more vulnerable to abusing
5252the search service, In this case the external service in exchange returns
@@ -56,9 +56,9 @@ results.
5656I see. What about private instances?
5757------------------------------------
5858
59−If users run their :ref:`own instances <installation>`, everything is in their
60−control: the source code, logging settings and private data. Unknown instance
61−administrators do not have to be trusted.
59+If users run their own instances, everything is in their control: the source
60+code, logging settings and private data. Unknown instance administrators do not
61+have to be trusted.
6262
6363Furthermore, as the default settings of their instance is editable, there is no
6464need to use cookies to tailor searx to their needs. So preferences will not be
docs/user/search_syntax.rst → _sources/user/search_syntax.rst.txtrenamed−24
@@ -40,27 +40,3 @@ Image search:
4040Custom language in wikipedia:
4141
4242- :search:`:hu !wp hackerspace <?q=%3Ahu%20%21wp%20hackerspace>`
43−
44−Multilingual Search
45−===================
46−
47−Searx does not support true multilingual search.
48−You have to use the language prefix in your search query when searching in a different language.
49−
50−But there is a workaround:
51−By adding a new search engine with a different language, Searx will search in your default and other language.
52−
53−Example configuration in settings.yml for a German and English speaker:
54− .. code-block:: yaml
55−
56− search:
57− language : "de"
58− ...
59−
60− engines:
61− - name : google english
62− engine : google
63− language : english
64− ...
65−
66−When searching, the default google engine will return German results and "google english" will return English results.
docs/utils/filtron.sh.rst → _sources/utils/filtron.sh.rst.txtrenamed+4−4
@@ -41,7 +41,7 @@ into this user account:
4141Create user
4242===========
4343
44−.. kernel-include:: $DOCS_BUILD/includes/filtron.rst
44+.. include:: ../../build/docs/includes/filtron.rst
4545 :start-after: START create user
4646 :end-before: END create user
4747
@@ -49,7 +49,7 @@ Create user
4949Install go
5050==========
5151
52−.. kernel-include:: $DOCS_BUILD/includes/filtron.rst
52+.. include:: ../../build/docs/includes/filtron.rst
5353 :start-after: START install go
5454 :end-before: END install go
5555
@@ -61,11 +61,11 @@ Install :origin:`rules.json <utils/templates/etc/filtron/rules.json>` at
6161``/etc/filtron/rules.json`` (see :ref:`Sample configuration of filtron`) and
6262install filtron software and systemd unit:
6363
64−.. kernel-include:: $DOCS_BUILD/includes/filtron.rst
64+.. include:: ../../build/docs/includes/filtron.rst
6565 :start-after: START install filtron
6666 :end-before: END install filtron
6767
68−.. kernel-include:: $DOCS_BUILD/includes/filtron.rst
68+.. include:: ../../build/docs/includes/filtron.rst
6969 :start-after: START install systemd unit
7070 :end-before: END install systemd unit
7171
docs/utils/index.rst → _sources/utils/index.rst.txtrenamed+8−7
@@ -1,11 +1,12 @@
11.. _searx_utils:
22.. _toolboxing:
33
4−===================
5−Admin's tooling box
6−===================
4+=======================
5+Tooling box ``utils/*``
6+=======================
77
8−In the folder :origin:`utils/` we maintain some tools useful for administrators.
8+In the folder :origin:`utils/` we maintain some tools useful for admins and
9+developers.
910
1011.. toctree::
1112 :maxdepth: 2
@@ -39,14 +40,14 @@ Scripts to maintain services often dispose of common commands and environments.
3940 <lxc-searx.env>` use ::
4041
4142 sudo -H ./utils/lxc.sh cmd -- FORCE_TIMEOUT=0 ./utils/filtron.sh apache install
42−
43+
4344.. _toolboxing setup:
4445
4546Tooling box setup
4647=================
4748
48−The main setup is done in the :origin:`.config.sh` (read also :ref:`settings
49−global`).
49+The main setup is done in the :origin:`.config.sh` (read also :ref:`makefile
50+setup`).
5051
5152.. literalinclude:: ../../.config.sh
5253 :language: bash
docs/utils/lxc.sh.rst → _sources/utils/lxc.sh.rst.txtrenamed+8−9
@@ -47,9 +47,9 @@ one**::
4747
4848*Good to know ...*
4949
50−Each container shares the root folder of the repository and the command
51−``utils/lxc.sh cmd`` **handles relative path names transparent**, compare output
52−of::
50+Eeach container shares the root folder of the repository and the
51+command ``utils/lxc.sh cmd`` **handles relative path names transparent**,
52+compare output of::
5353
5454 $ sudo -H ./utils/lxc.sh cmd -- ls -la Makefile
5555 ...
@@ -66,7 +66,6 @@ If there comes the time you want to **get rid off all** the containers and
6666 $ sudo -H ./utils/lxc.sh remove
6767 $ sudo -H ./utils/lxc.sh remove images
6868
69−.. _lxc.sh install suite:
7069
7170Install suite
7271=============
@@ -103,7 +102,7 @@ Running commands
103102:ref:`toolboxing`. By example: to setup a :ref:`buildhosts` and run the
104103Makefile target ``test`` in the archlinux_ container::
105104
106− sudo -H ./utils/lxc.sh cmd searx-archlinux ./utils/searx.sh install buildhost
105+ sudo -H ./utils/lxc.sh cmd searx-archlinux ./utils/searx.sh buildhost
107106 sudo -H ./utils/lxc.sh cmd searx-archlinux make test
108107
109108
@@ -115,19 +114,19 @@ The installation procedure to set up a :ref:`build host<buildhosts>` takes its
115114time. Installation in all containers will take more time (time for another cup
116115of coffee).::
117116
118− sudo -H ./utils/lxc.sh cmd -- ./utils/searx.sh install buildhost
117+ sudo -H ./utils/lxc.sh cmd -- ./utils/searx.sh buildhost
119118
120119To build (live) documentation inside a archlinux_ container::
121120
122− sudo -H ./utils/lxc.sh cmd searx-archlinux make docs.clean docs.live
121+ sudo -H ./utils/lxc.sh cmd searx-archlinux make docs-clean docs-live
123122 ...
124123 [I 200331 15:00:42 server:296] Serving on http://0.0.0.0:8080
125124
126125To get IP of the container and the port number *live docs* is listening::
127126
128− $ sudo ./utils/lxc.sh show suite | grep docs.live
127+ $ sudo ./utils/lxc.sh show suite | grep docs-live
129128 ...
130− [searx-archlinux] INFO: (eth0) docs.live: http://n.n.n.12:8080/
129+ [searx-archlinux] INFO: (eth0) docs-live: http://n.n.n.12:8080/
131130
132131
133132.. _lxc.sh help:
docs/utils/morty.sh.rst → _sources/utils/morty.sh.rst.txtrenamed+4−4
@@ -42,7 +42,7 @@ into this user account:
4242Create user
4343===========
4444
45−.. kernel-include:: $DOCS_BUILD/includes/morty.rst
45+.. include:: ../../build/docs/includes/morty.rst
4646 :start-after: START create user
4747 :end-before: END create user
4848
@@ -50,7 +50,7 @@ Create user
5050Install go
5151==========
5252
53−.. kernel-include:: $DOCS_BUILD/includes/morty.rst
53+.. include:: ../../build/docs/includes/morty.rst
5454 :start-after: START install go
5555 :end-before: END install go
5656
@@ -60,11 +60,11 @@ Install morty
6060
6161Install morty software and systemd unit:
6262
63−.. kernel-include:: $DOCS_BUILD/includes/morty.rst
63+.. include:: ../../build/docs/includes/morty.rst
6464 :start-after: START install morty
6565 :end-before: END install morty
6666
67−.. kernel-include:: $DOCS_BUILD/includes/morty.rst
67+.. include:: ../../build/docs/includes/morty.rst
6868 :start-after: START install systemd unit
6969 :end-before: END install systemd unit
7070
docs/utils/searx.sh.rst → _sources/utils/searx.sh.rst.txtrenamed

The content is the same.

_static/basic.cssnew file+768
@@ -0,0 +1,768 @@
1+/*
2+ * basic.css
3+ * ~~~~~~~~~
4+ *
5+ * Sphinx stylesheet -- basic theme.
6+ *
7+ * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
8+ * :license: BSD, see LICENSE for details.
9+ *
10+ */
11+
12+/* -- main layout ----------------------------------------------------------- */
13+
14+div.clearer {
15+ clear: both;
16+}
17+
18+/* -- relbar ---------------------------------------------------------------- */
19+
20+div.related {
21+ width: 100%;
22+ font-size: 90%;
23+}
24+
25+div.related h3 {
26+ display: none;
27+}
28+
29+div.related ul {
30+ margin: 0;
31+ padding: 0 0 0 10px;
32+ list-style: none;
33+}
34+
35+div.related li {
36+ display: inline;
37+}
38+
39+div.related li.right {
40+ float: right;
41+ margin-right: 5px;
42+}
43+
44+/* -- sidebar --------------------------------------------------------------- */
45+
46+div.sphinxsidebarwrapper {
47+ padding: 10px 5px 0 10px;
48+}
49+
50+div.sphinxsidebar {
51+ float: left;
52+ width: 230px;
53+ margin-left: -100%;
54+ font-size: 90%;
55+ word-wrap: break-word;
56+ overflow-wrap : break-word;
57+}
58+
59+div.sphinxsidebar ul {
60+ list-style: none;
61+}
62+
63+div.sphinxsidebar ul ul,
64+div.sphinxsidebar ul.want-points {
65+ margin-left: 20px;
66+ list-style: square;
67+}
68+
69+div.sphinxsidebar ul ul {
70+ margin-top: 0;
71+ margin-bottom: 0;
72+}
73+
74+div.sphinxsidebar form {
75+ margin-top: 10px;
76+}
77+
78+div.sphinxsidebar input {
79+ border: 1px solid #98dbcc;
80+ font-family: sans-serif;
81+ font-size: 1em;
82+}
83+
84+div.sphinxsidebar #searchbox form.search {
85+ overflow: hidden;
86+}
87+
88+div.sphinxsidebar #searchbox input[type="text"] {
89+ float: left;
90+ width: 80%;
91+ padding: 0.25em;
92+ box-sizing: border-box;
93+}
94+
95+div.sphinxsidebar #searchbox input[type="submit"] {
96+ float: left;
97+ width: 20%;
98+ border-left: none;
99+ padding: 0.25em;
100+ box-sizing: border-box;
101+}
102+
103+
104+img {
105+ border: 0;
106+ max-width: 100%;
107+}
108+
109+/* -- search page ----------------------------------------------------------- */
110+
111+ul.search {
112+ margin: 10px 0 0 20px;
113+ padding: 0;
114+}
115+
116+ul.search li {
117+ padding: 5px 0 5px 20px;
118+ background-image: url(file.png);
119+ background-repeat: no-repeat;
120+ background-position: 0 7px;
121+}
122+
123+ul.search li a {
124+ font-weight: bold;
125+}
126+
127+ul.search li div.context {
128+ color: #888;
129+ margin: 2px 0 0 30px;
130+ text-align: left;
131+}
132+
133+ul.keywordmatches li.goodmatch a {
134+ font-weight: bold;
135+}
136+
137+/* -- index page ------------------------------------------------------------ */
138+
139+table.contentstable {
140+ width: 90%;
141+ margin-left: auto;
142+ margin-right: auto;
143+}
144+
145+table.contentstable p.biglink {
146+ line-height: 150%;
147+}
148+
149+a.biglink {
150+ font-size: 1.3em;
151+}
152+
153+span.linkdescr {
154+ font-style: italic;
155+ padding-top: 5px;
156+ font-size: 90%;
157+}
158+
159+/* -- general index --------------------------------------------------------- */
160+
161+table.indextable {
162+ width: 100%;
163+}
164+
165+table.indextable td {
166+ text-align: left;
167+ vertical-align: top;
168+}
169+
170+table.indextable ul {
171+ margin-top: 0;
172+ margin-bottom: 0;
173+ list-style-type: none;
174+}
175+
176+table.indextable > tbody > tr > td > ul {
177+ padding-left: 0em;
178+}
179+
180+table.indextable tr.pcap {
181+ height: 10px;
182+}
183+
184+table.indextable tr.cap {
185+ margin-top: 10px;
186+ background-color: #f2f2f2;
187+}
188+
189+img.toggler {
190+ margin-right: 3px;
191+ margin-top: 3px;
192+ cursor: pointer;
193+}
194+
195+div.modindex-jumpbox {
196+ border-top: 1px solid #ddd;
197+ border-bottom: 1px solid #ddd;
198+ margin: 1em 0 1em 0;
199+ padding: 0.4em;
200+}
201+
202+div.genindex-jumpbox {
203+ border-top: 1px solid #ddd;
204+ border-bottom: 1px solid #ddd;
205+ margin: 1em 0 1em 0;
206+ padding: 0.4em;
207+}
208+
209+/* -- domain module index --------------------------------------------------- */
210+
211+table.modindextable td {
212+ padding: 2px;
213+ border-collapse: collapse;
214+}
215+
216+/* -- general body styles --------------------------------------------------- */
217+
218+div.body {
219+ min-width: 450px;
220+ max-width: 800px;
221+}
222+
223+div.body p, div.body dd, div.body li, div.body blockquote {
224+ -moz-hyphens: auto;
225+ -ms-hyphens: auto;
226+ -webkit-hyphens: auto;
227+ hyphens: auto;
228+}
229+
230+a.headerlink {
231+ visibility: hidden;
232+}
233+
234+a.brackets:before,
235+span.brackets > a:before{
236+ content: "[";
237+}
238+
239+a.brackets:after,
240+span.brackets > a:after {
241+ content: "]";
242+}
243+
244+h1:hover > a.headerlink,
245+h2:hover > a.headerlink,
246+h3:hover > a.headerlink,
247+h4:hover > a.headerlink,
248+h5:hover > a.headerlink,
249+h6:hover > a.headerlink,
250+dt:hover > a.headerlink,
251+caption:hover > a.headerlink,
252+p.caption:hover > a.headerlink,
253+div.code-block-caption:hover > a.headerlink {
254+ visibility: visible;
255+}
256+
257+div.body p.caption {
258+ text-align: inherit;
259+}
260+
261+div.body td {
262+ text-align: left;
263+}
264+
265+.first {
266+ margin-top: 0 !important;
267+}
268+
269+p.rubric {
270+ margin-top: 30px;
271+ font-weight: bold;
272+}
273+
274+img.align-left, .figure.align-left, object.align-left {
275+ clear: left;
276+ float: left;
277+ margin-right: 1em;
278+}
279+
280+img.align-right, .figure.align-right, object.align-right {
281+ clear: right;
282+ float: right;
283+ margin-left: 1em;
284+}
285+
286+img.align-center, .figure.align-center, object.align-center {
287+ display: block;
288+ margin-left: auto;
289+ margin-right: auto;
290+}
291+
292+img.align-default, .figure.align-default {
293+ display: block;
294+ margin-left: auto;
295+ margin-right: auto;
296+}
297+
298+.align-left {
299+ text-align: left;
300+}
301+
302+.align-center {
303+ text-align: center;
304+}
305+
306+.align-default {
307+ text-align: center;
308+}
309+
310+.align-right {
311+ text-align: right;
312+}
313+
314+/* -- sidebars -------------------------------------------------------------- */
315+
316+div.sidebar {
317+ margin: 0 0 0.5em 1em;
318+ border: 1px solid #ddb;
319+ padding: 7px 7px 0 7px;
320+ background-color: #ffe;
321+ width: 40%;
322+ float: right;
323+}
324+
325+p.sidebar-title {
326+ font-weight: bold;
327+}
328+
329+/* -- topics ---------------------------------------------------------------- */
330+
331+div.topic {
332+ border: 1px solid #ccc;
333+ padding: 7px 7px 0 7px;
334+ margin: 10px 0 10px 0;
335+}
336+
337+p.topic-title {
338+ font-size: 1.1em;
339+ font-weight: bold;
340+ margin-top: 10px;
341+}
342+
343+/* -- admonitions ----------------------------------------------------------- */
344+
345+div.admonition {
346+ margin-top: 10px;
347+ margin-bottom: 10px;
348+ padding: 7px;
349+}
350+
351+div.admonition dt {
352+ font-weight: bold;
353+}
354+
355+div.admonition dl {
356+ margin-bottom: 0;
357+}
358+
359+p.admonition-title {
360+ margin: 0px 10px 5px 0px;
361+ font-weight: bold;
362+}
363+
364+div.body p.centered {
365+ text-align: center;
366+ margin-top: 25px;
367+}
368+
369+/* -- tables ---------------------------------------------------------------- */
370+
371+table.docutils {
372+ border: 0;
373+ border-collapse: collapse;
374+}
375+
376+table.align-center {
377+ margin-left: auto;
378+ margin-right: auto;
379+}
380+
381+table.align-default {
382+ margin-left: auto;
383+ margin-right: auto;
384+}
385+
386+table caption span.caption-number {
387+ font-style: italic;
388+}
389+
390+table caption span.caption-text {
391+}
392+
393+table.docutils td, table.docutils th {
394+ padding: 1px 8px 1px 5px;
395+ border-top: 0;
396+ border-left: 0;
397+ border-right: 0;
398+ border-bottom: 1px solid #aaa;
399+}
400+
401+table.footnote td, table.footnote th {
402+ border: 0 !important;
403+}
404+
405+th {
406+ text-align: left;
407+ padding-right: 5px;
408+}
409+
410+table.citation {
411+ border-left: solid 1px gray;
412+ margin-left: 1px;
413+}
414+
415+table.citation td {
416+ border-bottom: none;
417+}
418+
419+th > p:first-child,
420+td > p:first-child {
421+ margin-top: 0px;
422+}
423+
424+th > p:last-child,
425+td > p:last-child {
426+ margin-bottom: 0px;
427+}
428+
429+/* -- figures --------------------------------------------------------------- */
430+
431+div.figure {
432+ margin: 0.5em;
433+ padding: 0.5em;
434+}
435+
436+div.figure p.caption {
437+ padding: 0.3em;
438+}
439+
440+div.figure p.caption span.caption-number {
441+ font-style: italic;
442+}
443+
444+div.figure p.caption span.caption-text {
445+}
446+
447+/* -- field list styles ----------------------------------------------------- */
448+
449+table.field-list td, table.field-list th {
450+ border: 0 !important;
451+}
452+
453+.field-list ul {
454+ margin: 0;
455+ padding-left: 1em;
456+}
457+
458+.field-list p {
459+ margin: 0;
460+}
461+
462+.field-name {
463+ -moz-hyphens: manual;
464+ -ms-hyphens: manual;
465+ -webkit-hyphens: manual;
466+ hyphens: manual;
467+}
468+
469+/* -- hlist styles ---------------------------------------------------------- */
470+
471+table.hlist td {
472+ vertical-align: top;
473+}
474+
475+
476+/* -- other body styles ----------------------------------------------------- */
477+
478+ol.arabic {
479+ list-style: decimal;
480+}
481+
482+ol.loweralpha {
483+ list-style: lower-alpha;
484+}
485+
486+ol.upperalpha {
487+ list-style: upper-alpha;
488+}
489+
490+ol.lowerroman {
491+ list-style: lower-roman;
492+}
493+
494+ol.upperroman {
495+ list-style: upper-roman;
496+}
497+
498+li > p:first-child {
499+ margin-top: 0px;
500+}
501+
502+li > p:last-child {
503+ margin-bottom: 0px;
504+}
505+
506+dl.footnote > dt,
507+dl.citation > dt {
508+ float: left;
509+}
510+
511+dl.footnote > dd,
512+dl.citation > dd {
513+ margin-bottom: 0em;
514+}
515+
516+dl.footnote > dd:after,
517+dl.citation > dd:after {
518+ content: "";
519+ clear: both;
520+}
521+
522+dl.field-list {
523+ display: grid;
524+ grid-template-columns: fit-content(30%) auto;
525+}
526+
527+dl.field-list > dt {
528+ font-weight: bold;
529+ word-break: break-word;
530+ padding-left: 0.5em;
531+ padding-right: 5px;
532+}
533+
534+dl.field-list > dt:after {
535+ content: ":";
536+}
537+
538+dl.field-list > dd {
539+ padding-left: 0.5em;
540+ margin-top: 0em;
541+ margin-left: 0em;
542+ margin-bottom: 0em;
543+}
544+
545+dl {
546+ margin-bottom: 15px;
547+}
548+
549+dd > p:first-child {
550+ margin-top: 0px;
551+}
552+
553+dd ul, dd table {
554+ margin-bottom: 10px;
555+}
556+
557+dd {
558+ margin-top: 3px;
559+ margin-bottom: 10px;
560+ margin-left: 30px;
561+}
562+
563+dt:target, span.highlighted {
564+ background-color: #fbe54e;
565+}
566+
567+rect.highlighted {
568+ fill: #fbe54e;
569+}
570+
571+dl.glossary dt {
572+ font-weight: bold;
573+ font-size: 1.1em;
574+}
575+
576+.optional {
577+ font-size: 1.3em;
578+}
579+
580+.sig-paren {
581+ font-size: larger;
582+}
583+
584+.versionmodified {
585+ font-style: italic;
586+}
587+
588+.system-message {
589+ background-color: #fda;
590+ padding: 5px;
591+ border: 3px solid red;
592+}
593+
594+.footnote:target {
595+ background-color: #ffa;
596+}
597+
598+.line-block {
599+ display: block;
600+ margin-top: 1em;
601+ margin-bottom: 1em;
602+}
603+
604+.line-block .line-block {
605+ margin-top: 0;
606+ margin-bottom: 0;
607+ margin-left: 1.5em;
608+}
609+
610+.guilabel, .menuselection {
611+ font-family: sans-serif;
612+}
613+
614+.accelerator {
615+ text-decoration: underline;
616+}
617+
618+.classifier {
619+ font-style: oblique;
620+}
621+
622+.classifier:before {
623+ font-style: normal;
624+ margin: 0.5em;
625+ content: ":";
626+}
627+
628+abbr, acronym {
629+ border-bottom: dotted 1px;
630+ cursor: help;
631+}
632+
633+/* -- code displays --------------------------------------------------------- */
634+
635+pre {
636+ overflow: auto;
637+ overflow-y: hidden; /* fixes display issues on Chrome browsers */
638+}
639+
640+span.pre {
641+ -moz-hyphens: none;
642+ -ms-hyphens: none;
643+ -webkit-hyphens: none;
644+ hyphens: none;
645+}
646+
647+td.linenos pre {
648+ padding: 5px 0px;
649+ border: 0;
650+ background-color: transparent;
651+ color: #aaa;
652+}
653+
654+table.highlighttable {
655+ margin-left: 0.5em;
656+}
657+
658+table.highlighttable td {
659+ padding: 0 0.5em 0 0.5em;
660+}
661+
662+div.code-block-caption {
663+ padding: 2px 5px;
664+ font-size: small;
665+}
666+
667+div.code-block-caption code {
668+ background-color: transparent;
669+}
670+
671+div.code-block-caption + div > div.highlight > pre {
672+ margin-top: 0;
673+}
674+
675+div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */
676+ user-select: none;
677+}
678+
679+div.code-block-caption span.caption-number {
680+ padding: 0.1em 0.3em;
681+ font-style: italic;
682+}
683+
684+div.code-block-caption span.caption-text {
685+}
686+
687+div.literal-block-wrapper {
688+ padding: 1em 1em 0;
689+}
690+
691+div.literal-block-wrapper div.highlight {
692+ margin: 0;
693+}
694+
695+code.descname {
696+ background-color: transparent;
697+ font-weight: bold;
698+ font-size: 1.2em;
699+}
700+
701+code.descclassname {
702+ background-color: transparent;
703+}
704+
705+code.xref, a code {
706+ background-color: transparent;
707+ font-weight: bold;
708+}
709+
710+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
711+ background-color: transparent;
712+}
713+
714+.viewcode-link {
715+ float: right;
716+}
717+
718+.viewcode-back {
719+ float: right;
720+ font-family: sans-serif;
721+}
722+
723+div.viewcode-block:target {
724+ margin: -1px -10px;
725+ padding: 0 10px;
726+}
727+
728+/* -- math display ---------------------------------------------------------- */
729+
730+img.math {
731+ vertical-align: middle;
732+}
733+
734+div.body div.math p {
735+ text-align: center;
736+}
737+
738+span.eqno {
739+ float: right;
740+}
741+
742+span.eqno a.headerlink {
743+ position: relative;
744+ left: 0px;
745+ z-index: 1;
746+}
747+
748+div.math:hover a.headerlink {
749+ visibility: visible;
750+}
751+
752+/* -- printout stylesheet --------------------------------------------------- */
753+
754+@media print {
755+ div.document,
756+ div.documentwrapper,
757+ div.bodywrapper {
758+ margin: 0 !important;
759+ width: 100%;
760+ }
761+
762+ div.sphinxsidebar,
763+ div.related,
764+ div.footer,
765+ #top-link {
766+ display: none;
767+ }
768+}
_static/doctools.jsnew file+315
@@ -0,0 +1,315 @@
1+/*
2+ * doctools.js
3+ * ~~~~~~~~~~~
4+ *
5+ * Sphinx JavaScript utilities for all documentation.
6+ *
7+ * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
8+ * :license: BSD, see LICENSE for details.
9+ *
10+ */
11+
12+/**
13+ * select a different prefix for underscore
14+ */
15+$u = _.noConflict();
16+
17+/**
18+ * make the code below compatible with browsers without
19+ * an installed firebug like debugger
20+if (!window.console || !console.firebug) {
21+ var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
22+ "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
23+ "profile", "profileEnd"];
24+ window.console = {};
25+ for (var i = 0; i < names.length; ++i)
26+ window.console[names[i]] = function() {};
27+}
28+ */
29+
30+/**
31+ * small helper function to urldecode strings
32+ */
33+jQuery.urldecode = function(x) {
34+ return decodeURIComponent(x).replace(/\+/g, ' ');
35+};
36+
37+/**
38+ * small helper function to urlencode strings
39+ */
40+jQuery.urlencode = encodeURIComponent;
41+
42+/**
43+ * This function returns the parsed url parameters of the
44+ * current request. Multiple values per key are supported,
45+ * it will always return arrays of strings for the value parts.
46+ */
47+jQuery.getQueryParameters = function(s) {
48+ if (typeof s === 'undefined')
49+ s = document.location.search;
50+ var parts = s.substr(s.indexOf('?') + 1).split('&');
51+ var result = {};
52+ for (var i = 0; i < parts.length; i++) {
53+ var tmp = parts[i].split('=', 2);
54+ var key = jQuery.urldecode(tmp[0]);
55+ var value = jQuery.urldecode(tmp[1]);
56+ if (key in result)
57+ result[key].push(value);
58+ else
59+ result[key] = [value];
60+ }
61+ return result;
62+};
63+
64+/**
65+ * highlight a given string on a jquery object by wrapping it in
66+ * span elements with the given class name.
67+ */
68+jQuery.fn.highlightText = function(text, className) {
69+ function highlight(node, addItems) {
70+ if (node.nodeType === 3) {
71+ var val = node.nodeValue;
72+ var pos = val.toLowerCase().indexOf(text);
73+ if (pos >= 0 &&
74+ !jQuery(node.parentNode).hasClass(className) &&
75+ !jQuery(node.parentNode).hasClass("nohighlight")) {
76+ var span;
77+ var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
78+ if (isInSVG) {
79+ span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
80+ } else {
81+ span = document.createElement("span");
82+ span.className = className;
83+ }
84+ span.appendChild(document.createTextNode(val.substr(pos, text.length)));
85+ node.parentNode.insertBefore(span, node.parentNode.insertBefore(
86+ document.createTextNode(val.substr(pos + text.length)),
87+ node.nextSibling));
88+ node.nodeValue = val.substr(0, pos);
89+ if (isInSVG) {
90+ var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
91+ var bbox = node.parentElement.getBBox();
92+ rect.x.baseVal.value = bbox.x;
93+ rect.y.baseVal.value = bbox.y;
94+ rect.width.baseVal.value = bbox.width;
95+ rect.height.baseVal.value = bbox.height;
96+ rect.setAttribute('class', className);
97+ addItems.push({
98+ "parent": node.parentNode,
99+ "target": rect});
100+ }
101+ }
102+ }
103+ else if (!jQuery(node).is("button, select, textarea")) {
104+ jQuery.each(node.childNodes, function() {
105+ highlight(this, addItems);
106+ });
107+ }
108+ }
109+ var addItems = [];
110+ var result = this.each(function() {
111+ highlight(this, addItems);
112+ });
113+ for (var i = 0; i < addItems.length; ++i) {
114+ jQuery(addItems[i].parent).before(addItems[i].target);
115+ }
116+ return result;
117+};
118+
119+/*
120+ * backward compatibility for jQuery.browser
121+ * This will be supported until firefox bug is fixed.
122+ */
123+if (!jQuery.browser) {
124+ jQuery.uaMatch = function(ua) {
125+ ua = ua.toLowerCase();
126+
127+ var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
128+ /(webkit)[ \/]([\w.]+)/.exec(ua) ||
129+ /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
130+ /(msie) ([\w.]+)/.exec(ua) ||
131+ ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
132+ [];
133+
134+ return {
135+ browser: match[ 1 ] || "",
136+ version: match[ 2 ] || "0"
137+ };
138+ };
139+ jQuery.browser = {};
140+ jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
141+}
142+
143+/**
144+ * Small JavaScript module for the documentation.
145+ */
146+var Documentation = {
147+
148+ init : function() {
149+ this.fixFirefoxAnchorBug();
150+ this.highlightSearchWords();
151+ this.initIndexTable();
152+ if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) {
153+ this.initOnKeyListeners();
154+ }
155+ },
156+
157+ /**
158+ * i18n support
159+ */
160+ TRANSLATIONS : {},
161+ PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; },
162+ LOCALE : 'unknown',
163+
164+ // gettext and ngettext don't access this so that the functions
165+ // can safely bound to a different name (_ = Documentation.gettext)
166+ gettext : function(string) {
167+ var translated = Documentation.TRANSLATIONS[string];
168+ if (typeof translated === 'undefined')
169+ return string;
170+ return (typeof translated === 'string') ? translated : translated[0];
171+ },
172+
173+ ngettext : function(singular, plural, n) {
174+ var translated = Documentation.TRANSLATIONS[singular];
175+ if (typeof translated === 'undefined')
176+ return (n == 1) ? singular : plural;
177+ return translated[Documentation.PLURALEXPR(n)];
178+ },
179+
180+ addTranslations : function(catalog) {
181+ for (var key in catalog.messages)
182+ this.TRANSLATIONS[key] = catalog.messages[key];
183+ this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
184+ this.LOCALE = catalog.locale;
185+ },
186+
187+ /**
188+ * add context elements like header anchor links
189+ */
190+ addContextElements : function() {
191+ $('div[id] > :header:first').each(function() {
192+ $('<a class="headerlink">\u00B6</a>').
193+ attr('href', '#' + this.id).
194+ attr('title', _('Permalink to this headline')).
195+ appendTo(this);
196+ });
197+ $('dt[id]').each(function() {
198+ $('<a class="headerlink">\u00B6</a>').
199+ attr('href', '#' + this.id).
200+ attr('title', _('Permalink to this definition')).
201+ appendTo(this);
202+ });
203+ },
204+
205+ /**
206+ * workaround a firefox stupidity
207+ * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
208+ */
209+ fixFirefoxAnchorBug : function() {
210+ if (document.location.hash && $.browser.mozilla)
211+ window.setTimeout(function() {
212+ document.location.href += '';
213+ }, 10);
214+ },
215+
216+ /**
217+ * highlight the search words provided in the url in the text
218+ */
219+ highlightSearchWords : function() {
220+ var params = $.getQueryParameters();
221+ var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
222+ if (terms.length) {
223+ var body = $('div.body');
224+ if (!body.length) {
225+ body = $('body');
226+ }
227+ window.setTimeout(function() {
228+ $.each(terms, function() {
229+ body.highlightText(this.toLowerCase(), 'highlighted');
230+ });
231+ }, 10);
232+ $('<p class="highlight-link"><a href="javascript:Documentation.' +
233+ 'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
234+ .appendTo($('#searchbox'));
235+ }
236+ },
237+
238+ /**
239+ * init the domain index toggle buttons
240+ */
241+ initIndexTable : function() {
242+ var togglers = $('img.toggler').click(function() {
243+ var src = $(this).attr('src');
244+ var idnum = $(this).attr('id').substr(7);
245+ $('tr.cg-' + idnum).toggle();
246+ if (src.substr(-9) === 'minus.png')
247+ $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
248+ else
249+ $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
250+ }).css('display', '');
251+ if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
252+ togglers.click();
253+ }
254+ },
255+
256+ /**
257+ * helper function to hide the search marks again
258+ */
259+ hideSearchWords : function() {
260+ $('#searchbox .highlight-link').fadeOut(300);
261+ $('span.highlighted').removeClass('highlighted');
262+ },
263+
264+ /**
265+ * make the url absolute
266+ */
267+ makeURL : function(relativeURL) {
268+ return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
269+ },
270+
271+ /**
272+ * get the current relative url
273+ */
274+ getCurrentURL : function() {
275+ var path = document.location.pathname;
276+ var parts = path.split(/\//);
277+ $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
278+ if (this === '..')
279+ parts.pop();
280+ });
281+ var url = parts.join('/');
282+ return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
283+ },
284+
285+ initOnKeyListeners: function() {
286+ $(document).keydown(function(event) {
287+ var activeElementType = document.activeElement.tagName;
288+ // don't navigate when in search box or textarea
289+ if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT'
290+ && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) {
291+ switch (event.keyCode) {
292+ case 37: // left
293+ var prevHref = $('link[rel="prev"]').prop('href');
294+ if (prevHref) {
295+ window.location.href = prevHref;
296+ return false;
297+ }
298+ case 39: // right
299+ var nextHref = $('link[rel="next"]').prop('href');
300+ if (nextHref) {
301+ window.location.href = nextHref;
302+ return false;
303+ }
304+ }
305+ }
306+ });
307+ }
308+};
309+
310+// quick alias for translations
311+_ = Documentation.gettext;
312+
313+$(document).ready(function() {
314+ Documentation.init();
315+});
_static/documentation_options.jsnew file+12
@@ -0,0 +1,12 @@
1+var DOCUMENTATION_OPTIONS = {
2+ URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
3+ VERSION: '0.16.0',
4+ LANGUAGE: 'None',
5+ COLLAPSE_INDEX: false,
6+ BUILDER: 'html',
7+ FILE_SUFFIX: '.html',
8+ LINK_SUFFIX: '.html',
9+ HAS_SOURCE: true,
10+ SOURCELINK_SUFFIX: '.txt',
11+ NAVIGATION_WITH_KEYS: false
12+};
_static/file.pngnew file

Binary file not shown.

docs/static/img/searx_logo_small.png → _static/img/searx_logo_small.pngrenamed

Binary file not shown.

_static/jquery-3.4.1.jsnew file+10598
@@ -0,0 +1,10598 @@
1+/*!
2+ * jQuery JavaScript Library v3.4.1
3+ * https://jquery.com/
4+ *
5+ * Includes Sizzle.js
6+ * https://sizzlejs.com/
7+ *
8+ * Copyright JS Foundation and other contributors
9+ * Released under the MIT license
10+ * https://jquery.org/license
11+ *
12+ * Date: 2019-05-01T21:04Z
13+ */
14+( function( global, factory ) {
15+
16+ "use strict";
17+
18+ if ( typeof module === "object" && typeof module.exports === "object" ) {
19+
20+ // For CommonJS and CommonJS-like environments where a proper `window`
21+ // is present, execute the factory and get jQuery.
22+ // For environments that do not have a `window` with a `document`
23+ // (such as Node.js), expose a factory as module.exports.
24+ // This accentuates the need for the creation of a real `window`.
25+ // e.g. var jQuery = require("jquery")(window);
26+ // See ticket #14549 for more info.
27+ module.exports = global.document ?
28+ factory( global, true ) :
29+ function( w ) {
30+ if ( !w.document ) {
31+ throw new Error( "jQuery requires a window with a document" );
32+ }
33+ return factory( w );
34+ };
35+ } else {
36+ factory( global );
37+ }
38+
39+// Pass this if window is not defined yet
40+} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
41+
42+// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
43+// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
44+// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
45+// enough that all such attempts are guarded in a try block.
46+"use strict";
47+
48+var arr = [];
49+
50+var document = window.document;
51+
52+var getProto = Object.getPrototypeOf;
53+
54+var slice = arr.slice;
55+
56+var concat = arr.concat;
57+
58+var push = arr.push;
59+
60+var indexOf = arr.indexOf;
61+
62+var class2type = {};
63+
64+var toString = class2type.toString;
65+
66+var hasOwn = class2type.hasOwnProperty;
67+
68+var fnToString = hasOwn.toString;
69+
70+var ObjectFunctionString = fnToString.call( Object );
71+
72+var support = {};
73+
74+var isFunction = function isFunction( obj ) {
75+
76+ // Support: Chrome <=57, Firefox <=52
77+ // In some browsers, typeof returns "function" for HTML <object> elements
78+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
79+ // We don't want to classify *any* DOM node as a function.
80+ return typeof obj === "function" && typeof obj.nodeType !== "number";
81+ };
82+
83+
84+var isWindow = function isWindow( obj ) {
85+ return obj != null && obj === obj.window;
86+ };
87+
88+
89+
90+
91+ var preservedScriptAttributes = {
92+ type: true,
93+ src: true,
94+ nonce: true,
95+ noModule: true
96+ };
97+
98+ function DOMEval( code, node, doc ) {
99+ doc = doc || document;
100+
101+ var i, val,
102+ script = doc.createElement( "script" );
103+
104+ script.text = code;
105+ if ( node ) {
106+ for ( i in preservedScriptAttributes ) {
107+
108+ // Support: Firefox 64+, Edge 18+
109+ // Some browsers don't support the "nonce" property on scripts.
110+ // On the other hand, just using `getAttribute` is not enough as
111+ // the `nonce` attribute is reset to an empty string whenever it
112+ // becomes browsing-context connected.
113+ // See https://github.com/whatwg/html/issues/2369
114+ // See https://html.spec.whatwg.org/#nonce-attributes
115+ // The `node.getAttribute` check was added for the sake of
116+ // `jQuery.globalEval` so that it can fake a nonce-containing node
117+ // via an object.
118+ val = node[ i ] || node.getAttribute && node.getAttribute( i );
119+ if ( val ) {
120+ script.setAttribute( i, val );
121+ }
122+ }
123+ }
124+ doc.head.appendChild( script ).parentNode.removeChild( script );
125+ }
126+
127+
128+function toType( obj ) {
129+ if ( obj == null ) {
130+ return obj + "";
131+ }
132+
133+ // Support: Android <=2.3 only (functionish RegExp)
134+ return typeof obj === "object" || typeof obj === "function" ?
135+ class2type[ toString.call( obj ) ] || "object" :
136+ typeof obj;
137+}
138+/* global Symbol */
139+// Defining this global in .eslintrc.json would create a danger of using the global
140+// unguarded in another place, it seems safer to define global only for this module
141+
142+
143+
144+var
145+ version = "3.4.1",
146+
147+ // Define a local copy of jQuery
148+ jQuery = function( selector, context ) {
149+
150+ // The jQuery object is actually just the init constructor 'enhanced'
151+ // Need init if jQuery is called (just allow error to be thrown if not included)
152+ return new jQuery.fn.init( selector, context );
153+ },
154+
155+ // Support: Android <=4.0 only
156+ // Make sure we trim BOM and NBSP
157+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
158+
159+jQuery.fn = jQuery.prototype = {
160+
161+ // The current version of jQuery being used
162+ jquery: version,
163+
164+ constructor: jQuery,
165+
166+ // The default length of a jQuery object is 0
167+ length: 0,
168+
169+ toArray: function() {
170+ return slice.call( this );
171+ },
172+
173+ // Get the Nth element in the matched element set OR
174+ // Get the whole matched element set as a clean array
175+ get: function( num ) {
176+
177+ // Return all the elements in a clean array
178+ if ( num == null ) {
179+ return slice.call( this );
180+ }
181+
182+ // Return just the one element from the set
183+ return num < 0 ? this[ num + this.length ] : this[ num ];
184+ },
185+
186+ // Take an array of elements and push it onto the stack
187+ // (returning the new matched element set)
188+ pushStack: function( elems ) {
189+
190+ // Build a new jQuery matched element set
191+ var ret = jQuery.merge( this.constructor(), elems );
192+
193+ // Add the old object onto the stack (as a reference)
194+ ret.prevObject = this;
195+
196+ // Return the newly-formed element set
197+ return ret;
198+ },
199+
200+ // Execute a callback for every element in the matched set.
201+ each: function( callback ) {
202+ return jQuery.each( this, callback );
203+ },
204+
205+ map: function( callback ) {
206+ return this.pushStack( jQuery.map( this, function( elem, i ) {
207+ return callback.call( elem, i, elem );
208+ } ) );
209+ },
210+
211+ slice: function() {
212+ return this.pushStack( slice.apply( this, arguments ) );
213+ },
214+
215+ first: function() {
216+ return this.eq( 0 );
217+ },
218+
219+ last: function() {
220+ return this.eq( -1 );
221+ },
222+
223+ eq: function( i ) {
224+ var len = this.length,
225+ j = +i + ( i < 0 ? len : 0 );
226+ return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
227+ },
228+
229+ end: function() {
230+ return this.prevObject || this.constructor();
231+ },
232+
233+ // For internal use only.
234+ // Behaves like an Array's method, not like a jQuery method.
235+ push: push,
236+ sort: arr.sort,
237+ splice: arr.splice
238+};
239+
240+jQuery.extend = jQuery.fn.extend = function() {
241+ var options, name, src, copy, copyIsArray, clone,
242+ target = arguments[ 0 ] || {},
243+ i = 1,
244+ length = arguments.length,
245+ deep = false;
246+
247+ // Handle a deep copy situation
248+ if ( typeof target === "boolean" ) {
249+ deep = target;
250+
251+ // Skip the boolean and the target
252+ target = arguments[ i ] || {};
253+ i++;
254+ }
255+
256+ // Handle case when target is a string or something (possible in deep copy)
257+ if ( typeof target !== "object" && !isFunction( target ) ) {
258+ target = {};
259+ }
260+
261+ // Extend jQuery itself if only one argument is passed
262+ if ( i === length ) {
263+ target = this;
264+ i--;
265+ }
266+
267+ for ( ; i < length; i++ ) {
268+
269+ // Only deal with non-null/undefined values
270+ if ( ( options = arguments[ i ] ) != null ) {
271+
272+ // Extend the base object
273+ for ( name in options ) {
274+ copy = options[ name ];
275+
276+ // Prevent Object.prototype pollution
277+ // Prevent never-ending loop
278+ if ( name === "__proto__" || target === copy ) {
279+ continue;
280+ }
281+
282+ // Recurse if we're merging plain objects or arrays
283+ if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
284+ ( copyIsArray = Array.isArray( copy ) ) ) ) {
285+ src = target[ name ];
286+
287+ // Ensure proper type for the source value
288+ if ( copyIsArray && !Array.isArray( src ) ) {
289+ clone = [];
290+ } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
291+ clone = {};
292+ } else {
293+ clone = src;
294+ }
295+ copyIsArray = false;
296+
297+ // Never move original objects, clone them
298+ target[ name ] = jQuery.extend( deep, clone, copy );
299+
300+ // Don't bring in undefined values
301+ } else if ( copy !== undefined ) {
302+ target[ name ] = copy;
303+ }
304+ }
305+ }
306+ }
307+
308+ // Return the modified object
309+ return target;
310+};
311+
312+jQuery.extend( {
313+
314+ // Unique for each copy of jQuery on the page
315+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
316+
317+ // Assume jQuery is ready without the ready module
318+ isReady: true,
319+
320+ error: function( msg ) {
321+ throw new Error( msg );
322+ },
323+
324+ noop: function() {},
325+
326+ isPlainObject: function( obj ) {
327+ var proto, Ctor;
328+
329+ // Detect obvious negatives
330+ // Use toString instead of jQuery.type to catch host objects
331+ if ( !obj || toString.call( obj ) !== "[object Object]" ) {
332+ return false;
333+ }
334+
335+ proto = getProto( obj );
336+
337+ // Objects with no prototype (e.g., `Object.create( null )`) are plain
338+ if ( !proto ) {
339+ return true;
340+ }
341+
342+ // Objects with prototype are plain iff they were constructed by a global Object function
343+ Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
344+ return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
345+ },
346+
347+ isEmptyObject: function( obj ) {
348+ var name;
349+
350+ for ( name in obj ) {
351+ return false;
352+ }
353+ return true;
354+ },
355+
356+ // Evaluates a script in a global context
357+ globalEval: function( code, options ) {
358+ DOMEval( code, { nonce: options && options.nonce } );
359+ },
360+
361+ each: function( obj, callback ) {
362+ var length, i = 0;
363+
364+ if ( isArrayLike( obj ) ) {
365+ length = obj.length;
366+ for ( ; i < length; i++ ) {
367+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
368+ break;
369+ }
370+ }
371+ } else {
372+ for ( i in obj ) {
373+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
374+ break;
375+ }
376+ }
377+ }
378+
379+ return obj;
380+ },
381+
382+ // Support: Android <=4.0 only
383+ trim: function( text ) {
384+ return text == null ?
385+ "" :
386+ ( text + "" ).replace( rtrim, "" );
387+ },
388+
389+ // results is for internal usage only
390+ makeArray: function( arr, results ) {
391+ var ret = results || [];
392+
393+ if ( arr != null ) {
394+ if ( isArrayLike( Object( arr ) ) ) {
395+ jQuery.merge( ret,
396+ typeof arr === "string" ?
397+ [ arr ] : arr
398+ );
399+ } else {
400+ push.call( ret, arr );
401+ }
402+ }
403+
404+ return ret;
405+ },
406+
407+ inArray: function( elem, arr, i ) {
408+ return arr == null ? -1 : indexOf.call( arr, elem, i );
409+ },
410+
411+ // Support: Android <=4.0 only, PhantomJS 1 only
412+ // push.apply(_, arraylike) throws on ancient WebKit
413+ merge: function( first, second ) {
414+ var len = +second.length,
415+ j = 0,
416+ i = first.length;
417+
418+ for ( ; j < len; j++ ) {
419+ first[ i++ ] = second[ j ];
420+ }
421+
422+ first.length = i;
423+
424+ return first;
425+ },
426+
427+ grep: function( elems, callback, invert ) {
428+ var callbackInverse,
429+ matches = [],
430+ i = 0,
431+ length = elems.length,
432+ callbackExpect = !invert;
433+
434+ // Go through the array, only saving the items
435+ // that pass the validator function
436+ for ( ; i < length; i++ ) {
437+ callbackInverse = !callback( elems[ i ], i );
438+ if ( callbackInverse !== callbackExpect ) {
439+ matches.push( elems[ i ] );
440+ }
441+ }
442+
443+ return matches;
444+ },
445+
446+ // arg is for internal usage only
447+ map: function( elems, callback, arg ) {
448+ var length, value,
449+ i = 0,
450+ ret = [];
451+
452+ // Go through the array, translating each of the items to their new values
453+ if ( isArrayLike( elems ) ) {
454+ length = elems.length;
455+ for ( ; i < length; i++ ) {
456+ value = callback( elems[ i ], i, arg );
457+
458+ if ( value != null ) {
459+ ret.push( value );
460+ }
461+ }
462+
463+ // Go through every key on the object,
464+ } else {
465+ for ( i in elems ) {
466+ value = callback( elems[ i ], i, arg );
467+
468+ if ( value != null ) {
469+ ret.push( value );
470+ }
471+ }
472+ }
473+
474+ // Flatten any nested arrays
475+ return concat.apply( [], ret );
476+ },
477+
478+ // A global GUID counter for objects
479+ guid: 1,
480+
481+ // jQuery.support is not used in Core but other projects attach their
482+ // properties to it so it needs to exist.
483+ support: support
484+} );
485+
486+if ( typeof Symbol === "function" ) {
487+ jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
488+}
489+
490+// Populate the class2type map
491+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
492+function( i, name ) {
493+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
494+} );
495+
496+function isArrayLike( obj ) {
497+
498+ // Support: real iOS 8.2 only (not reproducible in simulator)
499+ // `in` check used to prevent JIT error (gh-2145)
500+ // hasOwn isn't used here due to false negatives
501+ // regarding Nodelist length in IE
502+ var length = !!obj && "length" in obj && obj.length,
503+ type = toType( obj );
504+
505+ if ( isFunction( obj ) || isWindow( obj ) ) {
506+ return false;
507+ }
508+
509+ return type === "array" || length === 0 ||
510+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
511+}
512+var Sizzle =
513+/*!
514+ * Sizzle CSS Selector Engine v2.3.4
515+ * https://sizzlejs.com/
516+ *
517+ * Copyright JS Foundation and other contributors
518+ * Released under the MIT license
519+ * https://js.foundation/
520+ *
521+ * Date: 2019-04-08
522+ */
523+(function( window ) {
524+
525+var i,
526+ support,
527+ Expr,
528+ getText,
529+ isXML,
530+ tokenize,
531+ compile,
532+ select,
533+ outermostContext,
534+ sortInput,
535+ hasDuplicate,
536+
537+ // Local document vars
538+ setDocument,
539+ document,
540+ docElem,
541+ documentIsHTML,
542+ rbuggyQSA,
543+ rbuggyMatches,
544+ matches,
545+ contains,
546+
547+ // Instance-specific data
548+ expando = "sizzle" + 1 * new Date(),
549+ preferredDoc = window.document,
550+ dirruns = 0,
551+ done = 0,
552+ classCache = createCache(),
553+ tokenCache = createCache(),
554+ compilerCache = createCache(),
555+ nonnativeSelectorCache = createCache(),
556+ sortOrder = function( a, b ) {
557+ if ( a === b ) {
558+ hasDuplicate = true;
559+ }
560+ return 0;
561+ },
562+
563+ // Instance methods
564+ hasOwn = ({}).hasOwnProperty,
565+ arr = [],
566+ pop = arr.pop,
567+ push_native = arr.push,
568+ push = arr.push,
569+ slice = arr.slice,
570+ // Use a stripped-down indexOf as it's faster than native
571+ // https://jsperf.com/thor-indexof-vs-for/5
572+ indexOf = function( list, elem ) {
573+ var i = 0,
574+ len = list.length;
575+ for ( ; i < len; i++ ) {
576+ if ( list[i] === elem ) {
577+ return i;
578+ }
579+ }
580+ return -1;
581+ },
582+
583+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
584+
585+ // Regular expressions
586+
587+ // http://www.w3.org/TR/css3-selectors/#whitespace
588+ whitespace = "[\\x20\\t\\r\\n\\f]",
589+
590+ // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
591+ identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
592+
593+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
594+ attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
595+ // Operator (capture 2)
596+ "*([*^$|!~]?=)" + whitespace +
597+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
598+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
599+ "*\\]",
600+
601+ pseudos = ":(" + identifier + ")(?:\\((" +
602+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
603+ // 1. quoted (capture 3; capture 4 or capture 5)
604+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
605+ // 2. simple (capture 6)
606+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
607+ // 3. anything else (capture 2)
608+ ".*" +
609+ ")\\)|)",
610+
611+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
612+ rwhitespace = new RegExp( whitespace + "+", "g" ),
613+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
614+
615+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
616+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
617+ rdescend = new RegExp( whitespace + "|>" ),
618+
619+ rpseudo = new RegExp( pseudos ),
620+ ridentifier = new RegExp( "^" + identifier + "$" ),
621+
622+ matchExpr = {
623+ "ID": new RegExp( "^#(" + identifier + ")" ),
624+ "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
625+ "TAG": new RegExp( "^(" + identifier + "|[*])" ),
626+ "ATTR": new RegExp( "^" + attributes ),
627+ "PSEUDO": new RegExp( "^" + pseudos ),
628+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
629+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
630+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
631+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
632+ // For use in libraries implementing .is()
633+ // We use this for POS matching in `select`
634+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
635+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
636+ },
637+
638+ rhtml = /HTML$/i,
639+ rinputs = /^(?:input|select|textarea|button)$/i,
640+ rheader = /^h\d$/i,
641+
642+ rnative = /^[^{]+\{\s*\[native \w/,
643+
644+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
645+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
646+
647+ rsibling = /[+~]/,
648+
649+ // CSS escapes
650+ // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
651+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
652+ funescape = function( _, escaped, escapedWhitespace ) {
653+ var high = "0x" + escaped - 0x10000;
654+ // NaN means non-codepoint
655+ // Support: Firefox<24
656+ // Workaround erroneous numeric interpretation of +"0x"
657+ return high !== high || escapedWhitespace ?
658+ escaped :
659+ high < 0 ?
660+ // BMP codepoint
661+ String.fromCharCode( high + 0x10000 ) :
662+ // Supplemental Plane codepoint (surrogate pair)
663+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
664+ },
665+
666+ // CSS string/identifier serialization
667+ // https://drafts.csswg.org/cssom/#common-serializing-idioms
668+ rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
669+ fcssescape = function( ch, asCodePoint ) {
670+ if ( asCodePoint ) {
671+
672+ // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
673+ if ( ch === "\0" ) {
674+ return "\uFFFD";
675+ }
676+
677+ // Control characters and (dependent upon position) numbers get escaped as code points
678+ return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
679+ }
680+
681+ // Other potentially-special ASCII characters get backslash-escaped
682+ return "\\" + ch;
683+ },
684+
685+ // Used for iframes
686+ // See setDocument()
687+ // Removing the function wrapper causes a "Permission Denied"
688+ // error in IE
689+ unloadHandler = function() {
690+ setDocument();
691+ },
692+
693+ inDisabledFieldset = addCombinator(
694+ function( elem ) {
695+ return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
696+ },
697+ { dir: "parentNode", next: "legend" }
698+ );
699+
700+// Optimize for push.apply( _, NodeList )
701+try {
702+ push.apply(
703+ (arr = slice.call( preferredDoc.childNodes )),
704+ preferredDoc.childNodes
705+ );
706+ // Support: Android<4.0
707+ // Detect silently failing push.apply
708+ arr[ preferredDoc.childNodes.length ].nodeType;
709+} catch ( e ) {
710+ push = { apply: arr.length ?
711+
712+ // Leverage slice if possible
713+ function( target, els ) {
714+ push_native.apply( target, slice.call(els) );
715+ } :
716+
717+ // Support: IE<9
718+ // Otherwise append directly
719+ function( target, els ) {
720+ var j = target.length,
721+ i = 0;
722+ // Can't trust NodeList.length
723+ while ( (target[j++] = els[i++]) ) {}
724+ target.length = j - 1;
725+ }
726+ };
727+}
728+
729+function Sizzle( selector, context, results, seed ) {
730+ var m, i, elem, nid, match, groups, newSelector,
731+ newContext = context && context.ownerDocument,
732+
733+ // nodeType defaults to 9, since context defaults to document
734+ nodeType = context ? context.nodeType : 9;
735+
736+ results = results || [];
737+
738+ // Return early from calls with invalid selector or context
739+ if ( typeof selector !== "string" || !selector ||
740+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
741+
742+ return results;
743+ }
744+
745+ // Try to shortcut find operations (as opposed to filters) in HTML documents
746+ if ( !seed ) {
747+
748+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
749+ setDocument( context );
750+ }
751+ context = context || document;
752+
753+ if ( documentIsHTML ) {
754+
755+ // If the selector is sufficiently simple, try using a "get*By*" DOM method
756+ // (excepting DocumentFragment context, where the methods don't exist)
757+ if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
758+
759+ // ID selector
760+ if ( (m = match[1]) ) {
761+
762+ // Document context
763+ if ( nodeType === 9 ) {
764+ if ( (elem = context.getElementById( m )) ) {
765+
766+ // Support: IE, Opera, Webkit
767+ // TODO: identify versions
768+ // getElementById can match elements by name instead of ID
769+ if ( elem.id === m ) {
770+ results.push( elem );
771+ return results;
772+ }
773+ } else {
774+ return results;
775+ }
776+
777+ // Element context
778+ } else {
779+
780+ // Support: IE, Opera, Webkit
781+ // TODO: identify versions
782+ // getElementById can match elements by name instead of ID
783+ if ( newContext && (elem = newContext.getElementById( m )) &&
784+ contains( context, elem ) &&
785+ elem.id === m ) {
786+
787+ results.push( elem );
788+ return results;
789+ }
790+ }
791+
792+ // Type selector
793+ } else if ( match[2] ) {
794+ push.apply( results, context.getElementsByTagName( selector ) );
795+ return results;
796+
797+ // Class selector
798+ } else if ( (m = match[3]) && support.getElementsByClassName &&
799+ context.getElementsByClassName ) {
800+
801+ push.apply( results, context.getElementsByClassName( m ) );
802+ return results;
803+ }
804+ }
805+
806+ // Take advantage of querySelectorAll
807+ if ( support.qsa &&
808+ !nonnativeSelectorCache[ selector + " " ] &&
809+ (!rbuggyQSA || !rbuggyQSA.test( selector )) &&
810+
811+ // Support: IE 8 only
812+ // Exclude object elements
813+ (nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) {
814+
815+ newSelector = selector;
816+ newContext = context;
817+
818+ // qSA considers elements outside a scoping root when evaluating child or
819+ // descendant combinators, which is not what we want.
820+ // In such cases, we work around the behavior by prefixing every selector in the
821+ // list with an ID selector referencing the scope context.
822+ // Thanks to Andrew Dupont for this technique.
823+ if ( nodeType === 1 && rdescend.test( selector ) ) {
824+
825+ // Capture the context ID, setting it first if necessary
826+ if ( (nid = context.getAttribute( "id" )) ) {
827+ nid = nid.replace( rcssescape, fcssescape );
828+ } else {
829+ context.setAttribute( "id", (nid = expando) );
830+ }
831+
832+ // Prefix every selector in the list
833+ groups = tokenize( selector );
834+ i = groups.length;
835+ while ( i-- ) {
836+ groups[i] = "#" + nid + " " + toSelector( groups[i] );
837+ }
838+ newSelector = groups.join( "," );
839+
840+ // Expand context for sibling selectors
841+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
842+ context;
843+ }
844+
845+ try {
846+ push.apply( results,
847+ newContext.querySelectorAll( newSelector )
848+ );
849+ return results;
850+ } catch ( qsaError ) {
851+ nonnativeSelectorCache( selector, true );
852+ } finally {
853+ if ( nid === expando ) {
854+ context.removeAttribute( "id" );
855+ }
856+ }
857+ }
858+ }
859+ }
860+
861+ // All others
862+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
863+}
864+
865+/**
866+ * Create key-value caches of limited size
867+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
868+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
869+ * deleting the oldest entry
870+ */
871+function createCache() {
872+ var keys = [];
873+
874+ function cache( key, value ) {
875+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
876+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
877+ // Only keep the most recent entries
878+ delete cache[ keys.shift() ];
879+ }
880+ return (cache[ key + " " ] = value);
881+ }
882+ return cache;
883+}
884+
885+/**
886+ * Mark a function for special use by Sizzle
887+ * @param {Function} fn The function to mark
888+ */
889+function markFunction( fn ) {
890+ fn[ expando ] = true;
891+ return fn;
892+}
893+
894+/**
895+ * Support testing using an element
896+ * @param {Function} fn Passed the created element and returns a boolean result
897+ */
898+function assert( fn ) {
899+ var el = document.createElement("fieldset");
900+
901+ try {
902+ return !!fn( el );
903+ } catch (e) {
904+ return false;
905+ } finally {
906+ // Remove from its parent by default
907+ if ( el.parentNode ) {
908+ el.parentNode.removeChild( el );
909+ }
910+ // release memory in IE
911+ el = null;
912+ }
913+}
914+
915+/**
916+ * Adds the same handler for all of the specified attrs
917+ * @param {String} attrs Pipe-separated list of attributes
918+ * @param {Function} handler The method that will be applied
919+ */
920+function addHandle( attrs, handler ) {
921+ var arr = attrs.split("|"),
922+ i = arr.length;
923+
924+ while ( i-- ) {
925+ Expr.attrHandle[ arr[i] ] = handler;
926+ }
927+}
928+
929+/**
930+ * Checks document order of two siblings
931+ * @param {Element} a
932+ * @param {Element} b
933+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
934+ */
935+function siblingCheck( a, b ) {
936+ var cur = b && a,
937+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
938+ a.sourceIndex - b.sourceIndex;
939+
940+ // Use IE sourceIndex if available on both nodes
941+ if ( diff ) {
942+ return diff;
943+ }
944+
945+ // Check if b follows a
946+ if ( cur ) {
947+ while ( (cur = cur.nextSibling) ) {
948+ if ( cur === b ) {
949+ return -1;
950+ }
951+ }
952+ }
953+
954+ return a ? 1 : -1;
955+}
956+
957+/**
958+ * Returns a function to use in pseudos for input types
959+ * @param {String} type
960+ */
961+function createInputPseudo( type ) {
962+ return function( elem ) {
963+ var name = elem.nodeName.toLowerCase();
964+ return name === "input" && elem.type === type;
965+ };
966+}
967+
968+/**
969+ * Returns a function to use in pseudos for buttons
970+ * @param {String} type
971+ */
972+function createButtonPseudo( type ) {
973+ return function( elem ) {
974+ var name = elem.nodeName.toLowerCase();
975+ return (name === "input" || name === "button") && elem.type === type;
976+ };
977+}
978+
979+/**
980+ * Returns a function to use in pseudos for :enabled/:disabled
981+ * @param {Boolean} disabled true for :disabled; false for :enabled
982+ */
983+function createDisabledPseudo( disabled ) {
984+
985+ // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
986+ return function( elem ) {
987+
988+ // Only certain elements can match :enabled or :disabled
989+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
990+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
991+ if ( "form" in elem ) {
992+
993+ // Check for inherited disabledness on relevant non-disabled elements:
994+ // * listed form-associated elements in a disabled fieldset
995+ // https://html.spec.whatwg.org/multipage/forms.html#category-listed
996+ // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
997+ // * option elements in a disabled optgroup
998+ // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
999+ // All such elements have a "form" property.
1000+ if ( elem.parentNode && elem.disabled === false ) {
1001+
1002+ // Option elements defer to a parent optgroup if present
1003+ if ( "label" in elem ) {
1004+ if ( "label" in elem.parentNode ) {
1005+ return elem.parentNode.disabled === disabled;
1006+ } else {
1007+ return elem.disabled === disabled;
1008+ }
1009+ }
1010+
1011+ // Support: IE 6 - 11
1012+ // Use the isDisabled shortcut property to check for disabled fieldset ancestors
1013+ return elem.isDisabled === disabled ||
1014+
1015+ // Where there is no isDisabled, check manually
1016+ /* jshint -W018 */
1017+ elem.isDisabled !== !disabled &&
1018+ inDisabledFieldset( elem ) === disabled;
1019+ }
1020+
1021+ return elem.disabled === disabled;
1022+
1023+ // Try to winnow out elements that can't be disabled before trusting the disabled property.
1024+ // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
1025+ // even exist on them, let alone have a boolean value.
1026+ } else if ( "label" in elem ) {
1027+ return elem.disabled === disabled;
1028+ }
1029+
1030+ // Remaining elements are neither :enabled nor :disabled
1031+ return false;
1032+ };
1033+}
1034+
1035+/**
1036+ * Returns a function to use in pseudos for positionals
1037+ * @param {Function} fn
1038+ */
1039+function createPositionalPseudo( fn ) {
1040+ return markFunction(function( argument ) {
1041+ argument = +argument;
1042+ return markFunction(function( seed, matches ) {
1043+ var j,
1044+ matchIndexes = fn( [], seed.length, argument ),
1045+ i = matchIndexes.length;
1046+
1047+ // Match elements found at the specified indexes
1048+ while ( i-- ) {
1049+ if ( seed[ (j = matchIndexes[i]) ] ) {
1050+ seed[j] = !(matches[j] = seed[j]);
1051+ }
1052+ }
1053+ });
1054+ });
1055+}
1056+
1057+/**
1058+ * Checks a node for validity as a Sizzle context
1059+ * @param {Element|Object=} context
1060+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1061+ */
1062+function testContext( context ) {
1063+ return context && typeof context.getElementsByTagName !== "undefined" && context;
1064+}
1065+
1066+// Expose support vars for convenience
1067+support = Sizzle.support = {};
1068+
1069+/**
1070+ * Detects XML nodes
1071+ * @param {Element|Object} elem An element or a document
1072+ * @returns {Boolean} True iff elem is a non-HTML XML node
1073+ */
1074+isXML = Sizzle.isXML = function( elem ) {
1075+ var namespace = elem.namespaceURI,
1076+ docElem = (elem.ownerDocument || elem).documentElement;
1077+
1078+ // Support: IE <=8
1079+ // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
1080+ // https://bugs.jquery.com/ticket/4833
1081+ return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
1082+};
1083+
1084+/**
1085+ * Sets document-related variables once based on the current document
1086+ * @param {Element|Object} [doc] An element or document object to use to set the document
1087+ * @returns {Object} Returns the current document
1088+ */
1089+setDocument = Sizzle.setDocument = function( node ) {
1090+ var hasCompare, subWindow,
1091+ doc = node ? node.ownerDocument || node : preferredDoc;
1092+
1093+ // Return early if doc is invalid or already selected
1094+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1095+ return document;
1096+ }
1097+
1098+ // Update global variables
1099+ document = doc;
1100+ docElem = document.documentElement;
1101+ documentIsHTML = !isXML( document );
1102+
1103+ // Support: IE 9-11, Edge
1104+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1105+ if ( preferredDoc !== document &&
1106+ (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
1107+
1108+ // Support: IE 11, Edge
1109+ if ( subWindow.addEventListener ) {
1110+ subWindow.addEventListener( "unload", unloadHandler, false );
1111+
1112+ // Support: IE 9 - 10 only
1113+ } else if ( subWindow.attachEvent ) {
1114+ subWindow.attachEvent( "onunload", unloadHandler );
1115+ }
1116+ }
1117+
1118+ /* Attributes
1119+ ---------------------------------------------------------------------- */
1120+
1121+ // Support: IE<8
1122+ // Verify that getAttribute really returns attributes and not properties
1123+ // (excepting IE8 booleans)
1124+ support.attributes = assert(function( el ) {
1125+ el.className = "i";
1126+ return !el.getAttribute("className");
1127+ });
1128+
1129+ /* getElement(s)By*
1130+ ---------------------------------------------------------------------- */
1131+
1132+ // Check if getElementsByTagName("*") returns only elements
1133+ support.getElementsByTagName = assert(function( el ) {
1134+ el.appendChild( document.createComment("") );
1135+ return !el.getElementsByTagName("*").length;
1136+ });
1137+
1138+ // Support: IE<9
1139+ support.getElementsByClassName = rnative.test( document.getElementsByClassName );
1140+
1141+ // Support: IE<10
1142+ // Check if getElementById returns elements by name
1143+ // The broken getElementById methods don't pick up programmatically-set names,
1144+ // so use a roundabout getElementsByName test
1145+ support.getById = assert(function( el ) {
1146+ docElem.appendChild( el ).id = expando;
1147+ return !document.getElementsByName || !document.getElementsByName( expando ).length;
1148+ });
1149+
1150+ // ID filter and find
1151+ if ( support.getById ) {
1152+ Expr.filter["ID"] = function( id ) {
1153+ var attrId = id.replace( runescape, funescape );
1154+ return function( elem ) {
1155+ return elem.getAttribute("id") === attrId;
1156+ };
1157+ };
1158+ Expr.find["ID"] = function( id, context ) {
1159+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1160+ var elem = context.getElementById( id );
1161+ return elem ? [ elem ] : [];
1162+ }
1163+ };
1164+ } else {
1165+ Expr.filter["ID"] = function( id ) {
1166+ var attrId = id.replace( runescape, funescape );
1167+ return function( elem ) {
1168+ var node = typeof elem.getAttributeNode !== "undefined" &&
1169+ elem.getAttributeNode("id");
1170+ return node && node.value === attrId;
1171+ };
1172+ };
1173+
1174+ // Support: IE 6 - 7 only
1175+ // getElementById is not reliable as a find shortcut
1176+ Expr.find["ID"] = function( id, context ) {
1177+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1178+ var node, i, elems,
1179+ elem = context.getElementById( id );
1180+
1181+ if ( elem ) {
1182+
1183+ // Verify the id attribute
1184+ node = elem.getAttributeNode("id");
1185+ if ( node && node.value === id ) {
1186+ return [ elem ];
1187+ }
1188+
1189+ // Fall back on getElementsByName
1190+ elems = context.getElementsByName( id );
1191+ i = 0;
1192+ while ( (elem = elems[i++]) ) {
1193+ node = elem.getAttributeNode("id");
1194+ if ( node && node.value === id ) {
1195+ return [ elem ];
1196+ }
1197+ }
1198+ }
1199+
1200+ return [];
1201+ }
1202+ };
1203+ }
1204+
1205+ // Tag
1206+ Expr.find["TAG"] = support.getElementsByTagName ?
1207+ function( tag, context ) {
1208+ if ( typeof context.getElementsByTagName !== "undefined" ) {
1209+ return context.getElementsByTagName( tag );
1210+
1211+ // DocumentFragment nodes don't have gEBTN
1212+ } else if ( support.qsa ) {
1213+ return context.querySelectorAll( tag );
1214+ }
1215+ } :
1216+
1217+ function( tag, context ) {
1218+ var elem,
1219+ tmp = [],
1220+ i = 0,
1221+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1222+ results = context.getElementsByTagName( tag );
1223+
1224+ // Filter out possible comments
1225+ if ( tag === "*" ) {
1226+ while ( (elem = results[i++]) ) {
1227+ if ( elem.nodeType === 1 ) {
1228+ tmp.push( elem );
1229+ }
1230+ }
1231+
1232+ return tmp;
1233+ }
1234+ return results;
1235+ };
1236+
1237+ // Class
1238+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1239+ if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1240+ return context.getElementsByClassName( className );
1241+ }
1242+ };
1243+
1244+ /* QSA/matchesSelector
1245+ ---------------------------------------------------------------------- */
1246+
1247+ // QSA and matchesSelector support
1248+
1249+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1250+ rbuggyMatches = [];
1251+
1252+ // qSa(:focus) reports false when true (Chrome 21)
1253+ // We allow this because of a bug in IE8/9 that throws an error
1254+ // whenever `document.activeElement` is accessed on an iframe
1255+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
1256+ // See https://bugs.jquery.com/ticket/13378
1257+ rbuggyQSA = [];
1258+
1259+ if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
1260+ // Build QSA regex
1261+ // Regex strategy adopted from Diego Perini
1262+ assert(function( el ) {
1263+ // Select is set to empty string on purpose
1264+ // This is to test IE's treatment of not explicitly
1265+ // setting a boolean content attribute,
1266+ // since its presence should be enough
1267+ // https://bugs.jquery.com/ticket/12359
1268+ docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
1269+ "<select id='" + expando + "-\r\\' msallowcapture=''>" +
1270+ "<option selected=''></option></select>";
1271+
1272+ // Support: IE8, Opera 11-12.16
1273+ // Nothing should be selected when empty strings follow ^= or $= or *=
1274+ // The test attribute must be unknown in Opera but "safe" for WinRT
1275+ // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1276+ if ( el.querySelectorAll("[msallowcapture^='']").length ) {
1277+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1278+ }
1279+
1280+ // Support: IE8
1281+ // Boolean attributes and "value" are not treated correctly
1282+ if ( !el.querySelectorAll("[selected]").length ) {
1283+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1284+ }
1285+
1286+ // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1287+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1288+ rbuggyQSA.push("~=");
1289+ }
1290+
1291+ // Webkit/Opera - :checked should return selected option elements
1292+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1293+ // IE8 throws error here and will not see later tests
1294+ if ( !el.querySelectorAll(":checked").length ) {
1295+ rbuggyQSA.push(":checked");
1296+ }
1297+
1298+ // Support: Safari 8+, iOS 8+
1299+ // https://bugs.webkit.org/show_bug.cgi?id=136851
1300+ // In-page `selector#id sibling-combinator selector` fails
1301+ if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1302+ rbuggyQSA.push(".#.+[+~]");
1303+ }
1304+ });
1305+
1306+ assert(function( el ) {
1307+ el.innerHTML = "<a href='' disabled='disabled'></a>" +
1308+ "<select disabled='disabled'><option/></select>";
1309+
1310+ // Support: Windows 8 Native Apps
1311+ // The type and name attributes are restricted during .innerHTML assignment
1312+ var input = document.createElement("input");
1313+ input.setAttribute( "type", "hidden" );
1314+ el.appendChild( input ).setAttribute( "name", "D" );
1315+
1316+ // Support: IE8
1317+ // Enforce case-sensitivity of name attribute
1318+ if ( el.querySelectorAll("[name=d]").length ) {
1319+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1320+ }
1321+
1322+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1323+ // IE8 throws error here and will not see later tests
1324+ if ( el.querySelectorAll(":enabled").length !== 2 ) {
1325+ rbuggyQSA.push( ":enabled", ":disabled" );
1326+ }
1327+
1328+ // Support: IE9-11+
1329+ // IE's :disabled selector does not pick up the children of disabled fieldsets
1330+ docElem.appendChild( el ).disabled = true;
1331+ if ( el.querySelectorAll(":disabled").length !== 2 ) {
1332+ rbuggyQSA.push( ":enabled", ":disabled" );
1333+ }
1334+
1335+ // Opera 10-11 does not throw on post-comma invalid pseudos
1336+ el.querySelectorAll("*,:x");
1337+ rbuggyQSA.push(",.*:");
1338+ });
1339+ }
1340+
1341+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
1342+ docElem.webkitMatchesSelector ||
1343+ docElem.mozMatchesSelector ||
1344+ docElem.oMatchesSelector ||
1345+ docElem.msMatchesSelector) )) ) {
1346+
1347+ assert(function( el ) {
1348+ // Check to see if it's possible to do matchesSelector
1349+ // on a disconnected node (IE 9)
1350+ support.disconnectedMatch = matches.call( el, "*" );
1351+
1352+ // This should fail with an exception
1353+ // Gecko does not error, returns false instead
1354+ matches.call( el, "[s!='']:x" );
1355+ rbuggyMatches.push( "!=", pseudos );
1356+ });
1357+ }
1358+
1359+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1360+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1361+
1362+ /* Contains
1363+ ---------------------------------------------------------------------- */
1364+ hasCompare = rnative.test( docElem.compareDocumentPosition );
1365+
1366+ // Element contains another
1367+ // Purposefully self-exclusive
1368+ // As in, an element does not contain itself
1369+ contains = hasCompare || rnative.test( docElem.contains ) ?
1370+ function( a, b ) {
1371+ var adown = a.nodeType === 9 ? a.documentElement : a,
1372+ bup = b && b.parentNode;
1373+ return a === bup || !!( bup && bup.nodeType === 1 && (
1374+ adown.contains ?
1375+ adown.contains( bup ) :
1376+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1377+ ));
1378+ } :
1379+ function( a, b ) {
1380+ if ( b ) {
1381+ while ( (b = b.parentNode) ) {
1382+ if ( b === a ) {
1383+ return true;
1384+ }
1385+ }
1386+ }
1387+ return false;
1388+ };
1389+
1390+ /* Sorting
1391+ ---------------------------------------------------------------------- */
1392+
1393+ // Document order sorting
1394+ sortOrder = hasCompare ?
1395+ function( a, b ) {
1396+
1397+ // Flag for duplicate removal
1398+ if ( a === b ) {
1399+ hasDuplicate = true;
1400+ return 0;
1401+ }
1402+
1403+ // Sort on method existence if only one input has compareDocumentPosition
1404+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1405+ if ( compare ) {
1406+ return compare;
1407+ }
1408+
1409+ // Calculate position if both inputs belong to the same document
1410+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1411+ a.compareDocumentPosition( b ) :
1412+
1413+ // Otherwise we know they are disconnected
1414+ 1;
1415+
1416+ // Disconnected nodes
1417+ if ( compare & 1 ||
1418+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1419+
1420+ // Choose the first element that is related to our preferred document
1421+ if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1422+ return -1;
1423+ }
1424+ if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1425+ return 1;
1426+ }
1427+
1428+ // Maintain original order
1429+ return sortInput ?
1430+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1431+ 0;
1432+ }
1433+
1434+ return compare & 4 ? -1 : 1;
1435+ } :
1436+ function( a, b ) {
1437+ // Exit early if the nodes are identical
1438+ if ( a === b ) {
1439+ hasDuplicate = true;
1440+ return 0;
1441+ }
1442+
1443+ var cur,
1444+ i = 0,
1445+ aup = a.parentNode,
1446+ bup = b.parentNode,
1447+ ap = [ a ],
1448+ bp = [ b ];
1449+
1450+ // Parentless nodes are either documents or disconnected
1451+ if ( !aup || !bup ) {
1452+ return a === document ? -1 :
1453+ b === document ? 1 :
1454+ aup ? -1 :
1455+ bup ? 1 :
1456+ sortInput ?
1457+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1458+ 0;
1459+
1460+ // If the nodes are siblings, we can do a quick check
1461+ } else if ( aup === bup ) {
1462+ return siblingCheck( a, b );
1463+ }
1464+
1465+ // Otherwise we need full lists of their ancestors for comparison
1466+ cur = a;
1467+ while ( (cur = cur.parentNode) ) {
1468+ ap.unshift( cur );
1469+ }
1470+ cur = b;
1471+ while ( (cur = cur.parentNode) ) {
1472+ bp.unshift( cur );
1473+ }
1474+
1475+ // Walk down the tree looking for a discrepancy
1476+ while ( ap[i] === bp[i] ) {
1477+ i++;
1478+ }
1479+
1480+ return i ?
1481+ // Do a sibling check if the nodes have a common ancestor
1482+ siblingCheck( ap[i], bp[i] ) :
1483+
1484+ // Otherwise nodes in our document sort first
1485+ ap[i] === preferredDoc ? -1 :
1486+ bp[i] === preferredDoc ? 1 :
1487+ 0;
1488+ };
1489+
1490+ return document;
1491+};
1492+
1493+Sizzle.matches = function( expr, elements ) {
1494+ return Sizzle( expr, null, null, elements );
1495+};
1496+
1497+Sizzle.matchesSelector = function( elem, expr ) {
1498+ // Set document vars if needed
1499+ if ( ( elem.ownerDocument || elem ) !== document ) {
1500+ setDocument( elem );
1501+ }
1502+
1503+ if ( support.matchesSelector && documentIsHTML &&
1504+ !nonnativeSelectorCache[ expr + " " ] &&
1505+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1506+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1507+
1508+ try {
1509+ var ret = matches.call( elem, expr );
1510+
1511+ // IE 9's matchesSelector returns false on disconnected nodes
1512+ if ( ret || support.disconnectedMatch ||
1513+ // As well, disconnected nodes are said to be in a document
1514+ // fragment in IE 9
1515+ elem.document && elem.document.nodeType !== 11 ) {
1516+ return ret;
1517+ }
1518+ } catch (e) {
1519+ nonnativeSelectorCache( expr, true );
1520+ }
1521+ }
1522+
1523+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
1524+};
1525+
1526+Sizzle.contains = function( context, elem ) {
1527+ // Set document vars if needed
1528+ if ( ( context.ownerDocument || context ) !== document ) {
1529+ setDocument( context );
1530+ }
1531+ return contains( context, elem );
1532+};
1533+
1534+Sizzle.attr = function( elem, name ) {
1535+ // Set document vars if needed
1536+ if ( ( elem.ownerDocument || elem ) !== document ) {
1537+ setDocument( elem );
1538+ }
1539+
1540+ var fn = Expr.attrHandle[ name.toLowerCase() ],
1541+ // Don't get fooled by Object.prototype properties (jQuery #13807)
1542+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1543+ fn( elem, name, !documentIsHTML ) :
1544+ undefined;
1545+
1546+ return val !== undefined ?
1547+ val :
1548+ support.attributes || !documentIsHTML ?
1549+ elem.getAttribute( name ) :
1550+ (val = elem.getAttributeNode(name)) && val.specified ?
1551+ val.value :
1552+ null;
1553+};
1554+
1555+Sizzle.escape = function( sel ) {
1556+ return (sel + "").replace( rcssescape, fcssescape );
1557+};
1558+
1559+Sizzle.error = function( msg ) {
1560+ throw new Error( "Syntax error, unrecognized expression: " + msg );
1561+};
1562+
1563+/**
1564+ * Document sorting and removing duplicates
1565+ * @param {ArrayLike} results
1566+ */
1567+Sizzle.uniqueSort = function( results ) {
1568+ var elem,
1569+ duplicates = [],
1570+ j = 0,
1571+ i = 0;
1572+
1573+ // Unless we *know* we can detect duplicates, assume their presence
1574+ hasDuplicate = !support.detectDuplicates;
1575+ sortInput = !support.sortStable && results.slice( 0 );
1576+ results.sort( sortOrder );
1577+
1578+ if ( hasDuplicate ) {
1579+ while ( (elem = results[i++]) ) {
1580+ if ( elem === results[ i ] ) {
1581+ j = duplicates.push( i );
1582+ }
1583+ }
1584+ while ( j-- ) {
1585+ results.splice( duplicates[ j ], 1 );
1586+ }
1587+ }
1588+
1589+ // Clear input after sorting to release objects
1590+ // See https://github.com/jquery/sizzle/pull/225
1591+ sortInput = null;
1592+
1593+ return results;
1594+};
1595+
1596+/**
1597+ * Utility function for retrieving the text value of an array of DOM nodes
1598+ * @param {Array|Element} elem
1599+ */
1600+getText = Sizzle.getText = function( elem ) {
1601+ var node,
1602+ ret = "",
1603+ i = 0,
1604+ nodeType = elem.nodeType;
1605+
1606+ if ( !nodeType ) {
1607+ // If no nodeType, this is expected to be an array
1608+ while ( (node = elem[i++]) ) {
1609+ // Do not traverse comment nodes
1610+ ret += getText( node );
1611+ }
1612+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1613+ // Use textContent for elements
1614+ // innerText usage removed for consistency of new lines (jQuery #11153)
1615+ if ( typeof elem.textContent === "string" ) {
1616+ return elem.textContent;
1617+ } else {
1618+ // Traverse its children
1619+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1620+ ret += getText( elem );
1621+ }
1622+ }
1623+ } else if ( nodeType === 3 || nodeType === 4 ) {
1624+ return elem.nodeValue;
1625+ }
1626+ // Do not include comment or processing instruction nodes
1627+
1628+ return ret;
1629+};
1630+
1631+Expr = Sizzle.selectors = {
1632+
1633+ // Can be adjusted by the user
1634+ cacheLength: 50,
1635+
1636+ createPseudo: markFunction,
1637+
1638+ match: matchExpr,
1639+
1640+ attrHandle: {},
1641+
1642+ find: {},
1643+
1644+ relative: {
1645+ ">": { dir: "parentNode", first: true },
1646+ " ": { dir: "parentNode" },
1647+ "+": { dir: "previousSibling", first: true },
1648+ "~": { dir: "previousSibling" }
1649+ },
1650+
1651+ preFilter: {
1652+ "ATTR": function( match ) {
1653+ match[1] = match[1].replace( runescape, funescape );
1654+
1655+ // Move the given value to match[3] whether quoted or unquoted
1656+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1657+
1658+ if ( match[2] === "~=" ) {
1659+ match[3] = " " + match[3] + " ";
1660+ }
1661+
1662+ return match.slice( 0, 4 );
1663+ },
1664+
1665+ "CHILD": function( match ) {
1666+ /* matches from matchExpr["CHILD"]
1667+ 1 type (only|nth|...)
1668+ 2 what (child|of-type)
1669+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1670+ 4 xn-component of xn+y argument ([+-]?\d*n|)
1671+ 5 sign of xn-component
1672+ 6 x of xn-component
1673+ 7 sign of y-component
1674+ 8 y of y-component
1675+ */
1676+ match[1] = match[1].toLowerCase();
1677+
1678+ if ( match[1].slice( 0, 3 ) === "nth" ) {
1679+ // nth-* requires argument
1680+ if ( !match[3] ) {
1681+ Sizzle.error( match[0] );
1682+ }
1683+
1684+ // numeric x and y parameters for Expr.filter.CHILD
1685+ // remember that false/true cast respectively to 0/1
1686+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1687+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1688+
1689+ // other types prohibit arguments
1690+ } else if ( match[3] ) {
1691+ Sizzle.error( match[0] );
1692+ }
1693+
1694+ return match;
1695+ },
1696+
1697+ "PSEUDO": function( match ) {
1698+ var excess,
1699+ unquoted = !match[6] && match[2];
1700+
1701+ if ( matchExpr["CHILD"].test( match[0] ) ) {
1702+ return null;
1703+ }
1704+
1705+ // Accept quoted arguments as-is
1706+ if ( match[3] ) {
1707+ match[2] = match[4] || match[5] || "";
1708+
1709+ // Strip excess characters from unquoted arguments
1710+ } else if ( unquoted && rpseudo.test( unquoted ) &&
1711+ // Get excess from tokenize (recursively)
1712+ (excess = tokenize( unquoted, true )) &&
1713+ // advance to the next closing parenthesis
1714+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1715+
1716+ // excess is a negative index
1717+ match[0] = match[0].slice( 0, excess );
1718+ match[2] = unquoted.slice( 0, excess );
1719+ }
1720+
1721+ // Return only captures needed by the pseudo filter method (type and argument)
1722+ return match.slice( 0, 3 );
1723+ }
1724+ },
1725+
1726+ filter: {
1727+
1728+ "TAG": function( nodeNameSelector ) {
1729+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1730+ return nodeNameSelector === "*" ?
1731+ function() { return true; } :
1732+ function( elem ) {
1733+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1734+ };
1735+ },
1736+
1737+ "CLASS": function( className ) {
1738+ var pattern = classCache[ className + " " ];
1739+
1740+ return pattern ||
1741+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
1742+ classCache( className, function( elem ) {
1743+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
1744+ });
1745+ },
1746+
1747+ "ATTR": function( name, operator, check ) {
1748+ return function( elem ) {
1749+ var result = Sizzle.attr( elem, name );
1750+
1751+ if ( result == null ) {
1752+ return operator === "!=";
1753+ }
1754+ if ( !operator ) {
1755+ return true;
1756+ }
1757+
1758+ result += "";
1759+
1760+ return operator === "=" ? result === check :
1761+ operator === "!=" ? result !== check :
1762+ operator === "^=" ? check && result.indexOf( check ) === 0 :
1763+ operator === "*=" ? check && result.indexOf( check ) > -1 :
1764+ operator === "$=" ? check && result.slice( -check.length ) === check :
1765+ operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1766+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1767+ false;
1768+ };
1769+ },
1770+
1771+ "CHILD": function( type, what, argument, first, last ) {
1772+ var simple = type.slice( 0, 3 ) !== "nth",
1773+ forward = type.slice( -4 ) !== "last",
1774+ ofType = what === "of-type";
1775+
1776+ return first === 1 && last === 0 ?
1777+
1778+ // Shortcut for :nth-*(n)
1779+ function( elem ) {
1780+ return !!elem.parentNode;
1781+ } :
1782+
1783+ function( elem, context, xml ) {
1784+ var cache, uniqueCache, outerCache, node, nodeIndex, start,
1785+ dir = simple !== forward ? "nextSibling" : "previousSibling",
1786+ parent = elem.parentNode,
1787+ name = ofType && elem.nodeName.toLowerCase(),
1788+ useCache = !xml && !ofType,
1789+ diff = false;
1790+
1791+ if ( parent ) {
1792+
1793+ // :(first|last|only)-(child|of-type)
1794+ if ( simple ) {
1795+ while ( dir ) {
1796+ node = elem;
1797+ while ( (node = node[ dir ]) ) {
1798+ if ( ofType ?
1799+ node.nodeName.toLowerCase() === name :
1800+ node.nodeType === 1 ) {
1801+
1802+ return false;
1803+ }
1804+ }
1805+ // Reverse direction for :only-* (if we haven't yet done so)
1806+ start = dir = type === "only" && !start && "nextSibling";
1807+ }
1808+ return true;
1809+ }
1810+
1811+ start = [ forward ? parent.firstChild : parent.lastChild ];
1812+
1813+ // non-xml :nth-child(...) stores cache data on `parent`
1814+ if ( forward && useCache ) {
1815+
1816+ // Seek `elem` from a previously-cached index
1817+
1818+ // ...in a gzip-friendly way
1819+ node = parent;
1820+ outerCache = node[ expando ] || (node[ expando ] = {});
1821+
1822+ // Support: IE <9 only
1823+ // Defend against cloned attroperties (jQuery gh-1709)
1824+ uniqueCache = outerCache[ node.uniqueID ] ||
1825+ (outerCache[ node.uniqueID ] = {});
1826+
1827+ cache = uniqueCache[ type ] || [];
1828+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1829+ diff = nodeIndex && cache[ 2 ];
1830+ node = nodeIndex && parent.childNodes[ nodeIndex ];
1831+
1832+ while ( (node = ++nodeIndex && node && node[ dir ] ||
1833+
1834+ // Fallback to seeking `elem` from the start
1835+ (diff = nodeIndex = 0) || start.pop()) ) {
1836+
1837+ // When found, cache indexes on `parent` and break
1838+ if ( node.nodeType === 1 && ++diff && node === elem ) {
1839+ uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
1840+ break;
1841+ }
1842+ }
1843+
1844+ } else {
1845+ // Use previously-cached element index if available
1846+ if ( useCache ) {
1847+ // ...in a gzip-friendly way
1848+ node = elem;
1849+ outerCache = node[ expando ] || (node[ expando ] = {});
1850+
1851+ // Support: IE <9 only
1852+ // Defend against cloned attroperties (jQuery gh-1709)
1853+ uniqueCache = outerCache[ node.uniqueID ] ||
1854+ (outerCache[ node.uniqueID ] = {});
1855+
1856+ cache = uniqueCache[ type ] || [];
1857+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1858+ diff = nodeIndex;
1859+ }
1860+
1861+ // xml :nth-child(...)
1862+ // or :nth-last-child(...) or :nth(-last)?-of-type(...)
1863+ if ( diff === false ) {
1864+ // Use the same loop as above to seek `elem` from the start
1865+ while ( (node = ++nodeIndex && node && node[ dir ] ||
1866+ (diff = nodeIndex = 0) || start.pop()) ) {
1867+
1868+ if ( ( ofType ?
1869+ node.nodeName.toLowerCase() === name :
1870+ node.nodeType === 1 ) &&
1871+ ++diff ) {
1872+
1873+ // Cache the index of each encountered element
1874+ if ( useCache ) {
1875+ outerCache = node[ expando ] || (node[ expando ] = {});
1876+
1877+ // Support: IE <9 only
1878+ // Defend against cloned attroperties (jQuery gh-1709)
1879+ uniqueCache = outerCache[ node.uniqueID ] ||
1880+ (outerCache[ node.uniqueID ] = {});
1881+
1882+ uniqueCache[ type ] = [ dirruns, diff ];
1883+ }
1884+
1885+ if ( node === elem ) {
1886+ break;
1887+ }
1888+ }
1889+ }
1890+ }
1891+ }
1892+
1893+ // Incorporate the offset, then check against cycle size
1894+ diff -= last;
1895+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
1896+ }
1897+ };
1898+ },
1899+
1900+ "PSEUDO": function( pseudo, argument ) {
1901+ // pseudo-class names are case-insensitive
1902+ // http://www.w3.org/TR/selectors/#pseudo-classes
1903+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
1904+ // Remember that setFilters inherits from pseudos
1905+ var args,
1906+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
1907+ Sizzle.error( "unsupported pseudo: " + pseudo );
1908+
1909+ // The user may use createPseudo to indicate that
1910+ // arguments are needed to create the filter function
1911+ // just as Sizzle does
1912+ if ( fn[ expando ] ) {
1913+ return fn( argument );
1914+ }
1915+
1916+ // But maintain support for old signatures
1917+ if ( fn.length > 1 ) {
1918+ args = [ pseudo, pseudo, "", argument ];
1919+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
1920+ markFunction(function( seed, matches ) {
1921+ var idx,
1922+ matched = fn( seed, argument ),
1923+ i = matched.length;
1924+ while ( i-- ) {
1925+ idx = indexOf( seed, matched[i] );
1926+ seed[ idx ] = !( matches[ idx ] = matched[i] );
1927+ }
1928+ }) :
1929+ function( elem ) {
1930+ return fn( elem, 0, args );
1931+ };
1932+ }
1933+
1934+ return fn;
1935+ }
1936+ },
1937+
1938+ pseudos: {
1939+ // Potentially complex pseudos
1940+ "not": markFunction(function( selector ) {
1941+ // Trim the selector passed to compile
1942+ // to avoid treating leading and trailing
1943+ // spaces as combinators
1944+ var input = [],
1945+ results = [],
1946+ matcher = compile( selector.replace( rtrim, "$1" ) );
1947+
1948+ return matcher[ expando ] ?
1949+ markFunction(function( seed, matches, context, xml ) {
1950+ var elem,
1951+ unmatched = matcher( seed, null, xml, [] ),
1952+ i = seed.length;
1953+
1954+ // Match elements unmatched by `matcher`
1955+ while ( i-- ) {
1956+ if ( (elem = unmatched[i]) ) {
1957+ seed[i] = !(matches[i] = elem);
1958+ }
1959+ }
1960+ }) :
1961+ function( elem, context, xml ) {
1962+ input[0] = elem;
1963+ matcher( input, null, xml, results );
1964+ // Don't keep the element (issue #299)
1965+ input[0] = null;
1966+ return !results.pop();
1967+ };
1968+ }),
1969+
1970+ "has": markFunction(function( selector ) {
1971+ return function( elem ) {
1972+ return Sizzle( selector, elem ).length > 0;
1973+ };
1974+ }),
1975+
1976+ "contains": markFunction(function( text ) {
1977+ text = text.replace( runescape, funescape );
1978+ return function( elem ) {
1979+ return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
1980+ };
1981+ }),
1982+
1983+ // "Whether an element is represented by a :lang() selector
1984+ // is based solely on the element's language value
1985+ // being equal to the identifier C,
1986+ // or beginning with the identifier C immediately followed by "-".
1987+ // The matching of C against the element's language value is performed case-insensitively.
1988+ // The identifier C does not have to be a valid language name."
1989+ // http://www.w3.org/TR/selectors/#lang-pseudo
1990+ "lang": markFunction( function( lang ) {
1991+ // lang value must be a valid identifier
1992+ if ( !ridentifier.test(lang || "") ) {
1993+ Sizzle.error( "unsupported lang: " + lang );
1994+ }
1995+ lang = lang.replace( runescape, funescape ).toLowerCase();
1996+ return function( elem ) {
1997+ var elemLang;
1998+ do {
1999+ if ( (elemLang = documentIsHTML ?
2000+ elem.lang :
2001+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
2002+
2003+ elemLang = elemLang.toLowerCase();
2004+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
2005+ }
2006+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
2007+ return false;
2008+ };
2009+ }),
2010+
2011+ // Miscellaneous
2012+ "target": function( elem ) {
2013+ var hash = window.location && window.location.hash;
2014+ return hash && hash.slice( 1 ) === elem.id;
2015+ },
2016+
2017+ "root": function( elem ) {
2018+ return elem === docElem;
2019+ },
2020+
2021+ "focus": function( elem ) {
2022+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
2023+ },
2024+
2025+ // Boolean properties
2026+ "enabled": createDisabledPseudo( false ),
2027+ "disabled": createDisabledPseudo( true ),
2028+
2029+ "checked": function( elem ) {
2030+ // In CSS3, :checked should return both checked and selected elements
2031+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
2032+ var nodeName = elem.nodeName.toLowerCase();
2033+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
2034+ },
2035+
2036+ "selected": function( elem ) {
2037+ // Accessing this property makes selected-by-default
2038+ // options in Safari work properly
2039+ if ( elem.parentNode ) {
2040+ elem.parentNode.selectedIndex;
2041+ }
2042+
2043+ return elem.selected === true;
2044+ },
2045+
2046+ // Contents
2047+ "empty": function( elem ) {
2048+ // http://www.w3.org/TR/selectors/#empty-pseudo
2049+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
2050+ // but not by others (comment: 8; processing instruction: 7; etc.)
2051+ // nodeType < 6 works because attributes (2) do not appear as children
2052+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
2053+ if ( elem.nodeType < 6 ) {
2054+ return false;
2055+ }
2056+ }
2057+ return true;
2058+ },
2059+
2060+ "parent": function( elem ) {
2061+ return !Expr.pseudos["empty"]( elem );
2062+ },
2063+
2064+ // Element/input types
2065+ "header": function( elem ) {
2066+ return rheader.test( elem.nodeName );
2067+ },
2068+
2069+ "input": function( elem ) {
2070+ return rinputs.test( elem.nodeName );
2071+ },
2072+
2073+ "button": function( elem ) {
2074+ var name = elem.nodeName.toLowerCase();
2075+ return name === "input" && elem.type === "button" || name === "button";
2076+ },
2077+
2078+ "text": function( elem ) {
2079+ var attr;
2080+ return elem.nodeName.toLowerCase() === "input" &&
2081+ elem.type === "text" &&
2082+
2083+ // Support: IE<8
2084+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2085+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
2086+ },
2087+
2088+ // Position-in-collection
2089+ "first": createPositionalPseudo(function() {
2090+ return [ 0 ];
2091+ }),
2092+
2093+ "last": createPositionalPseudo(function( matchIndexes, length ) {
2094+ return [ length - 1 ];
2095+ }),
2096+
2097+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
2098+ return [ argument < 0 ? argument + length : argument ];
2099+ }),
2100+
2101+ "even": createPositionalPseudo(function( matchIndexes, length ) {
2102+ var i = 0;
2103+ for ( ; i < length; i += 2 ) {
2104+ matchIndexes.push( i );
2105+ }
2106+ return matchIndexes;
2107+ }),
2108+
2109+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
2110+ var i = 1;
2111+ for ( ; i < length; i += 2 ) {
2112+ matchIndexes.push( i );
2113+ }
2114+ return matchIndexes;
2115+ }),
2116+
2117+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2118+ var i = argument < 0 ?
2119+ argument + length :
2120+ argument > length ?
2121+ length :
2122+ argument;
2123+ for ( ; --i >= 0; ) {
2124+ matchIndexes.push( i );
2125+ }
2126+ return matchIndexes;
2127+ }),
2128+
2129+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2130+ var i = argument < 0 ? argument + length : argument;
2131+ for ( ; ++i < length; ) {
2132+ matchIndexes.push( i );
2133+ }
2134+ return matchIndexes;
2135+ })
2136+ }
2137+};
2138+
2139+Expr.pseudos["nth"] = Expr.pseudos["eq"];
2140+
2141+// Add button/input type pseudos
2142+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2143+ Expr.pseudos[ i ] = createInputPseudo( i );
2144+}
2145+for ( i in { submit: true, reset: true } ) {
2146+ Expr.pseudos[ i ] = createButtonPseudo( i );
2147+}
2148+
2149+// Easy API for creating new setFilters
2150+function setFilters() {}
2151+setFilters.prototype = Expr.filters = Expr.pseudos;
2152+Expr.setFilters = new setFilters();
2153+
2154+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2155+ var matched, match, tokens, type,
2156+ soFar, groups, preFilters,
2157+ cached = tokenCache[ selector + " " ];
2158+
2159+ if ( cached ) {
2160+ return parseOnly ? 0 : cached.slice( 0 );
2161+ }
2162+
2163+ soFar = selector;
2164+ groups = [];
2165+ preFilters = Expr.preFilter;
2166+
2167+ while ( soFar ) {
2168+
2169+ // Comma and first run
2170+ if ( !matched || (match = rcomma.exec( soFar )) ) {
2171+ if ( match ) {
2172+ // Don't consume trailing commas as valid
2173+ soFar = soFar.slice( match[0].length ) || soFar;
2174+ }
2175+ groups.push( (tokens = []) );
2176+ }
2177+
2178+ matched = false;
2179+
2180+ // Combinators
2181+ if ( (match = rcombinators.exec( soFar )) ) {
2182+ matched = match.shift();
2183+ tokens.push({
2184+ value: matched,
2185+ // Cast descendant combinators to space
2186+ type: match[0].replace( rtrim, " " )
2187+ });
2188+ soFar = soFar.slice( matched.length );
2189+ }
2190+
2191+ // Filters
2192+ for ( type in Expr.filter ) {
2193+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2194+ (match = preFilters[ type ]( match ))) ) {
2195+ matched = match.shift();
2196+ tokens.push({
2197+ value: matched,
2198+ type: type,
2199+ matches: match
2200+ });
2201+ soFar = soFar.slice( matched.length );
2202+ }
2203+ }
2204+
2205+ if ( !matched ) {
2206+ break;
2207+ }
2208+ }
2209+
2210+ // Return the length of the invalid excess
2211+ // if we're just parsing
2212+ // Otherwise, throw an error or return tokens
2213+ return parseOnly ?
2214+ soFar.length :
2215+ soFar ?
2216+ Sizzle.error( selector ) :
2217+ // Cache the tokens
2218+ tokenCache( selector, groups ).slice( 0 );
2219+};
2220+
2221+function toSelector( tokens ) {
2222+ var i = 0,
2223+ len = tokens.length,
2224+ selector = "";
2225+ for ( ; i < len; i++ ) {
2226+ selector += tokens[i].value;
2227+ }
2228+ return selector;
2229+}
2230+
2231+function addCombinator( matcher, combinator, base ) {
2232+ var dir = combinator.dir,
2233+ skip = combinator.next,
2234+ key = skip || dir,
2235+ checkNonElements = base && key === "parentNode",
2236+ doneName = done++;
2237+
2238+ return combinator.first ?
2239+ // Check against closest ancestor/preceding element
2240+ function( elem, context, xml ) {
2241+ while ( (elem = elem[ dir ]) ) {
2242+ if ( elem.nodeType === 1 || checkNonElements ) {
2243+ return matcher( elem, context, xml );
2244+ }
2245+ }
2246+ return false;
2247+ } :
2248+
2249+ // Check against all ancestor/preceding elements
2250+ function( elem, context, xml ) {
2251+ var oldCache, uniqueCache, outerCache,
2252+ newCache = [ dirruns, doneName ];
2253+
2254+ // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2255+ if ( xml ) {
2256+ while ( (elem = elem[ dir ]) ) {
2257+ if ( elem.nodeType === 1 || checkNonElements ) {
2258+ if ( matcher( elem, context, xml ) ) {
2259+ return true;
2260+ }
2261+ }
2262+ }
2263+ } else {
2264+ while ( (elem = elem[ dir ]) ) {
2265+ if ( elem.nodeType === 1 || checkNonElements ) {
2266+ outerCache = elem[ expando ] || (elem[ expando ] = {});
2267+
2268+ // Support: IE <9 only
2269+ // Defend against cloned attroperties (jQuery gh-1709)
2270+ uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
2271+
2272+ if ( skip && skip === elem.nodeName.toLowerCase() ) {
2273+ elem = elem[ dir ] || elem;
2274+ } else if ( (oldCache = uniqueCache[ key ]) &&
2275+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2276+
2277+ // Assign to newCache so results back-propagate to previous elements
2278+ return (newCache[ 2 ] = oldCache[ 2 ]);
2279+ } else {
2280+ // Reuse newcache so results back-propagate to previous elements
2281+ uniqueCache[ key ] = newCache;
2282+
2283+ // A match means we're done; a fail means we have to keep checking
2284+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
2285+ return true;
2286+ }
2287+ }
2288+ }
2289+ }
2290+ }
2291+ return false;
2292+ };
2293+}
2294+
2295+function elementMatcher( matchers ) {
2296+ return matchers.length > 1 ?
2297+ function( elem, context, xml ) {
2298+ var i = matchers.length;
2299+ while ( i-- ) {
2300+ if ( !matchers[i]( elem, context, xml ) ) {
2301+ return false;
2302+ }
2303+ }
2304+ return true;
2305+ } :
2306+ matchers[0];
2307+}
2308+
2309+function multipleContexts( selector, contexts, results ) {
2310+ var i = 0,
2311+ len = contexts.length;
2312+ for ( ; i < len; i++ ) {
2313+ Sizzle( selector, contexts[i], results );
2314+ }
2315+ return results;
2316+}
2317+
2318+function condense( unmatched, map, filter, context, xml ) {
2319+ var elem,
2320+ newUnmatched = [],
2321+ i = 0,
2322+ len = unmatched.length,
2323+ mapped = map != null;
2324+
2325+ for ( ; i < len; i++ ) {
2326+ if ( (elem = unmatched[i]) ) {
2327+ if ( !filter || filter( elem, context, xml ) ) {
2328+ newUnmatched.push( elem );
2329+ if ( mapped ) {
2330+ map.push( i );
2331+ }
2332+ }
2333+ }
2334+ }
2335+
2336+ return newUnmatched;
2337+}
2338+
2339+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2340+ if ( postFilter && !postFilter[ expando ] ) {
2341+ postFilter = setMatcher( postFilter );
2342+ }
2343+ if ( postFinder && !postFinder[ expando ] ) {
2344+ postFinder = setMatcher( postFinder, postSelector );
2345+ }
2346+ return markFunction(function( seed, results, context, xml ) {
2347+ var temp, i, elem,
2348+ preMap = [],
2349+ postMap = [],
2350+ preexisting = results.length,
2351+
2352+ // Get initial elements from seed or context
2353+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2354+
2355+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
2356+ matcherIn = preFilter && ( seed || !selector ) ?
2357+ condense( elems, preMap, preFilter, context, xml ) :
2358+ elems,
2359+
2360+ matcherOut = matcher ?
2361+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2362+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2363+
2364+ // ...intermediate processing is necessary
2365+ [] :
2366+
2367+ // ...otherwise use results directly
2368+ results :
2369+ matcherIn;
2370+
2371+ // Find primary matches
2372+ if ( matcher ) {
2373+ matcher( matcherIn, matcherOut, context, xml );
2374+ }
2375+
2376+ // Apply postFilter
2377+ if ( postFilter ) {
2378+ temp = condense( matcherOut, postMap );
2379+ postFilter( temp, [], context, xml );
2380+
2381+ // Un-match failing elements by moving them back to matcherIn
2382+ i = temp.length;
2383+ while ( i-- ) {
2384+ if ( (elem = temp[i]) ) {
2385+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2386+ }
2387+ }
2388+ }
2389+
2390+ if ( seed ) {
2391+ if ( postFinder || preFilter ) {
2392+ if ( postFinder ) {
2393+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
2394+ temp = [];
2395+ i = matcherOut.length;
2396+ while ( i-- ) {
2397+ if ( (elem = matcherOut[i]) ) {
2398+ // Restore matcherIn since elem is not yet a final match
2399+ temp.push( (matcherIn[i] = elem) );
2400+ }
2401+ }
2402+ postFinder( null, (matcherOut = []), temp, xml );
2403+ }
2404+
2405+ // Move matched elements from seed to results to keep them synchronized
2406+ i = matcherOut.length;
2407+ while ( i-- ) {
2408+ if ( (elem = matcherOut[i]) &&
2409+ (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
2410+
2411+ seed[temp] = !(results[temp] = elem);
2412+ }
2413+ }
2414+ }
2415+
2416+ // Add elements to results, through postFinder if defined
2417+ } else {
2418+ matcherOut = condense(
2419+ matcherOut === results ?
2420+ matcherOut.splice( preexisting, matcherOut.length ) :
2421+ matcherOut
2422+ );
2423+ if ( postFinder ) {
2424+ postFinder( null, results, matcherOut, xml );
2425+ } else {
2426+ push.apply( results, matcherOut );
2427+ }
2428+ }
2429+ });
2430+}
2431+
2432+function matcherFromTokens( tokens ) {
2433+ var checkContext, matcher, j,
2434+ len = tokens.length,
2435+ leadingRelative = Expr.relative[ tokens[0].type ],
2436+ implicitRelative = leadingRelative || Expr.relative[" "],
2437+ i = leadingRelative ? 1 : 0,
2438+
2439+ // The foundational matcher ensures that elements are reachable from top-level context(s)
2440+ matchContext = addCombinator( function( elem ) {
2441+ return elem === checkContext;
2442+ }, implicitRelative, true ),
2443+ matchAnyContext = addCombinator( function( elem ) {
2444+ return indexOf( checkContext, elem ) > -1;
2445+ }, implicitRelative, true ),
2446+ matchers = [ function( elem, context, xml ) {
2447+ var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2448+ (checkContext = context).nodeType ?
2449+ matchContext( elem, context, xml ) :
2450+ matchAnyContext( elem, context, xml ) );
2451+ // Avoid hanging onto element (issue #299)
2452+ checkContext = null;
2453+ return ret;
2454+ } ];
2455+
2456+ for ( ; i < len; i++ ) {
2457+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2458+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2459+ } else {
2460+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2461+
2462+ // Return special upon seeing a positional matcher
2463+ if ( matcher[ expando ] ) {
2464+ // Find the next relative operator (if any) for proper handling
2465+ j = ++i;
2466+ for ( ; j < len; j++ ) {
2467+ if ( Expr.relative[ tokens[j].type ] ) {
2468+ break;
2469+ }
2470+ }
2471+ return setMatcher(
2472+ i > 1 && elementMatcher( matchers ),
2473+ i > 1 && toSelector(
2474+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
2475+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2476+ ).replace( rtrim, "$1" ),
2477+ matcher,
2478+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
2479+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2480+ j < len && toSelector( tokens )
2481+ );
2482+ }
2483+ matchers.push( matcher );
2484+ }
2485+ }
2486+
2487+ return elementMatcher( matchers );
2488+}
2489+
2490+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2491+ var bySet = setMatchers.length > 0,
2492+ byElement = elementMatchers.length > 0,
2493+ superMatcher = function( seed, context, xml, results, outermost ) {
2494+ var elem, j, matcher,
2495+ matchedCount = 0,
2496+ i = "0",
2497+ unmatched = seed && [],
2498+ setMatched = [],
2499+ contextBackup = outermostContext,
2500+ // We must always have either seed elements or outermost context
2501+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
2502+ // Use integer dirruns iff this is the outermost matcher
2503+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
2504+ len = elems.length;
2505+
2506+ if ( outermost ) {
2507+ outermostContext = context === document || context || outermost;
2508+ }
2509+
2510+ // Add elements passing elementMatchers directly to results
2511+ // Support: IE<9, Safari
2512+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2513+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
2514+ if ( byElement && elem ) {
2515+ j = 0;
2516+ if ( !context && elem.ownerDocument !== document ) {
2517+ setDocument( elem );
2518+ xml = !documentIsHTML;
2519+ }
2520+ while ( (matcher = elementMatchers[j++]) ) {
2521+ if ( matcher( elem, context || document, xml) ) {
2522+ results.push( elem );
2523+ break;
2524+ }
2525+ }
2526+ if ( outermost ) {
2527+ dirruns = dirrunsUnique;
2528+ }
2529+ }
2530+
2531+ // Track unmatched elements for set filters
2532+ if ( bySet ) {
2533+ // They will have gone through all possible matchers
2534+ if ( (elem = !matcher && elem) ) {
2535+ matchedCount--;
2536+ }
2537+
2538+ // Lengthen the array for every element, matched or not
2539+ if ( seed ) {
2540+ unmatched.push( elem );
2541+ }
2542+ }
2543+ }
2544+
2545+ // `i` is now the count of elements visited above, and adding it to `matchedCount`
2546+ // makes the latter nonnegative.
2547+ matchedCount += i;
2548+
2549+ // Apply set filters to unmatched elements
2550+ // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
2551+ // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
2552+ // no element matchers and no seed.
2553+ // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
2554+ // case, which will result in a "00" `matchedCount` that differs from `i` but is also
2555+ // numerically zero.
2556+ if ( bySet && i !== matchedCount ) {
2557+ j = 0;
2558+ while ( (matcher = setMatchers[j++]) ) {
2559+ matcher( unmatched, setMatched, context, xml );
2560+ }
2561+
2562+ if ( seed ) {
2563+ // Reintegrate element matches to eliminate the need for sorting
2564+ if ( matchedCount > 0 ) {
2565+ while ( i-- ) {
2566+ if ( !(unmatched[i] || setMatched[i]) ) {
2567+ setMatched[i] = pop.call( results );
2568+ }
2569+ }
2570+ }
2571+
2572+ // Discard index placeholder values to get only actual matches
2573+ setMatched = condense( setMatched );
2574+ }
2575+
2576+ // Add matches to results
2577+ push.apply( results, setMatched );
2578+
2579+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
2580+ if ( outermost && !seed && setMatched.length > 0 &&
2581+ ( matchedCount + setMatchers.length ) > 1 ) {
2582+
2583+ Sizzle.uniqueSort( results );
2584+ }
2585+ }
2586+
2587+ // Override manipulation of globals by nested matchers
2588+ if ( outermost ) {
2589+ dirruns = dirrunsUnique;
2590+ outermostContext = contextBackup;
2591+ }
2592+
2593+ return unmatched;
2594+ };
2595+
2596+ return bySet ?
2597+ markFunction( superMatcher ) :
2598+ superMatcher;
2599+}
2600+
2601+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2602+ var i,
2603+ setMatchers = [],
2604+ elementMatchers = [],
2605+ cached = compilerCache[ selector + " " ];
2606+
2607+ if ( !cached ) {
2608+ // Generate a function of recursive functions that can be used to check each element
2609+ if ( !match ) {
2610+ match = tokenize( selector );
2611+ }
2612+ i = match.length;
2613+ while ( i-- ) {
2614+ cached = matcherFromTokens( match[i] );
2615+ if ( cached[ expando ] ) {
2616+ setMatchers.push( cached );
2617+ } else {
2618+ elementMatchers.push( cached );
2619+ }
2620+ }
2621+
2622+ // Cache the compiled function
2623+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2624+
2625+ // Save selector and tokenization
2626+ cached.selector = selector;
2627+ }
2628+ return cached;
2629+};
2630+
2631+/**
2632+ * A low-level selection function that works with Sizzle's compiled
2633+ * selector functions
2634+ * @param {String|Function} selector A selector or a pre-compiled
2635+ * selector function built with Sizzle.compile
2636+ * @param {Element} context
2637+ * @param {Array} [results]
2638+ * @param {Array} [seed] A set of elements to match against
2639+ */
2640+select = Sizzle.select = function( selector, context, results, seed ) {
2641+ var i, tokens, token, type, find,
2642+ compiled = typeof selector === "function" && selector,
2643+ match = !seed && tokenize( (selector = compiled.selector || selector) );
2644+
2645+ results = results || [];
2646+
2647+ // Try to minimize operations if there is only one selector in the list and no seed
2648+ // (the latter of which guarantees us context)
2649+ if ( match.length === 1 ) {
2650+
2651+ // Reduce context if the leading compound selector is an ID
2652+ tokens = match[0] = match[0].slice( 0 );
2653+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2654+ context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
2655+
2656+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2657+ if ( !context ) {
2658+ return results;
2659+
2660+ // Precompiled matchers will still verify ancestry, so step up a level
2661+ } else if ( compiled ) {
2662+ context = context.parentNode;
2663+ }
2664+
2665+ selector = selector.slice( tokens.shift().value.length );
2666+ }
2667+
2668+ // Fetch a seed set for right-to-left matching
2669+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2670+ while ( i-- ) {
2671+ token = tokens[i];
2672+
2673+ // Abort if we hit a combinator
2674+ if ( Expr.relative[ (type = token.type) ] ) {
2675+ break;
2676+ }
2677+ if ( (find = Expr.find[ type ]) ) {
2678+ // Search, expanding context for leading sibling combinators
2679+ if ( (seed = find(
2680+ token.matches[0].replace( runescape, funescape ),
2681+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
2682+ )) ) {
2683+
2684+ // If seed is empty or no tokens remain, we can return early
2685+ tokens.splice( i, 1 );
2686+ selector = seed.length && toSelector( tokens );
2687+ if ( !selector ) {
2688+ push.apply( results, seed );
2689+ return results;
2690+ }
2691+
2692+ break;
2693+ }
2694+ }
2695+ }
2696+ }
2697+
2698+ // Compile and execute a filtering function if one is not provided
2699+ // Provide `match` to avoid retokenization if we modified the selector above
2700+ ( compiled || compile( selector, match ) )(
2701+ seed,
2702+ context,
2703+ !documentIsHTML,
2704+ results,
2705+ !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2706+ );
2707+ return results;
2708+};
2709+
2710+// One-time assignments
2711+
2712+// Sort stability
2713+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2714+
2715+// Support: Chrome 14-35+
2716+// Always assume duplicates if they aren't passed to the comparison function
2717+support.detectDuplicates = !!hasDuplicate;
2718+
2719+// Initialize against the default document
2720+setDocument();
2721+
2722+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2723+// Detached nodes confoundingly follow *each other*
2724+support.sortDetached = assert(function( el ) {
2725+ // Should return 1, but returns 4 (following)
2726+ return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
2727+});
2728+
2729+// Support: IE<8
2730+// Prevent attribute/property "interpolation"
2731+// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2732+if ( !assert(function( el ) {
2733+ el.innerHTML = "<a href='#'></a>";
2734+ return el.firstChild.getAttribute("href") === "#" ;
2735+}) ) {
2736+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
2737+ if ( !isXML ) {
2738+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2739+ }
2740+ });
2741+}
2742+
2743+// Support: IE<9
2744+// Use defaultValue in place of getAttribute("value")
2745+if ( !support.attributes || !assert(function( el ) {
2746+ el.innerHTML = "<input/>";
2747+ el.firstChild.setAttribute( "value", "" );
2748+ return el.firstChild.getAttribute( "value" ) === "";
2749+}) ) {
2750+ addHandle( "value", function( elem, name, isXML ) {
2751+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2752+ return elem.defaultValue;
2753+ }
2754+ });
2755+}
2756+
2757+// Support: IE<9
2758+// Use getAttributeNode to fetch booleans when getAttribute lies
2759+if ( !assert(function( el ) {
2760+ return el.getAttribute("disabled") == null;
2761+}) ) {
2762+ addHandle( booleans, function( elem, name, isXML ) {
2763+ var val;
2764+ if ( !isXML ) {
2765+ return elem[ name ] === true ? name.toLowerCase() :
2766+ (val = elem.getAttributeNode( name )) && val.specified ?
2767+ val.value :
2768+ null;
2769+ }
2770+ });
2771+}
2772+
2773+return Sizzle;
2774+
2775+})( window );
2776+
2777+
2778+
2779+jQuery.find = Sizzle;
2780+jQuery.expr = Sizzle.selectors;
2781+
2782+// Deprecated
2783+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
2784+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
2785+jQuery.text = Sizzle.getText;
2786+jQuery.isXMLDoc = Sizzle.isXML;
2787+jQuery.contains = Sizzle.contains;
2788+jQuery.escapeSelector = Sizzle.escape;
2789+
2790+
2791+
2792+
2793+var dir = function( elem, dir, until ) {
2794+ var matched = [],
2795+ truncate = until !== undefined;
2796+
2797+ while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
2798+ if ( elem.nodeType === 1 ) {
2799+ if ( truncate && jQuery( elem ).is( until ) ) {
2800+ break;
2801+ }
2802+ matched.push( elem );
2803+ }
2804+ }
2805+ return matched;
2806+};
2807+
2808+
2809+var siblings = function( n, elem ) {
2810+ var matched = [];
2811+
2812+ for ( ; n; n = n.nextSibling ) {
2813+ if ( n.nodeType === 1 && n !== elem ) {
2814+ matched.push( n );
2815+ }
2816+ }
2817+
2818+ return matched;
2819+};
2820+
2821+
2822+var rneedsContext = jQuery.expr.match.needsContext;
2823+
2824+
2825+
2826+function nodeName( elem, name ) {
2827+
2828+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
2829+
2830+};
2831+var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
2832+
2833+
2834+
2835+// Implement the identical functionality for filter and not
2836+function winnow( elements, qualifier, not ) {
2837+ if ( isFunction( qualifier ) ) {
2838+ return jQuery.grep( elements, function( elem, i ) {
2839+ return !!qualifier.call( elem, i, elem ) !== not;
2840+ } );
2841+ }
2842+
2843+ // Single element
2844+ if ( qualifier.nodeType ) {
2845+ return jQuery.grep( elements, function( elem ) {
2846+ return ( elem === qualifier ) !== not;
2847+ } );
2848+ }
2849+
2850+ // Arraylike of elements (jQuery, arguments, Array)
2851+ if ( typeof qualifier !== "string" ) {
2852+ return jQuery.grep( elements, function( elem ) {
2853+ return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
2854+ } );
2855+ }
2856+
2857+ // Filtered directly for both simple and complex selectors
2858+ return jQuery.filter( qualifier, elements, not );
2859+}
2860+
2861+jQuery.filter = function( expr, elems, not ) {
2862+ var elem = elems[ 0 ];
2863+
2864+ if ( not ) {
2865+ expr = ":not(" + expr + ")";
2866+ }
2867+
2868+ if ( elems.length === 1 && elem.nodeType === 1 ) {
2869+ return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
2870+ }
2871+
2872+ return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
2873+ return elem.nodeType === 1;
2874+ } ) );
2875+};
2876+
2877+jQuery.fn.extend( {
2878+ find: function( selector ) {
2879+ var i, ret,
2880+ len = this.length,
2881+ self = this;
2882+
2883+ if ( typeof selector !== "string" ) {
2884+ return this.pushStack( jQuery( selector ).filter( function() {
2885+ for ( i = 0; i < len; i++ ) {
2886+ if ( jQuery.contains( self[ i ], this ) ) {
2887+ return true;
2888+ }
2889+ }
2890+ } ) );
2891+ }
2892+
2893+ ret = this.pushStack( [] );
2894+
2895+ for ( i = 0; i < len; i++ ) {
2896+ jQuery.find( selector, self[ i ], ret );
2897+ }
2898+
2899+ return len > 1 ? jQuery.uniqueSort( ret ) : ret;
2900+ },
2901+ filter: function( selector ) {
2902+ return this.pushStack( winnow( this, selector || [], false ) );
2903+ },
2904+ not: function( selector ) {
2905+ return this.pushStack( winnow( this, selector || [], true ) );
2906+ },
2907+ is: function( selector ) {
2908+ return !!winnow(
2909+ this,
2910+
2911+ // If this is a positional/relative selector, check membership in the returned set
2912+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
2913+ typeof selector === "string" && rneedsContext.test( selector ) ?
2914+ jQuery( selector ) :
2915+ selector || [],
2916+ false
2917+ ).length;
2918+ }
2919+} );
2920+
2921+
2922+// Initialize a jQuery object
2923+
2924+
2925+// A central reference to the root jQuery(document)
2926+var rootjQuery,
2927+
2928+ // A simple way to check for HTML strings
2929+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
2930+ // Strict HTML recognition (#11290: must start with <)
2931+ // Shortcut simple #id case for speed
2932+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
2933+
2934+ init = jQuery.fn.init = function( selector, context, root ) {
2935+ var match, elem;
2936+
2937+ // HANDLE: $(""), $(null), $(undefined), $(false)
2938+ if ( !selector ) {
2939+ return this;
2940+ }
2941+
2942+ // Method init() accepts an alternate rootjQuery
2943+ // so migrate can support jQuery.sub (gh-2101)
2944+ root = root || rootjQuery;
2945+
2946+ // Handle HTML strings
2947+ if ( typeof selector === "string" ) {
2948+ if ( selector[ 0 ] === "<" &&
2949+ selector[ selector.length - 1 ] === ">" &&
2950+ selector.length >= 3 ) {
2951+
2952+ // Assume that strings that start and end with <> are HTML and skip the regex check
2953+ match = [ null, selector, null ];
2954+
2955+ } else {
2956+ match = rquickExpr.exec( selector );
2957+ }
2958+
2959+ // Match html or make sure no context is specified for #id
2960+ if ( match && ( match[ 1 ] || !context ) ) {
2961+
2962+ // HANDLE: $(html) -> $(array)
2963+ if ( match[ 1 ] ) {
2964+ context = context instanceof jQuery ? context[ 0 ] : context;
2965+
2966+ // Option to run scripts is true for back-compat
2967+ // Intentionally let the error be thrown if parseHTML is not present
2968+ jQuery.merge( this, jQuery.parseHTML(
2969+ match[ 1 ],
2970+ context && context.nodeType ? context.ownerDocument || context : document,
2971+ true
2972+ ) );
2973+
2974+ // HANDLE: $(html, props)
2975+ if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
2976+ for ( match in context ) {
2977+
2978+ // Properties of context are called as methods if possible
2979+ if ( isFunction( this[ match ] ) ) {
2980+ this[ match ]( context[ match ] );
2981+
2982+ // ...and otherwise set as attributes
2983+ } else {
2984+ this.attr( match, context[ match ] );
2985+ }
2986+ }
2987+ }
2988+
2989+ return this;
2990+
2991+ // HANDLE: $(#id)
2992+ } else {
2993+ elem = document.getElementById( match[ 2 ] );
2994+
2995+ if ( elem ) {
2996+
2997+ // Inject the element directly into the jQuery object
2998+ this[ 0 ] = elem;
2999+ this.length = 1;
3000+ }
3001+ return this;
3002+ }
3003+
3004+ // HANDLE: $(expr, $(...))
3005+ } else if ( !context || context.jquery ) {
3006+ return ( context || root ).find( selector );
3007+
3008+ // HANDLE: $(expr, context)
3009+ // (which is just equivalent to: $(context).find(expr)
3010+ } else {
3011+ return this.constructor( context ).find( selector );
3012+ }
3013+
3014+ // HANDLE: $(DOMElement)
3015+ } else if ( selector.nodeType ) {
3016+ this[ 0 ] = selector;
3017+ this.length = 1;
3018+ return this;
3019+
3020+ // HANDLE: $(function)
3021+ // Shortcut for document ready
3022+ } else if ( isFunction( selector ) ) {
3023+ return root.ready !== undefined ?
3024+ root.ready( selector ) :
3025+
3026+ // Execute immediately if ready is not present
3027+ selector( jQuery );
3028+ }
3029+
3030+ return jQuery.makeArray( selector, this );
3031+ };
3032+
3033+// Give the init function the jQuery prototype for later instantiation
3034+init.prototype = jQuery.fn;
3035+
3036+// Initialize central reference
3037+rootjQuery = jQuery( document );
3038+
3039+
3040+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
3041+
3042+ // Methods guaranteed to produce a unique set when starting from a unique set
3043+ guaranteedUnique = {
3044+ children: true,
3045+ contents: true,
3046+ next: true,
3047+ prev: true
3048+ };
3049+
3050+jQuery.fn.extend( {
3051+ has: function( target ) {
3052+ var targets = jQuery( target, this ),
3053+ l = targets.length;
3054+
3055+ return this.filter( function() {
3056+ var i = 0;
3057+ for ( ; i < l; i++ ) {
3058+ if ( jQuery.contains( this, targets[ i ] ) ) {
3059+ return true;
3060+ }
3061+ }
3062+ } );
3063+ },
3064+
3065+ closest: function( selectors, context ) {
3066+ var cur,
3067+ i = 0,
3068+ l = this.length,
3069+ matched = [],
3070+ targets = typeof selectors !== "string" && jQuery( selectors );
3071+
3072+ // Positional selectors never match, since there's no _selection_ context
3073+ if ( !rneedsContext.test( selectors ) ) {
3074+ for ( ; i < l; i++ ) {
3075+ for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
3076+
3077+ // Always skip document fragments
3078+ if ( cur.nodeType < 11 && ( targets ?
3079+ targets.index( cur ) > -1 :
3080+
3081+ // Don't pass non-elements to Sizzle
3082+ cur.nodeType === 1 &&
3083+ jQuery.find.matchesSelector( cur, selectors ) ) ) {
3084+
3085+ matched.push( cur );
3086+ break;
3087+ }
3088+ }
3089+ }
3090+ }
3091+
3092+ return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
3093+ },
3094+
3095+ // Determine the position of an element within the set
3096+ index: function( elem ) {
3097+
3098+ // No argument, return index in parent
3099+ if ( !elem ) {
3100+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
3101+ }
3102+
3103+ // Index in selector
3104+ if ( typeof elem === "string" ) {
3105+ return indexOf.call( jQuery( elem ), this[ 0 ] );
3106+ }
3107+
3108+ // Locate the position of the desired element
3109+ return indexOf.call( this,
3110+
3111+ // If it receives a jQuery object, the first element is used
3112+ elem.jquery ? elem[ 0 ] : elem
3113+ );
3114+ },
3115+
3116+ add: function( selector, context ) {
3117+ return this.pushStack(
3118+ jQuery.uniqueSort(
3119+ jQuery.merge( this.get(), jQuery( selector, context ) )
3120+ )
3121+ );
3122+ },
3123+
3124+ addBack: function( selector ) {
3125+ return this.add( selector == null ?
3126+ this.prevObject : this.prevObject.filter( selector )
3127+ );
3128+ }
3129+} );
3130+
3131+function sibling( cur, dir ) {
3132+ while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
3133+ return cur;
3134+}
3135+
3136+jQuery.each( {
3137+ parent: function( elem ) {
3138+ var parent = elem.parentNode;
3139+ return parent && parent.nodeType !== 11 ? parent : null;
3140+ },
3141+ parents: function( elem ) {
3142+ return dir( elem, "parentNode" );
3143+ },
3144+ parentsUntil: function( elem, i, until ) {
3145+ return dir( elem, "parentNode", until );
3146+ },
3147+ next: function( elem ) {
3148+ return sibling( elem, "nextSibling" );
3149+ },
3150+ prev: function( elem ) {
3151+ return sibling( elem, "previousSibling" );
3152+ },
3153+ nextAll: function( elem ) {
3154+ return dir( elem, "nextSibling" );
3155+ },
3156+ prevAll: function( elem ) {
3157+ return dir( elem, "previousSibling" );
3158+ },
3159+ nextUntil: function( elem, i, until ) {
3160+ return dir( elem, "nextSibling", until );
3161+ },
3162+ prevUntil: function( elem, i, until ) {
3163+ return dir( elem, "previousSibling", until );
3164+ },
3165+ siblings: function( elem ) {
3166+ return siblings( ( elem.parentNode || {} ).firstChild, elem );
3167+ },
3168+ children: function( elem ) {
3169+ return siblings( elem.firstChild );
3170+ },
3171+ contents: function( elem ) {
3172+ if ( typeof elem.contentDocument !== "undefined" ) {
3173+ return elem.contentDocument;
3174+ }
3175+
3176+ // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
3177+ // Treat the template element as a regular one in browsers that
3178+ // don't support it.
3179+ if ( nodeName( elem, "template" ) ) {
3180+ elem = elem.content || elem;
3181+ }
3182+
3183+ return jQuery.merge( [], elem.childNodes );
3184+ }
3185+}, function( name, fn ) {
3186+ jQuery.fn[ name ] = function( until, selector ) {
3187+ var matched = jQuery.map( this, fn, until );
3188+
3189+ if ( name.slice( -5 ) !== "Until" ) {
3190+ selector = until;
3191+ }
3192+
3193+ if ( selector && typeof selector === "string" ) {
3194+ matched = jQuery.filter( selector, matched );
3195+ }
3196+
3197+ if ( this.length > 1 ) {
3198+
3199+ // Remove duplicates
3200+ if ( !guaranteedUnique[ name ] ) {
3201+ jQuery.uniqueSort( matched );
3202+ }
3203+
3204+ // Reverse order for parents* and prev-derivatives
3205+ if ( rparentsprev.test( name ) ) {
3206+ matched.reverse();
3207+ }
3208+ }
3209+
3210+ return this.pushStack( matched );
3211+ };
3212+} );
3213+var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
3214+
3215+
3216+
3217+// Convert String-formatted options into Object-formatted ones
3218+function createOptions( options ) {
3219+ var object = {};
3220+ jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
3221+ object[ flag ] = true;
3222+ } );
3223+ return object;
3224+}
3225+
3226+/*
3227+ * Create a callback list using the following parameters:
3228+ *
3229+ * options: an optional list of space-separated options that will change how
3230+ * the callback list behaves or a more traditional option object
3231+ *
3232+ * By default a callback list will act like an event callback list and can be
3233+ * "fired" multiple times.
3234+ *
3235+ * Possible options:
3236+ *
3237+ * once: will ensure the callback list can only be fired once (like a Deferred)
3238+ *
3239+ * memory: will keep track of previous values and will call any callback added
3240+ * after the list has been fired right away with the latest "memorized"
3241+ * values (like a Deferred)
3242+ *
3243+ * unique: will ensure a callback can only be added once (no duplicate in the list)
3244+ *
3245+ * stopOnFalse: interrupt callings when a callback returns false
3246+ *
3247+ */
3248+jQuery.Callbacks = function( options ) {
3249+
3250+ // Convert options from String-formatted to Object-formatted if needed
3251+ // (we check in cache first)
3252+ options = typeof options === "string" ?
3253+ createOptions( options ) :
3254+ jQuery.extend( {}, options );
3255+
3256+ var // Flag to know if list is currently firing
3257+ firing,
3258+
3259+ // Last fire value for non-forgettable lists
3260+ memory,
3261+
3262+ // Flag to know if list was already fired
3263+ fired,
3264+
3265+ // Flag to prevent firing
3266+ locked,
3267+
3268+ // Actual callback list
3269+ list = [],
3270+
3271+ // Queue of execution data for repeatable lists
3272+ queue = [],
3273+
3274+ // Index of currently firing callback (modified by add/remove as needed)
3275+ firingIndex = -1,
3276+
3277+ // Fire callbacks
3278+ fire = function() {
3279+
3280+ // Enforce single-firing
3281+ locked = locked || options.once;
3282+
3283+ // Execute callbacks for all pending executions,
3284+ // respecting firingIndex overrides and runtime changes
3285+ fired = firing = true;
3286+ for ( ; queue.length; firingIndex = -1 ) {
3287+ memory = queue.shift();
3288+ while ( ++firingIndex < list.length ) {
3289+
3290+ // Run callback and check for early termination
3291+ if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
3292+ options.stopOnFalse ) {
3293+
3294+ // Jump to end and forget the data so .add doesn't re-fire
3295+ firingIndex = list.length;
3296+ memory = false;
3297+ }
3298+ }
3299+ }
3300+
3301+ // Forget the data if we're done with it
3302+ if ( !options.memory ) {
3303+ memory = false;
3304+ }
3305+
3306+ firing = false;
3307+
3308+ // Clean up if we're done firing for good
3309+ if ( locked ) {
3310+
3311+ // Keep an empty list if we have data for future add calls
3312+ if ( memory ) {
3313+ list = [];
3314+
3315+ // Otherwise, this object is spent
3316+ } else {
3317+ list = "";
3318+ }
3319+ }
3320+ },
3321+
3322+ // Actual Callbacks object
3323+ self = {
3324+
3325+ // Add a callback or a collection of callbacks to the list
3326+ add: function() {
3327+ if ( list ) {
3328+
3329+ // If we have memory from a past run, we should fire after adding
3330+ if ( memory && !firing ) {
3331+ firingIndex = list.length - 1;
3332+ queue.push( memory );
3333+ }
3334+
3335+ ( function add( args ) {
3336+ jQuery.each( args, function( _, arg ) {
3337+ if ( isFunction( arg ) ) {
3338+ if ( !options.unique || !self.has( arg ) ) {
3339+ list.push( arg );
3340+ }
3341+ } else if ( arg && arg.length && toType( arg ) !== "string" ) {
3342+
3343+ // Inspect recursively
3344+ add( arg );
3345+ }
3346+ } );
3347+ } )( arguments );
3348+
3349+ if ( memory && !firing ) {
3350+ fire();
3351+ }
3352+ }
3353+ return this;
3354+ },
3355+
3356+ // Remove a callback from the list
3357+ remove: function() {
3358+ jQuery.each( arguments, function( _, arg ) {
3359+ var index;
3360+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
3361+ list.splice( index, 1 );
3362+
3363+ // Handle firing indexes
3364+ if ( index <= firingIndex ) {
3365+ firingIndex--;
3366+ }
3367+ }
3368+ } );
3369+ return this;
3370+ },
3371+
3372+ // Check if a given callback is in the list.
3373+ // If no argument is given, return whether or not list has callbacks attached.
3374+ has: function( fn ) {
3375+ return fn ?
3376+ jQuery.inArray( fn, list ) > -1 :
3377+ list.length > 0;
3378+ },
3379+
3380+ // Remove all callbacks from the list
3381+ empty: function() {
3382+ if ( list ) {
3383+ list = [];
3384+ }
3385+ return this;
3386+ },
3387+
3388+ // Disable .fire and .add
3389+ // Abort any current/pending executions
3390+ // Clear all callbacks and values
3391+ disable: function() {
3392+ locked = queue = [];
3393+ list = memory = "";
3394+ return this;
3395+ },
3396+ disabled: function() {
3397+ return !list;
3398+ },
3399+
3400+ // Disable .fire
3401+ // Also disable .add unless we have memory (since it would have no effect)
3402+ // Abort any pending executions
3403+ lock: function() {
3404+ locked = queue = [];
3405+ if ( !memory && !firing ) {
3406+ list = memory = "";
3407+ }
3408+ return this;
3409+ },
3410+ locked: function() {
3411+ return !!locked;
3412+ },
3413+
3414+ // Call all callbacks with the given context and arguments
3415+ fireWith: function( context, args ) {
3416+ if ( !locked ) {
3417+ args = args || [];
3418+ args = [ context, args.slice ? args.slice() : args ];
3419+ queue.push( args );
3420+ if ( !firing ) {
3421+ fire();
3422+ }
3423+ }
3424+ return this;
3425+ },
3426+
3427+ // Call all the callbacks with the given arguments
3428+ fire: function() {
3429+ self.fireWith( this, arguments );
3430+ return this;
3431+ },
3432+
3433+ // To know if the callbacks have already been called at least once
3434+ fired: function() {
3435+ return !!fired;
3436+ }
3437+ };
3438+
3439+ return self;
3440+};
3441+
3442+
3443+function Identity( v ) {
3444+ return v;
3445+}
3446+function Thrower( ex ) {
3447+ throw ex;
3448+}
3449+
3450+function adoptValue( value, resolve, reject, noValue ) {
3451+ var method;
3452+
3453+ try {
3454+
3455+ // Check for promise aspect first to privilege synchronous behavior
3456+ if ( value && isFunction( ( method = value.promise ) ) ) {
3457+ method.call( value ).done( resolve ).fail( reject );
3458+
3459+ // Other thenables
3460+ } else if ( value && isFunction( ( method = value.then ) ) ) {
3461+ method.call( value, resolve, reject );
3462+
3463+ // Other non-thenables
3464+ } else {
3465+
3466+ // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
3467+ // * false: [ value ].slice( 0 ) => resolve( value )
3468+ // * true: [ value ].slice( 1 ) => resolve()
3469+ resolve.apply( undefined, [ value ].slice( noValue ) );
3470+ }
3471+
3472+ // For Promises/A+, convert exceptions into rejections
3473+ // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
3474+ // Deferred#then to conditionally suppress rejection.
3475+ } catch ( value ) {
3476+
3477+ // Support: Android 4.0 only
3478+ // Strict mode functions invoked without .call/.apply get global-object context
3479+ reject.apply( undefined, [ value ] );
3480+ }
3481+}
3482+
3483+jQuery.extend( {
3484+
3485+ Deferred: function( func ) {
3486+ var tuples = [
3487+
3488+ // action, add listener, callbacks,
3489+ // ... .then handlers, argument index, [final state]
3490+ [ "notify", "progress", jQuery.Callbacks( "memory" ),
3491+ jQuery.Callbacks( "memory" ), 2 ],
3492+ [ "resolve", "done", jQuery.Callbacks( "once memory" ),
3493+ jQuery.Callbacks( "once memory" ), 0, "resolved" ],
3494+ [ "reject", "fail", jQuery.Callbacks( "once memory" ),
3495+ jQuery.Callbacks( "once memory" ), 1, "rejected" ]
3496+ ],
3497+ state = "pending",
3498+ promise = {
3499+ state: function() {
3500+ return state;
3501+ },
3502+ always: function() {
3503+ deferred.done( arguments ).fail( arguments );
3504+ return this;
3505+ },
3506+ "catch": function( fn ) {
3507+ return promise.then( null, fn );
3508+ },
3509+
3510+ // Keep pipe for back-compat
3511+ pipe: function( /* fnDone, fnFail, fnProgress */ ) {
3512+ var fns = arguments;
3513+
3514+ return jQuery.Deferred( function( newDefer ) {
3515+ jQuery.each( tuples, function( i, tuple ) {
3516+
3517+ // Map tuples (progress, done, fail) to arguments (done, fail, progress)
3518+ var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
3519+
3520+ // deferred.progress(function() { bind to newDefer or newDefer.notify })
3521+ // deferred.done(function() { bind to newDefer or newDefer.resolve })
3522+ // deferred.fail(function() { bind to newDefer or newDefer.reject })
3523+ deferred[ tuple[ 1 ] ]( function() {
3524+ var returned = fn && fn.apply( this, arguments );
3525+ if ( returned && isFunction( returned.promise ) ) {
3526+ returned.promise()
3527+ .progress( newDefer.notify )
3528+ .done( newDefer.resolve )
3529+ .fail( newDefer.reject );
3530+ } else {
3531+ newDefer[ tuple[ 0 ] + "With" ](
3532+ this,
3533+ fn ? [ returned ] : arguments
3534+ );
3535+ }
3536+ } );
3537+ } );
3538+ fns = null;
3539+ } ).promise();
3540+ },
3541+ then: function( onFulfilled, onRejected, onProgress ) {
3542+ var maxDepth = 0;
3543+ function resolve( depth, deferred, handler, special ) {
3544+ return function() {
3545+ var that = this,
3546+ args = arguments,
3547+ mightThrow = function() {
3548+ var returned, then;
3549+
3550+ // Support: Promises/A+ section 2.3.3.3.3
3551+ // https://promisesaplus.com/#point-59
3552+ // Ignore double-resolution attempts
3553+ if ( depth < maxDepth ) {
3554+ return;
3555+ }
3556+
3557+ returned = handler.apply( that, args );
3558+
3559+ // Support: Promises/A+ section 2.3.1
3560+ // https://promisesaplus.com/#point-48
3561+ if ( returned === deferred.promise() ) {
3562+ throw new TypeError( "Thenable self-resolution" );
3563+ }
3564+
3565+ // Support: Promises/A+ sections 2.3.3.1, 3.5
3566+ // https://promisesaplus.com/#point-54
3567+ // https://promisesaplus.com/#point-75
3568+ // Retrieve `then` only once
3569+ then = returned &&
3570+
3571+ // Support: Promises/A+ section 2.3.4
3572+ // https://promisesaplus.com/#point-64
3573+ // Only check objects and functions for thenability
3574+ ( typeof returned === "object" ||
3575+ typeof returned === "function" ) &&
3576+ returned.then;
3577+
3578+ // Handle a returned thenable
3579+ if ( isFunction( then ) ) {
3580+
3581+ // Special processors (notify) just wait for resolution
3582+ if ( special ) {
3583+ then.call(
3584+ returned,
3585+ resolve( maxDepth, deferred, Identity, special ),
3586+ resolve( maxDepth, deferred, Thrower, special )
3587+ );
3588+
3589+ // Normal processors (resolve) also hook into progress
3590+ } else {
3591+
3592+ // ...and disregard older resolution values
3593+ maxDepth++;
3594+
3595+ then.call(
3596+ returned,
3597+ resolve( maxDepth, deferred, Identity, special ),
3598+ resolve( maxDepth, deferred, Thrower, special ),
3599+ resolve( maxDepth, deferred, Identity,
3600+ deferred.notifyWith )
3601+ );
3602+ }
3603+
3604+ // Handle all other returned values
3605+ } else {
3606+
3607+ // Only substitute handlers pass on context
3608+ // and multiple values (non-spec behavior)
3609+ if ( handler !== Identity ) {
3610+ that = undefined;
3611+ args = [ returned ];
3612+ }
3613+
3614+ // Process the value(s)
3615+ // Default process is resolve
3616+ ( special || deferred.resolveWith )( that, args );
3617+ }
3618+ },
3619+
3620+ // Only normal processors (resolve) catch and reject exceptions
3621+ process = special ?
3622+ mightThrow :
3623+ function() {
3624+ try {
3625+ mightThrow();
3626+ } catch ( e ) {
3627+
3628+ if ( jQuery.Deferred.exceptionHook ) {
3629+ jQuery.Deferred.exceptionHook( e,
3630+ process.stackTrace );
3631+ }
3632+
3633+ // Support: Promises/A+ section 2.3.3.3.4.1
3634+ // https://promisesaplus.com/#point-61
3635+ // Ignore post-resolution exceptions
3636+ if ( depth + 1 >= maxDepth ) {
3637+
3638+ // Only substitute handlers pass on context
3639+ // and multiple values (non-spec behavior)
3640+ if ( handler !== Thrower ) {
3641+ that = undefined;
3642+ args = [ e ];
3643+ }
3644+
3645+ deferred.rejectWith( that, args );
3646+ }
3647+ }
3648+ };
3649+
3650+ // Support: Promises/A+ section 2.3.3.3.1
3651+ // https://promisesaplus.com/#point-57
3652+ // Re-resolve promises immediately to dodge false rejection from
3653+ // subsequent errors
3654+ if ( depth ) {
3655+ process();
3656+ } else {
3657+
3658+ // Call an optional hook to record the stack, in case of exception
3659+ // since it's otherwise lost when execution goes async
3660+ if ( jQuery.Deferred.getStackHook ) {
3661+ process.stackTrace = jQuery.Deferred.getStackHook();
3662+ }
3663+ window.setTimeout( process );
3664+ }
3665+ };
3666+ }
3667+
3668+ return jQuery.Deferred( function( newDefer ) {
3669+
3670+ // progress_handlers.add( ... )
3671+ tuples[ 0 ][ 3 ].add(
3672+ resolve(
3673+ 0,
3674+ newDefer,
3675+ isFunction( onProgress ) ?
3676+ onProgress :
3677+ Identity,
3678+ newDefer.notifyWith
3679+ )
3680+ );
3681+
3682+ // fulfilled_handlers.add( ... )
3683+ tuples[ 1 ][ 3 ].add(
3684+ resolve(
3685+ 0,
3686+ newDefer,
3687+ isFunction( onFulfilled ) ?
3688+ onFulfilled :
3689+ Identity
3690+ )
3691+ );
3692+
3693+ // rejected_handlers.add( ... )
3694+ tuples[ 2 ][ 3 ].add(
3695+ resolve(
3696+ 0,
3697+ newDefer,
3698+ isFunction( onRejected ) ?
3699+ onRejected :
3700+ Thrower
3701+ )
3702+ );
3703+ } ).promise();
3704+ },
3705+
3706+ // Get a promise for this deferred
3707+ // If obj is provided, the promise aspect is added to the object
3708+ promise: function( obj ) {
3709+ return obj != null ? jQuery.extend( obj, promise ) : promise;
3710+ }
3711+ },
3712+ deferred = {};
3713+
3714+ // Add list-specific methods
3715+ jQuery.each( tuples, function( i, tuple ) {
3716+ var list = tuple[ 2 ],
3717+ stateString = tuple[ 5 ];
3718+
3719+ // promise.progress = list.add
3720+ // promise.done = list.add
3721+ // promise.fail = list.add
3722+ promise[ tuple[ 1 ] ] = list.add;
3723+
3724+ // Handle state
3725+ if ( stateString ) {
3726+ list.add(
3727+ function() {
3728+
3729+ // state = "resolved" (i.e., fulfilled)
3730+ // state = "rejected"
3731+ state = stateString;
3732+ },
3733+
3734+ // rejected_callbacks.disable
3735+ // fulfilled_callbacks.disable
3736+ tuples[ 3 - i ][ 2 ].disable,
3737+
3738+ // rejected_handlers.disable
3739+ // fulfilled_handlers.disable
3740+ tuples[ 3 - i ][ 3 ].disable,
3741+
3742+ // progress_callbacks.lock
3743+ tuples[ 0 ][ 2 ].lock,
3744+
3745+ // progress_handlers.lock
3746+ tuples[ 0 ][ 3 ].lock
3747+ );
3748+ }
3749+
3750+ // progress_handlers.fire
3751+ // fulfilled_handlers.fire
3752+ // rejected_handlers.fire
3753+ list.add( tuple[ 3 ].fire );
3754+
3755+ // deferred.notify = function() { deferred.notifyWith(...) }
3756+ // deferred.resolve = function() { deferred.resolveWith(...) }
3757+ // deferred.reject = function() { deferred.rejectWith(...) }
3758+ deferred[ tuple[ 0 ] ] = function() {
3759+ deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
3760+ return this;
3761+ };
3762+
3763+ // deferred.notifyWith = list.fireWith
3764+ // deferred.resolveWith = list.fireWith
3765+ // deferred.rejectWith = list.fireWith
3766+ deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
3767+ } );
3768+
3769+ // Make the deferred a promise
3770+ promise.promise( deferred );
3771+
3772+ // Call given func if any
3773+ if ( func ) {
3774+ func.call( deferred, deferred );
3775+ }
3776+
3777+ // All done!
3778+ return deferred;
3779+ },
3780+
3781+ // Deferred helper
3782+ when: function( singleValue ) {
3783+ var
3784+
3785+ // count of uncompleted subordinates
3786+ remaining = arguments.length,
3787+
3788+ // count of unprocessed arguments
3789+ i = remaining,
3790+
3791+ // subordinate fulfillment data
3792+ resolveContexts = Array( i ),
3793+ resolveValues = slice.call( arguments ),
3794+
3795+ // the master Deferred
3796+ master = jQuery.Deferred(),
3797+
3798+ // subordinate callback factory
3799+ updateFunc = function( i ) {
3800+ return function( value ) {
3801+ resolveContexts[ i ] = this;
3802+ resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
3803+ if ( !( --remaining ) ) {
3804+ master.resolveWith( resolveContexts, resolveValues );
3805+ }
3806+ };
3807+ };
3808+
3809+ // Single- and empty arguments are adopted like Promise.resolve
3810+ if ( remaining <= 1 ) {
3811+ adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
3812+ !remaining );
3813+
3814+ // Use .then() to unwrap secondary thenables (cf. gh-3000)
3815+ if ( master.state() === "pending" ||
3816+ isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
3817+
3818+ return master.then();
3819+ }
3820+ }
3821+
3822+ // Multiple arguments are aggregated like Promise.all array elements
3823+ while ( i-- ) {
3824+ adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
3825+ }
3826+
3827+ return master.promise();
3828+ }
3829+} );
3830+
3831+
3832+// These usually indicate a programmer mistake during development,
3833+// warn about them ASAP rather than swallowing them by default.
3834+var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
3835+
3836+jQuery.Deferred.exceptionHook = function( error, stack ) {
3837+
3838+ // Support: IE 8 - 9 only
3839+ // Console exists when dev tools are open, which can happen at any time
3840+ if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
3841+ window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
3842+ }
3843+};
3844+
3845+
3846+
3847+
3848+jQuery.readyException = function( error ) {
3849+ window.setTimeout( function() {
3850+ throw error;
3851+ } );
3852+};
3853+
3854+
3855+
3856+
3857+// The deferred used on DOM ready
3858+var readyList = jQuery.Deferred();
3859+
3860+jQuery.fn.ready = function( fn ) {
3861+
3862+ readyList
3863+ .then( fn )
3864+
3865+ // Wrap jQuery.readyException in a function so that the lookup
3866+ // happens at the time of error handling instead of callback
3867+ // registration.
3868+ .catch( function( error ) {
3869+ jQuery.readyException( error );
3870+ } );
3871+
3872+ return this;
3873+};
3874+
3875+jQuery.extend( {
3876+
3877+ // Is the DOM ready to be used? Set to true once it occurs.
3878+ isReady: false,
3879+
3880+ // A counter to track how many items to wait for before
3881+ // the ready event fires. See #6781
3882+ readyWait: 1,
3883+
3884+ // Handle when the DOM is ready
3885+ ready: function( wait ) {
3886+
3887+ // Abort if there are pending holds or we're already ready
3888+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
3889+ return;
3890+ }
3891+
3892+ // Remember that the DOM is ready
3893+ jQuery.isReady = true;
3894+
3895+ // If a normal DOM Ready event fired, decrement, and wait if need be
3896+ if ( wait !== true && --jQuery.readyWait > 0 ) {
3897+ return;
3898+ }
3899+
3900+ // If there are functions bound, to execute
3901+ readyList.resolveWith( document, [ jQuery ] );
3902+ }
3903+} );
3904+
3905+jQuery.ready.then = readyList.then;
3906+
3907+// The ready event handler and self cleanup method
3908+function completed() {
3909+ document.removeEventListener( "DOMContentLoaded", completed );
3910+ window.removeEventListener( "load", completed );
3911+ jQuery.ready();
3912+}
3913+
3914+// Catch cases where $(document).ready() is called
3915+// after the browser event has already occurred.
3916+// Support: IE <=9 - 10 only
3917+// Older IE sometimes signals "interactive" too soon
3918+if ( document.readyState === "complete" ||
3919+ ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
3920+
3921+ // Handle it asynchronously to allow scripts the opportunity to delay ready
3922+ window.setTimeout( jQuery.ready );
3923+
3924+} else {
3925+
3926+ // Use the handy event callback
3927+ document.addEventListener( "DOMContentLoaded", completed );
3928+
3929+ // A fallback to window.onload, that will always work
3930+ window.addEventListener( "load", completed );
3931+}
3932+
3933+
3934+
3935+
3936+// Multifunctional method to get and set values of a collection
3937+// The value/s can optionally be executed if it's a function
3938+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
3939+ var i = 0,
3940+ len = elems.length,
3941+ bulk = key == null;
3942+
3943+ // Sets many values
3944+ if ( toType( key ) === "object" ) {
3945+ chainable = true;
3946+ for ( i in key ) {
3947+ access( elems, fn, i, key[ i ], true, emptyGet, raw );
3948+ }
3949+
3950+ // Sets one value
3951+ } else if ( value !== undefined ) {
3952+ chainable = true;
3953+
3954+ if ( !isFunction( value ) ) {
3955+ raw = true;
3956+ }
3957+
3958+ if ( bulk ) {
3959+
3960+ // Bulk operations run against the entire set
3961+ if ( raw ) {
3962+ fn.call( elems, value );
3963+ fn = null;
3964+
3965+ // ...except when executing function values
3966+ } else {
3967+ bulk = fn;
3968+ fn = function( elem, key, value ) {
3969+ return bulk.call( jQuery( elem ), value );
3970+ };
3971+ }
3972+ }
3973+
3974+ if ( fn ) {
3975+ for ( ; i < len; i++ ) {
3976+ fn(
3977+ elems[ i ], key, raw ?
3978+ value :
3979+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
3980+ );
3981+ }
3982+ }
3983+ }
3984+
3985+ if ( chainable ) {
3986+ return elems;
3987+ }
3988+
3989+ // Gets
3990+ if ( bulk ) {
3991+ return fn.call( elems );
3992+ }
3993+
3994+ return len ? fn( elems[ 0 ], key ) : emptyGet;
3995+};
3996+
3997+
3998+// Matches dashed string for camelizing
3999+var rmsPrefix = /^-ms-/,
4000+ rdashAlpha = /-([a-z])/g;
4001+
4002+// Used by camelCase as callback to replace()
4003+function fcamelCase( all, letter ) {
4004+ return letter.toUpperCase();
4005+}
4006+
4007+// Convert dashed to camelCase; used by the css and data modules
4008+// Support: IE <=9 - 11, Edge 12 - 15
4009+// Microsoft forgot to hump their vendor prefix (#9572)
4010+function camelCase( string ) {
4011+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
4012+}
4013+var acceptData = function( owner ) {
4014+
4015+ // Accepts only:
4016+ // - Node
4017+ // - Node.ELEMENT_NODE
4018+ // - Node.DOCUMENT_NODE
4019+ // - Object
4020+ // - Any
4021+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
4022+};
4023+
4024+
4025+
4026+
4027+function Data() {
4028+ this.expando = jQuery.expando + Data.uid++;
4029+}
4030+
4031+Data.uid = 1;
4032+
4033+Data.prototype = {
4034+
4035+ cache: function( owner ) {
4036+
4037+ // Check if the owner object already has a cache
4038+ var value = owner[ this.expando ];
4039+
4040+ // If not, create one
4041+ if ( !value ) {
4042+ value = {};
4043+
4044+ // We can accept data for non-element nodes in modern browsers,
4045+ // but we should not, see #8335.
4046+ // Always return an empty object.
4047+ if ( acceptData( owner ) ) {
4048+
4049+ // If it is a node unlikely to be stringify-ed or looped over
4050+ // use plain assignment
4051+ if ( owner.nodeType ) {
4052+ owner[ this.expando ] = value;
4053+
4054+ // Otherwise secure it in a non-enumerable property
4055+ // configurable must be true to allow the property to be
4056+ // deleted when data is removed
4057+ } else {
4058+ Object.defineProperty( owner, this.expando, {
4059+ value: value,
4060+ configurable: true
4061+ } );
4062+ }
4063+ }
4064+ }
4065+
4066+ return value;
4067+ },
4068+ set: function( owner, data, value ) {
4069+ var prop,
4070+ cache = this.cache( owner );
4071+
4072+ // Handle: [ owner, key, value ] args
4073+ // Always use camelCase key (gh-2257)
4074+ if ( typeof data === "string" ) {
4075+ cache[ camelCase( data ) ] = value;
4076+
4077+ // Handle: [ owner, { properties } ] args
4078+ } else {
4079+
4080+ // Copy the properties one-by-one to the cache object
4081+ for ( prop in data ) {
4082+ cache[ camelCase( prop ) ] = data[ prop ];
4083+ }
4084+ }
4085+ return cache;
4086+ },
4087+ get: function( owner, key ) {
4088+ return key === undefined ?
4089+ this.cache( owner ) :
4090+
4091+ // Always use camelCase key (gh-2257)
4092+ owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
4093+ },
4094+ access: function( owner, key, value ) {
4095+
4096+ // In cases where either:
4097+ //
4098+ // 1. No key was specified
4099+ // 2. A string key was specified, but no value provided
4100+ //
4101+ // Take the "read" path and allow the get method to determine
4102+ // which value to return, respectively either:
4103+ //
4104+ // 1. The entire cache object
4105+ // 2. The data stored at the key
4106+ //
4107+ if ( key === undefined ||
4108+ ( ( key && typeof key === "string" ) && value === undefined ) ) {
4109+
4110+ return this.get( owner, key );
4111+ }
4112+
4113+ // When the key is not a string, or both a key and value
4114+ // are specified, set or extend (existing objects) with either:
4115+ //
4116+ // 1. An object of properties
4117+ // 2. A key and value
4118+ //
4119+ this.set( owner, key, value );
4120+
4121+ // Since the "set" path can have two possible entry points
4122+ // return the expected data based on which path was taken[*]
4123+ return value !== undefined ? value : key;
4124+ },
4125+ remove: function( owner, key ) {
4126+ var i,
4127+ cache = owner[ this.expando ];
4128+
4129+ if ( cache === undefined ) {
4130+ return;
4131+ }
4132+
4133+ if ( key !== undefined ) {
4134+
4135+ // Support array or space separated string of keys
4136+ if ( Array.isArray( key ) ) {
4137+
4138+ // If key is an array of keys...
4139+ // We always set camelCase keys, so remove that.
4140+ key = key.map( camelCase );
4141+ } else {
4142+ key = camelCase( key );
4143+
4144+ // If a key with the spaces exists, use it.
4145+ // Otherwise, create an array by matching non-whitespace
4146+ key = key in cache ?
4147+ [ key ] :
4148+ ( key.match( rnothtmlwhite ) || [] );
4149+ }
4150+
4151+ i = key.length;
4152+
4153+ while ( i-- ) {
4154+ delete cache[ key[ i ] ];
4155+ }
4156+ }
4157+
4158+ // Remove the expando if there's no more data
4159+ if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
4160+
4161+ // Support: Chrome <=35 - 45
4162+ // Webkit & Blink performance suffers when deleting properties
4163+ // from DOM nodes, so set to undefined instead
4164+ // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
4165+ if ( owner.nodeType ) {
4166+ owner[ this.expando ] = undefined;
4167+ } else {
4168+ delete owner[ this.expando ];
4169+ }
4170+ }
4171+ },
4172+ hasData: function( owner ) {
4173+ var cache = owner[ this.expando ];
4174+ return cache !== undefined && !jQuery.isEmptyObject( cache );
4175+ }
4176+};
4177+var dataPriv = new Data();
4178+
4179+var dataUser = new Data();
4180+
4181+
4182+
4183+// Implementation Summary
4184+//
4185+// 1. Enforce API surface and semantic compatibility with 1.9.x branch
4186+// 2. Improve the module's maintainability by reducing the storage
4187+// paths to a single mechanism.
4188+// 3. Use the same single mechanism to support "private" and "user" data.
4189+// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
4190+// 5. Avoid exposing implementation details on user objects (eg. expando properties)
4191+// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
4192+
4193+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
4194+ rmultiDash = /[A-Z]/g;
4195+
4196+function getData( data ) {
4197+ if ( data === "true" ) {
4198+ return true;
4199+ }
4200+
4201+ if ( data === "false" ) {
4202+ return false;
4203+ }
4204+
4205+ if ( data === "null" ) {
4206+ return null;
4207+ }
4208+
4209+ // Only convert to a number if it doesn't change the string
4210+ if ( data === +data + "" ) {
4211+ return +data;
4212+ }
4213+
4214+ if ( rbrace.test( data ) ) {
4215+ return JSON.parse( data );
4216+ }
4217+
4218+ return data;
4219+}
4220+
4221+function dataAttr( elem, key, data ) {
4222+ var name;
4223+
4224+ // If nothing was found internally, try to fetch any
4225+ // data from the HTML5 data-* attribute
4226+ if ( data === undefined && elem.nodeType === 1 ) {
4227+ name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
4228+ data = elem.getAttribute( name );
4229+
4230+ if ( typeof data === "string" ) {
4231+ try {
4232+ data = getData( data );
4233+ } catch ( e ) {}
4234+
4235+ // Make sure we set the data so it isn't changed later
4236+ dataUser.set( elem, key, data );
4237+ } else {
4238+ data = undefined;
4239+ }
4240+ }
4241+ return data;
4242+}
4243+
4244+jQuery.extend( {
4245+ hasData: function( elem ) {
4246+ return dataUser.hasData( elem ) || dataPriv.hasData( elem );
4247+ },
4248+
4249+ data: function( elem, name, data ) {
4250+ return dataUser.access( elem, name, data );
4251+ },
4252+
4253+ removeData: function( elem, name ) {
4254+ dataUser.remove( elem, name );
4255+ },
4256+
4257+ // TODO: Now that all calls to _data and _removeData have been replaced
4258+ // with direct calls to dataPriv methods, these can be deprecated.
4259+ _data: function( elem, name, data ) {
4260+ return dataPriv.access( elem, name, data );
4261+ },
4262+
4263+ _removeData: function( elem, name ) {
4264+ dataPriv.remove( elem, name );
4265+ }
4266+} );
4267+
4268+jQuery.fn.extend( {
4269+ data: function( key, value ) {
4270+ var i, name, data,
4271+ elem = this[ 0 ],
4272+ attrs = elem && elem.attributes;
4273+
4274+ // Gets all values
4275+ if ( key === undefined ) {
4276+ if ( this.length ) {
4277+ data = dataUser.get( elem );
4278+
4279+ if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
4280+ i = attrs.length;
4281+ while ( i-- ) {
4282+
4283+ // Support: IE 11 only
4284+ // The attrs elements can be null (#14894)
4285+ if ( attrs[ i ] ) {
4286+ name = attrs[ i ].name;
4287+ if ( name.indexOf( "data-" ) === 0 ) {
4288+ name = camelCase( name.slice( 5 ) );
4289+ dataAttr( elem, name, data[ name ] );
4290+ }
4291+ }
4292+ }
4293+ dataPriv.set( elem, "hasDataAttrs", true );
4294+ }
4295+ }
4296+
4297+ return data;
4298+ }
4299+
4300+ // Sets multiple values
4301+ if ( typeof key === "object" ) {
4302+ return this.each( function() {
4303+ dataUser.set( this, key );
4304+ } );
4305+ }
4306+
4307+ return access( this, function( value ) {
4308+ var data;
4309+
4310+ // The calling jQuery object (element matches) is not empty
4311+ // (and therefore has an element appears at this[ 0 ]) and the
4312+ // `value` parameter was not undefined. An empty jQuery object
4313+ // will result in `undefined` for elem = this[ 0 ] which will
4314+ // throw an exception if an attempt to read a data cache is made.
4315+ if ( elem && value === undefined ) {
4316+
4317+ // Attempt to get data from the cache
4318+ // The key will always be camelCased in Data
4319+ data = dataUser.get( elem, key );
4320+ if ( data !== undefined ) {
4321+ return data;
4322+ }
4323+
4324+ // Attempt to "discover" the data in
4325+ // HTML5 custom data-* attrs
4326+ data = dataAttr( elem, key );
4327+ if ( data !== undefined ) {
4328+ return data;
4329+ }
4330+
4331+ // We tried really hard, but the data doesn't exist.
4332+ return;
4333+ }
4334+
4335+ // Set the data...
4336+ this.each( function() {
4337+
4338+ // We always store the camelCased key
4339+ dataUser.set( this, key, value );
4340+ } );
4341+ }, null, value, arguments.length > 1, null, true );
4342+ },
4343+
4344+ removeData: function( key ) {
4345+ return this.each( function() {
4346+ dataUser.remove( this, key );
4347+ } );
4348+ }
4349+} );
4350+
4351+
4352+jQuery.extend( {
4353+ queue: function( elem, type, data ) {
4354+ var queue;
4355+
4356+ if ( elem ) {
4357+ type = ( type || "fx" ) + "queue";
4358+ queue = dataPriv.get( elem, type );
4359+
4360+ // Speed up dequeue by getting out quickly if this is just a lookup
4361+ if ( data ) {
4362+ if ( !queue || Array.isArray( data ) ) {
4363+ queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
4364+ } else {
4365+ queue.push( data );
4366+ }
4367+ }
4368+ return queue || [];
4369+ }
4370+ },
4371+
4372+ dequeue: function( elem, type ) {
4373+ type = type || "fx";
4374+
4375+ var queue = jQuery.queue( elem, type ),
4376+ startLength = queue.length,
4377+ fn = queue.shift(),
4378+ hooks = jQuery._queueHooks( elem, type ),
4379+ next = function() {
4380+ jQuery.dequeue( elem, type );
4381+ };
4382+
4383+ // If the fx queue is dequeued, always remove the progress sentinel
4384+ if ( fn === "inprogress" ) {
4385+ fn = queue.shift();
4386+ startLength--;
4387+ }
4388+
4389+ if ( fn ) {
4390+
4391+ // Add a progress sentinel to prevent the fx queue from being
4392+ // automatically dequeued
4393+ if ( type === "fx" ) {
4394+ queue.unshift( "inprogress" );
4395+ }
4396+
4397+ // Clear up the last queue stop function
4398+ delete hooks.stop;
4399+ fn.call( elem, next, hooks );
4400+ }
4401+
4402+ if ( !startLength && hooks ) {
4403+ hooks.empty.fire();
4404+ }
4405+ },
4406+
4407+ // Not public - generate a queueHooks object, or return the current one
4408+ _queueHooks: function( elem, type ) {
4409+ var key = type + "queueHooks";
4410+ return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
4411+ empty: jQuery.Callbacks( "once memory" ).add( function() {
4412+ dataPriv.remove( elem, [ type + "queue", key ] );
4413+ } )
4414+ } );
4415+ }
4416+} );
4417+
4418+jQuery.fn.extend( {
4419+ queue: function( type, data ) {
4420+ var setter = 2;
4421+
4422+ if ( typeof type !== "string" ) {
4423+ data = type;
4424+ type = "fx";
4425+ setter--;
4426+ }
4427+
4428+ if ( arguments.length < setter ) {
4429+ return jQuery.queue( this[ 0 ], type );
4430+ }
4431+
4432+ return data === undefined ?
4433+ this :
4434+ this.each( function() {
4435+ var queue = jQuery.queue( this, type, data );
4436+
4437+ // Ensure a hooks for this queue
4438+ jQuery._queueHooks( this, type );
4439+
4440+ if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
4441+ jQuery.dequeue( this, type );
4442+ }
4443+ } );
4444+ },
4445+ dequeue: function( type ) {
4446+ return this.each( function() {
4447+ jQuery.dequeue( this, type );
4448+ } );
4449+ },
4450+ clearQueue: function( type ) {
4451+ return this.queue( type || "fx", [] );
4452+ },
4453+
4454+ // Get a promise resolved when queues of a certain type
4455+ // are emptied (fx is the type by default)
4456+ promise: function( type, obj ) {
4457+ var tmp,
4458+ count = 1,
4459+ defer = jQuery.Deferred(),
4460+ elements = this,
4461+ i = this.length,
4462+ resolve = function() {
4463+ if ( !( --count ) ) {
4464+ defer.resolveWith( elements, [ elements ] );
4465+ }
4466+ };
4467+
4468+ if ( typeof type !== "string" ) {
4469+ obj = type;
4470+ type = undefined;
4471+ }
4472+ type = type || "fx";
4473+
4474+ while ( i-- ) {
4475+ tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
4476+ if ( tmp && tmp.empty ) {
4477+ count++;
4478+ tmp.empty.add( resolve );
4479+ }
4480+ }
4481+ resolve();
4482+ return defer.promise( obj );
4483+ }
4484+} );
4485+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
4486+
4487+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
4488+
4489+
4490+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4491+
4492+var documentElement = document.documentElement;
4493+
4494+
4495+
4496+ var isAttached = function( elem ) {
4497+ return jQuery.contains( elem.ownerDocument, elem );
4498+ },
4499+ composed = { composed: true };
4500+
4501+ // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
4502+ // Check attachment across shadow DOM boundaries when possible (gh-3504)
4503+ // Support: iOS 10.0-10.2 only
4504+ // Early iOS 10 versions support `attachShadow` but not `getRootNode`,
4505+ // leading to errors. We need to check for `getRootNode`.
4506+ if ( documentElement.getRootNode ) {
4507+ isAttached = function( elem ) {
4508+ return jQuery.contains( elem.ownerDocument, elem ) ||
4509+ elem.getRootNode( composed ) === elem.ownerDocument;
4510+ };
4511+ }
4512+var isHiddenWithinTree = function( elem, el ) {
4513+
4514+ // isHiddenWithinTree might be called from jQuery#filter function;
4515+ // in that case, element will be second argument
4516+ elem = el || elem;
4517+
4518+ // Inline style trumps all
4519+ return elem.style.display === "none" ||
4520+ elem.style.display === "" &&
4521+
4522+ // Otherwise, check computed style
4523+ // Support: Firefox <=43 - 45
4524+ // Disconnected elements can have computed display: none, so first confirm that elem is
4525+ // in the document.
4526+ isAttached( elem ) &&
4527+
4528+ jQuery.css( elem, "display" ) === "none";
4529+ };
4530+
4531+var swap = function( elem, options, callback, args ) {
4532+ var ret, name,
4533+ old = {};
4534+
4535+ // Remember the old values, and insert the new ones
4536+ for ( name in options ) {
4537+ old[ name ] = elem.style[ name ];
4538+ elem.style[ name ] = options[ name ];
4539+ }
4540+
4541+ ret = callback.apply( elem, args || [] );
4542+
4543+ // Revert the old values
4544+ for ( name in options ) {
4545+ elem.style[ name ] = old[ name ];
4546+ }
4547+
4548+ return ret;
4549+};
4550+
4551+
4552+
4553+
4554+function adjustCSS( elem, prop, valueParts, tween ) {
4555+ var adjusted, scale,
4556+ maxIterations = 20,
4557+ currentValue = tween ?
4558+ function() {
4559+ return tween.cur();
4560+ } :
4561+ function() {
4562+ return jQuery.css( elem, prop, "" );
4563+ },
4564+ initial = currentValue(),
4565+ unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
4566+
4567+ // Starting value computation is required for potential unit mismatches
4568+ initialInUnit = elem.nodeType &&
4569+ ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4570+ rcssNum.exec( jQuery.css( elem, prop ) );
4571+
4572+ if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
4573+
4574+ // Support: Firefox <=54
4575+ // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
4576+ initial = initial / 2;
4577+
4578+ // Trust units reported by jQuery.css
4579+ unit = unit || initialInUnit[ 3 ];
4580+
4581+ // Iteratively approximate from a nonzero starting point
4582+ initialInUnit = +initial || 1;
4583+
4584+ while ( maxIterations-- ) {
4585+
4586+ // Evaluate and update our best guess (doubling guesses that zero out).
4587+ // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
4588+ jQuery.style( elem, prop, initialInUnit + unit );
4589+ if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
4590+ maxIterations = 0;
4591+ }
4592+ initialInUnit = initialInUnit / scale;
4593+
4594+ }
4595+
4596+ initialInUnit = initialInUnit * 2;
4597+ jQuery.style( elem, prop, initialInUnit + unit );
4598+
4599+ // Make sure we update the tween properties later on
4600+ valueParts = valueParts || [];
4601+ }
4602+
4603+ if ( valueParts ) {
4604+ initialInUnit = +initialInUnit || +initial || 0;
4605+
4606+ // Apply relative offset (+=/-=) if specified
4607+ adjusted = valueParts[ 1 ] ?
4608+ initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
4609+ +valueParts[ 2 ];
4610+ if ( tween ) {
4611+ tween.unit = unit;
4612+ tween.start = initialInUnit;
4613+ tween.end = adjusted;
4614+ }
4615+ }
4616+ return adjusted;
4617+}
4618+
4619+
4620+var defaultDisplayMap = {};
4621+
4622+function getDefaultDisplay( elem ) {
4623+ var temp,
4624+ doc = elem.ownerDocument,
4625+ nodeName = elem.nodeName,
4626+ display = defaultDisplayMap[ nodeName ];
4627+
4628+ if ( display ) {
4629+ return display;
4630+ }
4631+
4632+ temp = doc.body.appendChild( doc.createElement( nodeName ) );
4633+ display = jQuery.css( temp, "display" );
4634+
4635+ temp.parentNode.removeChild( temp );
4636+
4637+ if ( display === "none" ) {
4638+ display = "block";
4639+ }
4640+ defaultDisplayMap[ nodeName ] = display;
4641+
4642+ return display;
4643+}
4644+
4645+function showHide( elements, show ) {
4646+ var display, elem,
4647+ values = [],
4648+ index = 0,
4649+ length = elements.length;
4650+
4651+ // Determine new display value for elements that need to change
4652+ for ( ; index < length; index++ ) {
4653+ elem = elements[ index ];
4654+ if ( !elem.style ) {
4655+ continue;
4656+ }
4657+
4658+ display = elem.style.display;
4659+ if ( show ) {
4660+
4661+ // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
4662+ // check is required in this first loop unless we have a nonempty display value (either
4663+ // inline or about-to-be-restored)
4664+ if ( display === "none" ) {
4665+ values[ index ] = dataPriv.get( elem, "display" ) || null;
4666+ if ( !values[ index ] ) {
4667+ elem.style.display = "";
4668+ }
4669+ }
4670+ if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
4671+ values[ index ] = getDefaultDisplay( elem );
4672+ }
4673+ } else {
4674+ if ( display !== "none" ) {
4675+ values[ index ] = "none";
4676+
4677+ // Remember what we're overwriting
4678+ dataPriv.set( elem, "display", display );
4679+ }
4680+ }
4681+ }
4682+
4683+ // Set the display of the elements in a second loop to avoid constant reflow
4684+ for ( index = 0; index < length; index++ ) {
4685+ if ( values[ index ] != null ) {
4686+ elements[ index ].style.display = values[ index ];
4687+ }
4688+ }
4689+
4690+ return elements;
4691+}
4692+
4693+jQuery.fn.extend( {
4694+ show: function() {
4695+ return showHide( this, true );
4696+ },
4697+ hide: function() {
4698+ return showHide( this );
4699+ },
4700+ toggle: function( state ) {
4701+ if ( typeof state === "boolean" ) {
4702+ return state ? this.show() : this.hide();
4703+ }
4704+
4705+ return this.each( function() {
4706+ if ( isHiddenWithinTree( this ) ) {
4707+ jQuery( this ).show();
4708+ } else {
4709+ jQuery( this ).hide();
4710+ }
4711+ } );
4712+ }
4713+} );
4714+var rcheckableType = ( /^(?:checkbox|radio)$/i );
4715+
4716+var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
4717+
4718+var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
4719+
4720+
4721+
4722+// We have to close these tags to support XHTML (#13200)
4723+var wrapMap = {
4724+
4725+ // Support: IE <=9 only
4726+ option: [ 1, "<select multiple='multiple'>", "</select>" ],
4727+
4728+ // XHTML parsers do not magically insert elements in the
4729+ // same way that tag soup parsers do. So we cannot shorten
4730+ // this by omitting <tbody> or other required elements.
4731+ thead: [ 1, "<table>", "</table>" ],
4732+ col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
4733+ tr: [ 2, "<table><tbody>", "</tbody></table>" ],
4734+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
4735+
4736+ _default: [ 0, "", "" ]
4737+};
4738+
4739+// Support: IE <=9 only
4740+wrapMap.optgroup = wrapMap.option;
4741+
4742+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4743+wrapMap.th = wrapMap.td;
4744+
4745+
4746+function getAll( context, tag ) {
4747+
4748+ // Support: IE <=9 - 11 only
4749+ // Use typeof to avoid zero-argument method invocation on host objects (#15151)
4750+ var ret;
4751+
4752+ if ( typeof context.getElementsByTagName !== "undefined" ) {
4753+ ret = context.getElementsByTagName( tag || "*" );
4754+
4755+ } else if ( typeof context.querySelectorAll !== "undefined" ) {
4756+ ret = context.querySelectorAll( tag || "*" );
4757+
4758+ } else {
4759+ ret = [];
4760+ }
4761+
4762+ if ( tag === undefined || tag && nodeName( context, tag ) ) {
4763+ return jQuery.merge( [ context ], ret );
4764+ }
4765+
4766+ return ret;
4767+}
4768+
4769+
4770+// Mark scripts as having already been evaluated
4771+function setGlobalEval( elems, refElements ) {
4772+ var i = 0,
4773+ l = elems.length;
4774+
4775+ for ( ; i < l; i++ ) {
4776+ dataPriv.set(
4777+ elems[ i ],
4778+ "globalEval",
4779+ !refElements || dataPriv.get( refElements[ i ], "globalEval" )
4780+ );
4781+ }
4782+}
4783+
4784+
4785+var rhtml = /<|&#?\w+;/;
4786+
4787+function buildFragment( elems, context, scripts, selection, ignored ) {
4788+ var elem, tmp, tag, wrap, attached, j,
4789+ fragment = context.createDocumentFragment(),
4790+ nodes = [],
4791+ i = 0,
4792+ l = elems.length;
4793+
4794+ for ( ; i < l; i++ ) {
4795+ elem = elems[ i ];
4796+
4797+ if ( elem || elem === 0 ) {
4798+
4799+ // Add nodes directly
4800+ if ( toType( elem ) === "object" ) {
4801+
4802+ // Support: Android <=4.0 only, PhantomJS 1 only
4803+ // push.apply(_, arraylike) throws on ancient WebKit
4804+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
4805+
4806+ // Convert non-html into a text node
4807+ } else if ( !rhtml.test( elem ) ) {
4808+ nodes.push( context.createTextNode( elem ) );
4809+
4810+ // Convert html into DOM nodes
4811+ } else {
4812+ tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
4813+
4814+ // Deserialize a standard representation
4815+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
4816+ wrap = wrapMap[ tag ] || wrapMap._default;
4817+ tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
4818+
4819+ // Descend through wrappers to the right content
4820+ j = wrap[ 0 ];
4821+ while ( j-- ) {
4822+ tmp = tmp.lastChild;
4823+ }
4824+
4825+ // Support: Android <=4.0 only, PhantomJS 1 only
4826+ // push.apply(_, arraylike) throws on ancient WebKit
4827+ jQuery.merge( nodes, tmp.childNodes );
4828+
4829+ // Remember the top-level container
4830+ tmp = fragment.firstChild;
4831+
4832+ // Ensure the created nodes are orphaned (#12392)
4833+ tmp.textContent = "";
4834+ }
4835+ }
4836+ }
4837+
4838+ // Remove wrapper from fragment
4839+ fragment.textContent = "";
4840+
4841+ i = 0;
4842+ while ( ( elem = nodes[ i++ ] ) ) {
4843+
4844+ // Skip elements already in the context collection (trac-4087)
4845+ if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
4846+ if ( ignored ) {
4847+ ignored.push( elem );
4848+ }
4849+ continue;
4850+ }
4851+
4852+ attached = isAttached( elem );
4853+
4854+ // Append to fragment
4855+ tmp = getAll( fragment.appendChild( elem ), "script" );
4856+
4857+ // Preserve script evaluation history
4858+ if ( attached ) {
4859+ setGlobalEval( tmp );
4860+ }
4861+
4862+ // Capture executables
4863+ if ( scripts ) {
4864+ j = 0;
4865+ while ( ( elem = tmp[ j++ ] ) ) {
4866+ if ( rscriptType.test( elem.type || "" ) ) {
4867+ scripts.push( elem );
4868+ }
4869+ }
4870+ }
4871+ }
4872+
4873+ return fragment;
4874+}
4875+
4876+
4877+( function() {
4878+ var fragment = document.createDocumentFragment(),
4879+ div = fragment.appendChild( document.createElement( "div" ) ),
4880+ input = document.createElement( "input" );
4881+
4882+ // Support: Android 4.0 - 4.3 only
4883+ // Check state lost if the name is set (#11217)
4884+ // Support: Windows Web Apps (WWA)
4885+ // `name` and `type` must use .setAttribute for WWA (#14901)
4886+ input.setAttribute( "type", "radio" );
4887+ input.setAttribute( "checked", "checked" );
4888+ input.setAttribute( "name", "t" );
4889+
4890+ div.appendChild( input );
4891+
4892+ // Support: Android <=4.1 only
4893+ // Older WebKit doesn't clone checked state correctly in fragments
4894+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4895+
4896+ // Support: IE <=11 only
4897+ // Make sure textarea (and checkbox) defaultValue is properly cloned
4898+ div.innerHTML = "<textarea>x</textarea>";
4899+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4900+} )();
4901+
4902+
4903+var
4904+ rkeyEvent = /^key/,
4905+ rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
4906+ rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
4907+
4908+function returnTrue() {
4909+ return true;
4910+}
4911+
4912+function returnFalse() {
4913+ return false;
4914+}
4915+
4916+// Support: IE <=9 - 11+
4917+// focus() and blur() are asynchronous, except when they are no-op.
4918+// So expect focus to be synchronous when the element is already active,
4919+// and blur to be synchronous when the element is not already active.
4920+// (focus and blur are always synchronous in other supported browsers,
4921+// this just defines when we can count on it).
4922+function expectSync( elem, type ) {
4923+ return ( elem === safeActiveElement() ) === ( type === "focus" );
4924+}
4925+
4926+// Support: IE <=9 only
4927+// Accessing document.activeElement can throw unexpectedly
4928+// https://bugs.jquery.com/ticket/13393
4929+function safeActiveElement() {
4930+ try {
4931+ return document.activeElement;
4932+ } catch ( err ) { }
4933+}
4934+
4935+function on( elem, types, selector, data, fn, one ) {
4936+ var origFn, type;
4937+
4938+ // Types can be a map of types/handlers
4939+ if ( typeof types === "object" ) {
4940+
4941+ // ( types-Object, selector, data )
4942+ if ( typeof selector !== "string" ) {
4943+
4944+ // ( types-Object, data )
4945+ data = data || selector;
4946+ selector = undefined;
4947+ }
4948+ for ( type in types ) {
4949+ on( elem, type, selector, data, types[ type ], one );
4950+ }
4951+ return elem;
4952+ }
4953+
4954+ if ( data == null && fn == null ) {
4955+
4956+ // ( types, fn )
4957+ fn = selector;
4958+ data = selector = undefined;
4959+ } else if ( fn == null ) {
4960+ if ( typeof selector === "string" ) {
4961+
4962+ // ( types, selector, fn )
4963+ fn = data;
4964+ data = undefined;
4965+ } else {
4966+
4967+ // ( types, data, fn )
4968+ fn = data;
4969+ data = selector;
4970+ selector = undefined;
4971+ }
4972+ }
4973+ if ( fn === false ) {
4974+ fn = returnFalse;
4975+ } else if ( !fn ) {
4976+ return elem;
4977+ }
4978+
4979+ if ( one === 1 ) {
4980+ origFn = fn;
4981+ fn = function( event ) {
4982+
4983+ // Can use an empty set, since event contains the info
4984+ jQuery().off( event );
4985+ return origFn.apply( this, arguments );
4986+ };
4987+
4988+ // Use same guid so caller can remove using origFn
4989+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
4990+ }
4991+ return elem.each( function() {
4992+ jQuery.event.add( this, types, fn, data, selector );
4993+ } );
4994+}
4995+
4996+/*
4997+ * Helper functions for managing events -- not part of the public interface.
4998+ * Props to Dean Edwards' addEvent library for many of the ideas.
4999+ */
5000+jQuery.event = {
5001+
5002+ global: {},
5003+
5004+ add: function( elem, types, handler, data, selector ) {
5005+
5006+ var handleObjIn, eventHandle, tmp,
5007+ events, t, handleObj,
5008+ special, handlers, type, namespaces, origType,
5009+ elemData = dataPriv.get( elem );
5010+
5011+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
5012+ if ( !elemData ) {
5013+ return;
5014+ }
5015+
5016+ // Caller can pass in an object of custom data in lieu of the handler
5017+ if ( handler.handler ) {
5018+ handleObjIn = handler;
5019+ handler = handleObjIn.handler;
5020+ selector = handleObjIn.selector;
5021+ }
5022+
5023+ // Ensure that invalid selectors throw exceptions at attach time
5024+ // Evaluate against documentElement in case elem is a non-element node (e.g., document)
5025+ if ( selector ) {
5026+ jQuery.find.matchesSelector( documentElement, selector );
5027+ }
5028+
5029+ // Make sure that the handler has a unique ID, used to find/remove it later
5030+ if ( !handler.guid ) {
5031+ handler.guid = jQuery.guid++;
5032+ }
5033+
5034+ // Init the element's event structure and main handler, if this is the first
5035+ if ( !( events = elemData.events ) ) {
5036+ events = elemData.events = {};
5037+ }
5038+ if ( !( eventHandle = elemData.handle ) ) {
5039+ eventHandle = elemData.handle = function( e ) {
5040+
5041+ // Discard the second event of a jQuery.event.trigger() and
5042+ // when an event is called after a page has unloaded
5043+ return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
5044+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
5045+ };
5046+ }
5047+
5048+ // Handle multiple events separated by a space
5049+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5050+ t = types.length;
5051+ while ( t-- ) {
5052+ tmp = rtypenamespace.exec( types[ t ] ) || [];
5053+ type = origType = tmp[ 1 ];
5054+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5055+
5056+ // There *must* be a type, no attaching namespace-only handlers
5057+ if ( !type ) {
5058+ continue;
5059+ }
5060+
5061+ // If event changes its type, use the special event handlers for the changed type
5062+ special = jQuery.event.special[ type ] || {};
5063+
5064+ // If selector defined, determine special event api type, otherwise given type
5065+ type = ( selector ? special.delegateType : special.bindType ) || type;
5066+
5067+ // Update special based on newly reset type
5068+ special = jQuery.event.special[ type ] || {};
5069+
5070+ // handleObj is passed to all event handlers
5071+ handleObj = jQuery.extend( {
5072+ type: type,
5073+ origType: origType,
5074+ data: data,
5075+ handler: handler,
5076+ guid: handler.guid,
5077+ selector: selector,
5078+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
5079+ namespace: namespaces.join( "." )
5080+ }, handleObjIn );
5081+
5082+ // Init the event handler queue if we're the first
5083+ if ( !( handlers = events[ type ] ) ) {
5084+ handlers = events[ type ] = [];
5085+ handlers.delegateCount = 0;
5086+
5087+ // Only use addEventListener if the special events handler returns false
5088+ if ( !special.setup ||
5089+ special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
5090+
5091+ if ( elem.addEventListener ) {
5092+ elem.addEventListener( type, eventHandle );
5093+ }
5094+ }
5095+ }
5096+
5097+ if ( special.add ) {
5098+ special.add.call( elem, handleObj );
5099+
5100+ if ( !handleObj.handler.guid ) {
5101+ handleObj.handler.guid = handler.guid;
5102+ }
5103+ }
5104+
5105+ // Add to the element's handler list, delegates in front
5106+ if ( selector ) {
5107+ handlers.splice( handlers.delegateCount++, 0, handleObj );
5108+ } else {
5109+ handlers.push( handleObj );
5110+ }
5111+
5112+ // Keep track of which events have ever been used, for event optimization
5113+ jQuery.event.global[ type ] = true;
5114+ }
5115+
5116+ },
5117+
5118+ // Detach an event or set of events from an element
5119+ remove: function( elem, types, handler, selector, mappedTypes ) {
5120+
5121+ var j, origCount, tmp,
5122+ events, t, handleObj,
5123+ special, handlers, type, namespaces, origType,
5124+ elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
5125+
5126+ if ( !elemData || !( events = elemData.events ) ) {
5127+ return;
5128+ }
5129+
5130+ // Once for each type.namespace in types; type may be omitted
5131+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5132+ t = types.length;
5133+ while ( t-- ) {
5134+ tmp = rtypenamespace.exec( types[ t ] ) || [];
5135+ type = origType = tmp[ 1 ];
5136+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5137+
5138+ // Unbind all events (on this namespace, if provided) for the element
5139+ if ( !type ) {
5140+ for ( type in events ) {
5141+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
5142+ }
5143+ continue;
5144+ }
5145+
5146+ special = jQuery.event.special[ type ] || {};
5147+ type = ( selector ? special.delegateType : special.bindType ) || type;
5148+ handlers = events[ type ] || [];
5149+ tmp = tmp[ 2 ] &&
5150+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
5151+
5152+ // Remove matching events
5153+ origCount = j = handlers.length;
5154+ while ( j-- ) {
5155+ handleObj = handlers[ j ];
5156+
5157+ if ( ( mappedTypes || origType === handleObj.origType ) &&
5158+ ( !handler || handler.guid === handleObj.guid ) &&
5159+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
5160+ ( !selector || selector === handleObj.selector ||
5161+ selector === "**" && handleObj.selector ) ) {
5162+ handlers.splice( j, 1 );
5163+
5164+ if ( handleObj.selector ) {
5165+ handlers.delegateCount--;
5166+ }
5167+ if ( special.remove ) {
5168+ special.remove.call( elem, handleObj );
5169+ }
5170+ }
5171+ }
5172+
5173+ // Remove generic event handler if we removed something and no more handlers exist
5174+ // (avoids potential for endless recursion during removal of special event handlers)
5175+ if ( origCount && !handlers.length ) {
5176+ if ( !special.teardown ||
5177+ special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
5178+
5179+ jQuery.removeEvent( elem, type, elemData.handle );
5180+ }
5181+
5182+ delete events[ type ];
5183+ }
5184+ }
5185+
5186+ // Remove data and the expando if it's no longer used
5187+ if ( jQuery.isEmptyObject( events ) ) {
5188+ dataPriv.remove( elem, "handle events" );
5189+ }
5190+ },
5191+
5192+ dispatch: function( nativeEvent ) {
5193+
5194+ // Make a writable jQuery.Event from the native event object
5195+ var event = jQuery.event.fix( nativeEvent );
5196+
5197+ var i, j, ret, matched, handleObj, handlerQueue,
5198+ args = new Array( arguments.length ),
5199+ handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
5200+ special = jQuery.event.special[ event.type ] || {};
5201+
5202+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
5203+ args[ 0 ] = event;
5204+
5205+ for ( i = 1; i < arguments.length; i++ ) {
5206+ args[ i ] = arguments[ i ];
5207+ }
5208+
5209+ event.delegateTarget = this;
5210+
5211+ // Call the preDispatch hook for the mapped type, and let it bail if desired
5212+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
5213+ return;
5214+ }
5215+
5216+ // Determine handlers
5217+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
5218+
5219+ // Run delegates first; they may want to stop propagation beneath us
5220+ i = 0;
5221+ while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
5222+ event.currentTarget = matched.elem;
5223+
5224+ j = 0;
5225+ while ( ( handleObj = matched.handlers[ j++ ] ) &&
5226+ !event.isImmediatePropagationStopped() ) {
5227+
5228+ // If the event is namespaced, then each handler is only invoked if it is
5229+ // specially universal or its namespaces are a superset of the event's.
5230+ if ( !event.rnamespace || handleObj.namespace === false ||
5231+ event.rnamespace.test( handleObj.namespace ) ) {
5232+
5233+ event.handleObj = handleObj;
5234+ event.data = handleObj.data;
5235+
5236+ ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
5237+ handleObj.handler ).apply( matched.elem, args );
5238+
5239+ if ( ret !== undefined ) {
5240+ if ( ( event.result = ret ) === false ) {
5241+ event.preventDefault();
5242+ event.stopPropagation();
5243+ }
5244+ }
5245+ }
5246+ }
5247+ }
5248+
5249+ // Call the postDispatch hook for the mapped type
5250+ if ( special.postDispatch ) {
5251+ special.postDispatch.call( this, event );
5252+ }
5253+
5254+ return event.result;
5255+ },
5256+
5257+ handlers: function( event, handlers ) {
5258+ var i, handleObj, sel, matchedHandlers, matchedSelectors,
5259+ handlerQueue = [],
5260+ delegateCount = handlers.delegateCount,
5261+ cur = event.target;
5262+
5263+ // Find delegate handlers
5264+ if ( delegateCount &&
5265+
5266+ // Support: IE <=9
5267+ // Black-hole SVG <use> instance trees (trac-13180)
5268+ cur.nodeType &&
5269+
5270+ // Support: Firefox <=42
5271+ // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
5272+ // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
5273+ // Support: IE 11 only
5274+ // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
5275+ !( event.type === "click" && event.button >= 1 ) ) {
5276+
5277+ for ( ; cur !== this; cur = cur.parentNode || this ) {
5278+
5279+ // Don't check non-elements (#13208)
5280+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5281+ if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
5282+ matchedHandlers = [];
5283+ matchedSelectors = {};
5284+ for ( i = 0; i < delegateCount; i++ ) {
5285+ handleObj = handlers[ i ];
5286+
5287+ // Don't conflict with Object.prototype properties (#13203)
5288+ sel = handleObj.selector + " ";
5289+
5290+ if ( matchedSelectors[ sel ] === undefined ) {
5291+ matchedSelectors[ sel ] = handleObj.needsContext ?
5292+ jQuery( sel, this ).index( cur ) > -1 :
5293+ jQuery.find( sel, this, null, [ cur ] ).length;
5294+ }
5295+ if ( matchedSelectors[ sel ] ) {
5296+ matchedHandlers.push( handleObj );
5297+ }
5298+ }
5299+ if ( matchedHandlers.length ) {
5300+ handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
5301+ }
5302+ }
5303+ }
5304+ }
5305+
5306+ // Add the remaining (directly-bound) handlers
5307+ cur = this;
5308+ if ( delegateCount < handlers.length ) {
5309+ handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
5310+ }
5311+
5312+ return handlerQueue;
5313+ },
5314+
5315+ addProp: function( name, hook ) {
5316+ Object.defineProperty( jQuery.Event.prototype, name, {
5317+ enumerable: true,
5318+ configurable: true,
5319+
5320+ get: isFunction( hook ) ?
5321+ function() {
5322+ if ( this.originalEvent ) {
5323+ return hook( this.originalEvent );
5324+ }
5325+ } :
5326+ function() {
5327+ if ( this.originalEvent ) {
5328+ return this.originalEvent[ name ];
5329+ }
5330+ },
5331+
5332+ set: function( value ) {
5333+ Object.defineProperty( this, name, {
5334+ enumerable: true,
5335+ configurable: true,
5336+ writable: true,
5337+ value: value
5338+ } );
5339+ }
5340+ } );
5341+ },
5342+
5343+ fix: function( originalEvent ) {
5344+ return originalEvent[ jQuery.expando ] ?
5345+ originalEvent :
5346+ new jQuery.Event( originalEvent );
5347+ },
5348+
5349+ special: {
5350+ load: {
5351+
5352+ // Prevent triggered image.load events from bubbling to window.load
5353+ noBubble: true
5354+ },
5355+ click: {
5356+
5357+ // Utilize native event to ensure correct state for checkable inputs
5358+ setup: function( data ) {
5359+
5360+ // For mutual compressibility with _default, replace `this` access with a local var.
5361+ // `|| data` is dead code meant only to preserve the variable through minification.
5362+ var el = this || data;
5363+
5364+ // Claim the first handler
5365+ if ( rcheckableType.test( el.type ) &&
5366+ el.click && nodeName( el, "input" ) ) {
5367+
5368+ // dataPriv.set( el, "click", ... )
5369+ leverageNative( el, "click", returnTrue );
5370+ }
5371+
5372+ // Return false to allow normal processing in the caller
5373+ return false;
5374+ },
5375+ trigger: function( data ) {
5376+
5377+ // For mutual compressibility with _default, replace `this` access with a local var.
5378+ // `|| data` is dead code meant only to preserve the variable through minification.
5379+ var el = this || data;
5380+
5381+ // Force setup before triggering a click
5382+ if ( rcheckableType.test( el.type ) &&
5383+ el.click && nodeName( el, "input" ) ) {
5384+
5385+ leverageNative( el, "click" );
5386+ }
5387+
5388+ // Return non-false to allow normal event-path propagation
5389+ return true;
5390+ },
5391+
5392+ // For cross-browser consistency, suppress native .click() on links
5393+ // Also prevent it if we're currently inside a leveraged native-event stack
5394+ _default: function( event ) {
5395+ var target = event.target;
5396+ return rcheckableType.test( target.type ) &&
5397+ target.click && nodeName( target, "input" ) &&
5398+ dataPriv.get( target, "click" ) ||
5399+ nodeName( target, "a" );
5400+ }
5401+ },
5402+
5403+ beforeunload: {
5404+ postDispatch: function( event ) {
5405+
5406+ // Support: Firefox 20+
5407+ // Firefox doesn't alert if the returnValue field is not set.
5408+ if ( event.result !== undefined && event.originalEvent ) {
5409+ event.originalEvent.returnValue = event.result;
5410+ }
5411+ }
5412+ }
5413+ }
5414+};
5415+
5416+// Ensure the presence of an event listener that handles manually-triggered
5417+// synthetic events by interrupting progress until reinvoked in response to
5418+// *native* events that it fires directly, ensuring that state changes have
5419+// already occurred before other listeners are invoked.
5420+function leverageNative( el, type, expectSync ) {
5421+
5422+ // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
5423+ if ( !expectSync ) {
5424+ if ( dataPriv.get( el, type ) === undefined ) {
5425+ jQuery.event.add( el, type, returnTrue );
5426+ }
5427+ return;
5428+ }
5429+
5430+ // Register the controller as a special universal handler for all event namespaces
5431+ dataPriv.set( el, type, false );
5432+ jQuery.event.add( el, type, {
5433+ namespace: false,
5434+ handler: function( event ) {
5435+ var notAsync, result,
5436+ saved = dataPriv.get( this, type );
5437+
5438+ if ( ( event.isTrigger & 1 ) && this[ type ] ) {
5439+
5440+ // Interrupt processing of the outer synthetic .trigger()ed event
5441+ // Saved data should be false in such cases, but might be a leftover capture object
5442+ // from an async native handler (gh-4350)
5443+ if ( !saved.length ) {
5444+
5445+ // Store arguments for use when handling the inner native event
5446+ // There will always be at least one argument (an event object), so this array
5447+ // will not be confused with a leftover capture object.
5448+ saved = slice.call( arguments );
5449+ dataPriv.set( this, type, saved );
5450+
5451+ // Trigger the native event and capture its result
5452+ // Support: IE <=9 - 11+
5453+ // focus() and blur() are asynchronous
5454+ notAsync = expectSync( this, type );
5455+ this[ type ]();
5456+ result = dataPriv.get( this, type );
5457+ if ( saved !== result || notAsync ) {
5458+ dataPriv.set( this, type, false );
5459+ } else {
5460+ result = {};
5461+ }
5462+ if ( saved !== result ) {
5463+
5464+ // Cancel the outer synthetic event
5465+ event.stopImmediatePropagation();
5466+ event.preventDefault();
5467+ return result.value;
5468+ }
5469+
5470+ // If this is an inner synthetic event for an event with a bubbling surrogate
5471+ // (focus or blur), assume that the surrogate already propagated from triggering the
5472+ // native event and prevent that from happening again here.
5473+ // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
5474+ // bubbling surrogate propagates *after* the non-bubbling base), but that seems
5475+ // less bad than duplication.
5476+ } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
5477+ event.stopPropagation();
5478+ }
5479+
5480+ // If this is a native event triggered above, everything is now in order
5481+ // Fire an inner synthetic event with the original arguments
5482+ } else if ( saved.length ) {
5483+
5484+ // ...and capture the result
5485+ dataPriv.set( this, type, {
5486+ value: jQuery.event.trigger(
5487+
5488+ // Support: IE <=9 - 11+
5489+ // Extend with the prototype to reset the above stopImmediatePropagation()
5490+ jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
5491+ saved.slice( 1 ),
5492+ this
5493+ )
5494+ } );
5495+
5496+ // Abort handling of the native event
5497+ event.stopImmediatePropagation();
5498+ }
5499+ }
5500+ } );
5501+}
5502+
5503+jQuery.removeEvent = function( elem, type, handle ) {
5504+
5505+ // This "if" is needed for plain objects
5506+ if ( elem.removeEventListener ) {
5507+ elem.removeEventListener( type, handle );
5508+ }
5509+};
5510+
5511+jQuery.Event = function( src, props ) {
5512+
5513+ // Allow instantiation without the 'new' keyword
5514+ if ( !( this instanceof jQuery.Event ) ) {
5515+ return new jQuery.Event( src, props );
5516+ }
5517+
5518+ // Event object
5519+ if ( src && src.type ) {
5520+ this.originalEvent = src;
5521+ this.type = src.type;
5522+
5523+ // Events bubbling up the document may have been marked as prevented
5524+ // by a handler lower down the tree; reflect the correct value.
5525+ this.isDefaultPrevented = src.defaultPrevented ||
5526+ src.defaultPrevented === undefined &&
5527+
5528+ // Support: Android <=2.3 only
5529+ src.returnValue === false ?
5530+ returnTrue :
5531+ returnFalse;
5532+
5533+ // Create target properties
5534+ // Support: Safari <=6 - 7 only
5535+ // Target should not be a text node (#504, #13143)
5536+ this.target = ( src.target && src.target.nodeType === 3 ) ?
5537+ src.target.parentNode :
5538+ src.target;
5539+
5540+ this.currentTarget = src.currentTarget;
5541+ this.relatedTarget = src.relatedTarget;
5542+
5543+ // Event type
5544+ } else {
5545+ this.type = src;
5546+ }
5547+
5548+ // Put explicitly provided properties onto the event object
5549+ if ( props ) {
5550+ jQuery.extend( this, props );
5551+ }
5552+
5553+ // Create a timestamp if incoming event doesn't have one
5554+ this.timeStamp = src && src.timeStamp || Date.now();
5555+
5556+ // Mark it as fixed
5557+ this[ jQuery.expando ] = true;
5558+};
5559+
5560+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
5561+// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
5562+jQuery.Event.prototype = {
5563+ constructor: jQuery.Event,
5564+ isDefaultPrevented: returnFalse,
5565+ isPropagationStopped: returnFalse,
5566+ isImmediatePropagationStopped: returnFalse,
5567+ isSimulated: false,
5568+
5569+ preventDefault: function() {
5570+ var e = this.originalEvent;
5571+
5572+ this.isDefaultPrevented = returnTrue;
5573+
5574+ if ( e && !this.isSimulated ) {
5575+ e.preventDefault();
5576+ }
5577+ },
5578+ stopPropagation: function() {
5579+ var e = this.originalEvent;
5580+
5581+ this.isPropagationStopped = returnTrue;
5582+
5583+ if ( e && !this.isSimulated ) {
5584+ e.stopPropagation();
5585+ }
5586+ },
5587+ stopImmediatePropagation: function() {
5588+ var e = this.originalEvent;
5589+
5590+ this.isImmediatePropagationStopped = returnTrue;
5591+
5592+ if ( e && !this.isSimulated ) {
5593+ e.stopImmediatePropagation();
5594+ }
5595+
5596+ this.stopPropagation();
5597+ }
5598+};
5599+
5600+// Includes all common event props including KeyEvent and MouseEvent specific props
5601+jQuery.each( {
5602+ altKey: true,
5603+ bubbles: true,
5604+ cancelable: true,
5605+ changedTouches: true,
5606+ ctrlKey: true,
5607+ detail: true,
5608+ eventPhase: true,
5609+ metaKey: true,
5610+ pageX: true,
5611+ pageY: true,
5612+ shiftKey: true,
5613+ view: true,
5614+ "char": true,
5615+ code: true,
5616+ charCode: true,
5617+ key: true,
5618+ keyCode: true,
5619+ button: true,
5620+ buttons: true,
5621+ clientX: true,
5622+ clientY: true,
5623+ offsetX: true,
5624+ offsetY: true,
5625+ pointerId: true,
5626+ pointerType: true,
5627+ screenX: true,
5628+ screenY: true,
5629+ targetTouches: true,
5630+ toElement: true,
5631+ touches: true,
5632+
5633+ which: function( event ) {
5634+ var button = event.button;
5635+
5636+ // Add which for key events
5637+ if ( event.which == null && rkeyEvent.test( event.type ) ) {
5638+ return event.charCode != null ? event.charCode : event.keyCode;
5639+ }
5640+
5641+ // Add which for click: 1 === left; 2 === middle; 3 === right
5642+ if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
5643+ if ( button & 1 ) {
5644+ return 1;
5645+ }
5646+
5647+ if ( button & 2 ) {
5648+ return 3;
5649+ }
5650+
5651+ if ( button & 4 ) {
5652+ return 2;
5653+ }
5654+
5655+ return 0;
5656+ }
5657+
5658+ return event.which;
5659+ }
5660+}, jQuery.event.addProp );
5661+
5662+jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
5663+ jQuery.event.special[ type ] = {
5664+
5665+ // Utilize native event if possible so blur/focus sequence is correct
5666+ setup: function() {
5667+
5668+ // Claim the first handler
5669+ // dataPriv.set( this, "focus", ... )
5670+ // dataPriv.set( this, "blur", ... )
5671+ leverageNative( this, type, expectSync );
5672+
5673+ // Return false to allow normal processing in the caller
5674+ return false;
5675+ },
5676+ trigger: function() {
5677+
5678+ // Force setup before trigger
5679+ leverageNative( this, type );
5680+
5681+ // Return non-false to allow normal event-path propagation
5682+ return true;
5683+ },
5684+
5685+ delegateType: delegateType
5686+ };
5687+} );
5688+
5689+// Create mouseenter/leave events using mouseover/out and event-time checks
5690+// so that event delegation works in jQuery.
5691+// Do the same for pointerenter/pointerleave and pointerover/pointerout
5692+//
5693+// Support: Safari 7 only
5694+// Safari sends mouseenter too often; see:
5695+// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
5696+// for the description of the bug (it existed in older Chrome versions as well).
5697+jQuery.each( {
5698+ mouseenter: "mouseover",
5699+ mouseleave: "mouseout",
5700+ pointerenter: "pointerover",
5701+ pointerleave: "pointerout"
5702+}, function( orig, fix ) {
5703+ jQuery.event.special[ orig ] = {
5704+ delegateType: fix,
5705+ bindType: fix,
5706+
5707+ handle: function( event ) {
5708+ var ret,
5709+ target = this,
5710+ related = event.relatedTarget,
5711+ handleObj = event.handleObj;
5712+
5713+ // For mouseenter/leave call the handler if related is outside the target.
5714+ // NB: No relatedTarget if the mouse left/entered the browser window
5715+ if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
5716+ event.type = handleObj.origType;
5717+ ret = handleObj.handler.apply( this, arguments );
5718+ event.type = fix;
5719+ }
5720+ return ret;
5721+ }
5722+ };
5723+} );
5724+
5725+jQuery.fn.extend( {
5726+
5727+ on: function( types, selector, data, fn ) {
5728+ return on( this, types, selector, data, fn );
5729+ },
5730+ one: function( types, selector, data, fn ) {
5731+ return on( this, types, selector, data, fn, 1 );
5732+ },
5733+ off: function( types, selector, fn ) {
5734+ var handleObj, type;
5735+ if ( types && types.preventDefault && types.handleObj ) {
5736+
5737+ // ( event ) dispatched jQuery.Event
5738+ handleObj = types.handleObj;
5739+ jQuery( types.delegateTarget ).off(
5740+ handleObj.namespace ?
5741+ handleObj.origType + "." + handleObj.namespace :
5742+ handleObj.origType,
5743+ handleObj.selector,
5744+ handleObj.handler
5745+ );
5746+ return this;
5747+ }
5748+ if ( typeof types === "object" ) {
5749+
5750+ // ( types-object [, selector] )
5751+ for ( type in types ) {
5752+ this.off( type, selector, types[ type ] );
5753+ }
5754+ return this;
5755+ }
5756+ if ( selector === false || typeof selector === "function" ) {
5757+
5758+ // ( types [, fn] )
5759+ fn = selector;
5760+ selector = undefined;
5761+ }
5762+ if ( fn === false ) {
5763+ fn = returnFalse;
5764+ }
5765+ return this.each( function() {
5766+ jQuery.event.remove( this, types, fn, selector );
5767+ } );
5768+ }
5769+} );
5770+
5771+
5772+var
5773+
5774+ /* eslint-disable max-len */
5775+
5776+ // See https://github.com/eslint/eslint/issues/3229
5777+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
5778+
5779+ /* eslint-enable */
5780+
5781+ // Support: IE <=10 - 11, Edge 12 - 13 only
5782+ // In IE/Edge using regex groups here causes severe slowdowns.
5783+ // See https://connect.microsoft.com/IE/feedback/details/1736512/
5784+ rnoInnerhtml = /<script|<style|<link/i,
5785+
5786+ // checked="checked" or checked
5787+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5788+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
5789+
5790+// Prefer a tbody over its parent table for containing new rows
5791+function manipulationTarget( elem, content ) {
5792+ if ( nodeName( elem, "table" ) &&
5793+ nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
5794+
5795+ return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
5796+ }
5797+
5798+ return elem;
5799+}
5800+
5801+// Replace/restore the type attribute of script elements for safe DOM manipulation
5802+function disableScript( elem ) {
5803+ elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
5804+ return elem;
5805+}
5806+function restoreScript( elem ) {
5807+ if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
5808+ elem.type = elem.type.slice( 5 );
5809+ } else {
5810+ elem.removeAttribute( "type" );
5811+ }
5812+
5813+ return elem;
5814+}
5815+
5816+function cloneCopyEvent( src, dest ) {
5817+ var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
5818+
5819+ if ( dest.nodeType !== 1 ) {
5820+ return;
5821+ }
5822+
5823+ // 1. Copy private data: events, handlers, etc.
5824+ if ( dataPriv.hasData( src ) ) {
5825+ pdataOld = dataPriv.access( src );
5826+ pdataCur = dataPriv.set( dest, pdataOld );
5827+ events = pdataOld.events;
5828+
5829+ if ( events ) {
5830+ delete pdataCur.handle;
5831+ pdataCur.events = {};
5832+
5833+ for ( type in events ) {
5834+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
5835+ jQuery.event.add( dest, type, events[ type ][ i ] );
5836+ }
5837+ }
5838+ }
5839+ }
5840+
5841+ // 2. Copy user data
5842+ if ( dataUser.hasData( src ) ) {
5843+ udataOld = dataUser.access( src );
5844+ udataCur = jQuery.extend( {}, udataOld );
5845+
5846+ dataUser.set( dest, udataCur );
5847+ }
5848+}
5849+
5850+// Fix IE bugs, see support tests
5851+function fixInput( src, dest ) {
5852+ var nodeName = dest.nodeName.toLowerCase();
5853+
5854+ // Fails to persist the checked state of a cloned checkbox or radio button.
5855+ if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
5856+ dest.checked = src.checked;
5857+
5858+ // Fails to return the selected option to the default selected state when cloning options
5859+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
5860+ dest.defaultValue = src.defaultValue;
5861+ }
5862+}
5863+
5864+function domManip( collection, args, callback, ignored ) {
5865+
5866+ // Flatten any nested arrays
5867+ args = concat.apply( [], args );
5868+
5869+ var fragment, first, scripts, hasScripts, node, doc,
5870+ i = 0,
5871+ l = collection.length,
5872+ iNoClone = l - 1,
5873+ value = args[ 0 ],
5874+ valueIsFunction = isFunction( value );
5875+
5876+ // We can't cloneNode fragments that contain checked, in WebKit
5877+ if ( valueIsFunction ||
5878+ ( l > 1 && typeof value === "string" &&
5879+ !support.checkClone && rchecked.test( value ) ) ) {
5880+ return collection.each( function( index ) {
5881+ var self = collection.eq( index );
5882+ if ( valueIsFunction ) {
5883+ args[ 0 ] = value.call( this, index, self.html() );
5884+ }
5885+ domManip( self, args, callback, ignored );
5886+ } );
5887+ }
5888+
5889+ if ( l ) {
5890+ fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
5891+ first = fragment.firstChild;
5892+
5893+ if ( fragment.childNodes.length === 1 ) {
5894+ fragment = first;
5895+ }
5896+
5897+ // Require either new content or an interest in ignored elements to invoke the callback
5898+ if ( first || ignored ) {
5899+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
5900+ hasScripts = scripts.length;
5901+
5902+ // Use the original fragment for the last item
5903+ // instead of the first because it can end up
5904+ // being emptied incorrectly in certain situations (#8070).
5905+ for ( ; i < l; i++ ) {
5906+ node = fragment;
5907+
5908+ if ( i !== iNoClone ) {
5909+ node = jQuery.clone( node, true, true );
5910+
5911+ // Keep references to cloned scripts for later restoration
5912+ if ( hasScripts ) {
5913+
5914+ // Support: Android <=4.0 only, PhantomJS 1 only
5915+ // push.apply(_, arraylike) throws on ancient WebKit
5916+ jQuery.merge( scripts, getAll( node, "script" ) );
5917+ }
5918+ }
5919+
5920+ callback.call( collection[ i ], node, i );
5921+ }
5922+
5923+ if ( hasScripts ) {
5924+ doc = scripts[ scripts.length - 1 ].ownerDocument;
5925+
5926+ // Reenable scripts
5927+ jQuery.map( scripts, restoreScript );
5928+
5929+ // Evaluate executable scripts on first document insertion
5930+ for ( i = 0; i < hasScripts; i++ ) {
5931+ node = scripts[ i ];
5932+ if ( rscriptType.test( node.type || "" ) &&
5933+ !dataPriv.access( node, "globalEval" ) &&
5934+ jQuery.contains( doc, node ) ) {
5935+
5936+ if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) {
5937+
5938+ // Optional AJAX dependency, but won't run scripts if not present
5939+ if ( jQuery._evalUrl && !node.noModule ) {
5940+ jQuery._evalUrl( node.src, {
5941+ nonce: node.nonce || node.getAttribute( "nonce" )
5942+ } );
5943+ }
5944+ } else {
5945+ DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
5946+ }
5947+ }
5948+ }
5949+ }
5950+ }
5951+ }
5952+
5953+ return collection;
5954+}
5955+
5956+function remove( elem, selector, keepData ) {
5957+ var node,
5958+ nodes = selector ? jQuery.filter( selector, elem ) : elem,
5959+ i = 0;
5960+
5961+ for ( ; ( node = nodes[ i ] ) != null; i++ ) {
5962+ if ( !keepData && node.nodeType === 1 ) {
5963+ jQuery.cleanData( getAll( node ) );
5964+ }
5965+
5966+ if ( node.parentNode ) {
5967+ if ( keepData && isAttached( node ) ) {
5968+ setGlobalEval( getAll( node, "script" ) );
5969+ }
5970+ node.parentNode.removeChild( node );
5971+ }
5972+ }
5973+
5974+ return elem;
5975+}
5976+
5977+jQuery.extend( {
5978+ htmlPrefilter: function( html ) {
5979+ return html.replace( rxhtmlTag, "<$1></$2>" );
5980+ },
5981+
5982+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5983+ var i, l, srcElements, destElements,
5984+ clone = elem.cloneNode( true ),
5985+ inPage = isAttached( elem );
5986+
5987+ // Fix IE cloning issues
5988+ if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
5989+ !jQuery.isXMLDoc( elem ) ) {
5990+
5991+ // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
5992+ destElements = getAll( clone );
5993+ srcElements = getAll( elem );
5994+
5995+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
5996+ fixInput( srcElements[ i ], destElements[ i ] );
5997+ }
5998+ }
5999+
6000+ // Copy the events from the original to the clone
6001+ if ( dataAndEvents ) {
6002+ if ( deepDataAndEvents ) {
6003+ srcElements = srcElements || getAll( elem );
6004+ destElements = destElements || getAll( clone );
6005+
6006+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
6007+ cloneCopyEvent( srcElements[ i ], destElements[ i ] );
6008+ }
6009+ } else {
6010+ cloneCopyEvent( elem, clone );
6011+ }
6012+ }
6013+
6014+ // Preserve script evaluation history
6015+ destElements = getAll( clone, "script" );
6016+ if ( destElements.length > 0 ) {
6017+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
6018+ }
6019+
6020+ // Return the cloned set
6021+ return clone;
6022+ },
6023+
6024+ cleanData: function( elems ) {
6025+ var data, elem, type,
6026+ special = jQuery.event.special,
6027+ i = 0;
6028+
6029+ for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
6030+ if ( acceptData( elem ) ) {
6031+ if ( ( data = elem[ dataPriv.expando ] ) ) {
6032+ if ( data.events ) {
6033+ for ( type in data.events ) {
6034+ if ( special[ type ] ) {
6035+ jQuery.event.remove( elem, type );
6036+
6037+ // This is a shortcut to avoid jQuery.event.remove's overhead
6038+ } else {
6039+ jQuery.removeEvent( elem, type, data.handle );
6040+ }
6041+ }
6042+ }
6043+
6044+ // Support: Chrome <=35 - 45+
6045+ // Assign undefined instead of using delete, see Data#remove
6046+ elem[ dataPriv.expando ] = undefined;
6047+ }
6048+ if ( elem[ dataUser.expando ] ) {
6049+
6050+ // Support: Chrome <=35 - 45+
6051+ // Assign undefined instead of using delete, see Data#remove
6052+ elem[ dataUser.expando ] = undefined;
6053+ }
6054+ }
6055+ }
6056+ }
6057+} );
6058+
6059+jQuery.fn.extend( {
6060+ detach: function( selector ) {
6061+ return remove( this, selector, true );
6062+ },
6063+
6064+ remove: function( selector ) {
6065+ return remove( this, selector );
6066+ },
6067+
6068+ text: function( value ) {
6069+ return access( this, function( value ) {
6070+ return value === undefined ?
6071+ jQuery.text( this ) :
6072+ this.empty().each( function() {
6073+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6074+ this.textContent = value;
6075+ }
6076+ } );
6077+ }, null, value, arguments.length );
6078+ },
6079+
6080+ append: function() {
6081+ return domManip( this, arguments, function( elem ) {
6082+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6083+ var target = manipulationTarget( this, elem );
6084+ target.appendChild( elem );
6085+ }
6086+ } );
6087+ },
6088+
6089+ prepend: function() {
6090+ return domManip( this, arguments, function( elem ) {
6091+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6092+ var target = manipulationTarget( this, elem );
6093+ target.insertBefore( elem, target.firstChild );
6094+ }
6095+ } );
6096+ },
6097+
6098+ before: function() {
6099+ return domManip( this, arguments, function( elem ) {
6100+ if ( this.parentNode ) {
6101+ this.parentNode.insertBefore( elem, this );
6102+ }
6103+ } );
6104+ },
6105+
6106+ after: function() {
6107+ return domManip( this, arguments, function( elem ) {
6108+ if ( this.parentNode ) {
6109+ this.parentNode.insertBefore( elem, this.nextSibling );
6110+ }
6111+ } );
6112+ },
6113+
6114+ empty: function() {
6115+ var elem,
6116+ i = 0;
6117+
6118+ for ( ; ( elem = this[ i ] ) != null; i++ ) {
6119+ if ( elem.nodeType === 1 ) {
6120+
6121+ // Prevent memory leaks
6122+ jQuery.cleanData( getAll( elem, false ) );
6123+
6124+ // Remove any remaining nodes
6125+ elem.textContent = "";
6126+ }
6127+ }
6128+
6129+ return this;
6130+ },
6131+
6132+ clone: function( dataAndEvents, deepDataAndEvents ) {
6133+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
6134+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
6135+
6136+ return this.map( function() {
6137+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
6138+ } );
6139+ },
6140+
6141+ html: function( value ) {
6142+ return access( this, function( value ) {
6143+ var elem = this[ 0 ] || {},
6144+ i = 0,
6145+ l = this.length;
6146+
6147+ if ( value === undefined && elem.nodeType === 1 ) {
6148+ return elem.innerHTML;
6149+ }
6150+
6151+ // See if we can take a shortcut and just use innerHTML
6152+ if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
6153+ !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
6154+
6155+ value = jQuery.htmlPrefilter( value );
6156+
6157+ try {
6158+ for ( ; i < l; i++ ) {
6159+ elem = this[ i ] || {};
6160+
6161+ // Remove element nodes and prevent memory leaks
6162+ if ( elem.nodeType === 1 ) {
6163+ jQuery.cleanData( getAll( elem, false ) );
6164+ elem.innerHTML = value;
6165+ }
6166+ }
6167+
6168+ elem = 0;
6169+
6170+ // If using innerHTML throws an exception, use the fallback method
6171+ } catch ( e ) {}
6172+ }
6173+
6174+ if ( elem ) {
6175+ this.empty().append( value );
6176+ }
6177+ }, null, value, arguments.length );
6178+ },
6179+
6180+ replaceWith: function() {
6181+ var ignored = [];
6182+
6183+ // Make the changes, replacing each non-ignored context element with the new content
6184+ return domManip( this, arguments, function( elem ) {
6185+ var parent = this.parentNode;
6186+
6187+ if ( jQuery.inArray( this, ignored ) < 0 ) {
6188+ jQuery.cleanData( getAll( this ) );
6189+ if ( parent ) {
6190+ parent.replaceChild( elem, this );
6191+ }
6192+ }
6193+
6194+ // Force callback invocation
6195+ }, ignored );
6196+ }
6197+} );
6198+
6199+jQuery.each( {
6200+ appendTo: "append",
6201+ prependTo: "prepend",
6202+ insertBefore: "before",
6203+ insertAfter: "after",
6204+ replaceAll: "replaceWith"
6205+}, function( name, original ) {
6206+ jQuery.fn[ name ] = function( selector ) {
6207+ var elems,
6208+ ret = [],
6209+ insert = jQuery( selector ),
6210+ last = insert.length - 1,
6211+ i = 0;
6212+
6213+ for ( ; i <= last; i++ ) {
6214+ elems = i === last ? this : this.clone( true );
6215+ jQuery( insert[ i ] )[ original ]( elems );
6216+
6217+ // Support: Android <=4.0 only, PhantomJS 1 only
6218+ // .get() because push.apply(_, arraylike) throws on ancient WebKit
6219+ push.apply( ret, elems.get() );
6220+ }
6221+
6222+ return this.pushStack( ret );
6223+ };
6224+} );
6225+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6226+
6227+var getStyles = function( elem ) {
6228+
6229+ // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
6230+ // IE throws on elements created in popups
6231+ // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6232+ var view = elem.ownerDocument.defaultView;
6233+
6234+ if ( !view || !view.opener ) {
6235+ view = window;
6236+ }
6237+
6238+ return view.getComputedStyle( elem );
6239+ };
6240+
6241+var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6242+
6243+
6244+
6245+( function() {
6246+
6247+ // Executing both pixelPosition & boxSizingReliable tests require only one layout
6248+ // so they're executed at the same time to save the second computation.
6249+ function computeStyleTests() {
6250+
6251+ // This is a singleton, we need to execute it only once
6252+ if ( !div ) {
6253+ return;
6254+ }
6255+
6256+ container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
6257+ "margin-top:1px;padding:0;border:0";
6258+ div.style.cssText =
6259+ "position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
6260+ "margin:auto;border:1px;padding:1px;" +
6261+ "width:60%;top:1%";
6262+ documentElement.appendChild( container ).appendChild( div );
6263+
6264+ var divStyle = window.getComputedStyle( div );
6265+ pixelPositionVal = divStyle.top !== "1%";
6266+
6267+ // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
6268+ reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
6269+
6270+ // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
6271+ // Some styles come back with percentage values, even though they shouldn't
6272+ div.style.right = "60%";
6273+ pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
6274+
6275+ // Support: IE 9 - 11 only
6276+ // Detect misreporting of content dimensions for box-sizing:border-box elements
6277+ boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
6278+
6279+ // Support: IE 9 only
6280+ // Detect overflow:scroll screwiness (gh-3699)
6281+ // Support: Chrome <=64
6282+ // Don't get tricked when zoom affects offsetWidth (gh-4029)
6283+ div.style.position = "absolute";
6284+ scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
6285+
6286+ documentElement.removeChild( container );
6287+
6288+ // Nullify the div so it wouldn't be stored in the memory and
6289+ // it will also be a sign that checks already performed
6290+ div = null;
6291+ }
6292+
6293+ function roundPixelMeasures( measure ) {
6294+ return Math.round( parseFloat( measure ) );
6295+ }
6296+
6297+ var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
6298+ reliableMarginLeftVal,
6299+ container = document.createElement( "div" ),
6300+ div = document.createElement( "div" );
6301+
6302+ // Finish early in limited (non-browser) environments
6303+ if ( !div.style ) {
6304+ return;
6305+ }
6306+
6307+ // Support: IE <=9 - 11 only
6308+ // Style of cloned element affects source element cloned (#8908)
6309+ div.style.backgroundClip = "content-box";
6310+ div.cloneNode( true ).style.backgroundClip = "";
6311+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
6312+
6313+ jQuery.extend( support, {
6314+ boxSizingReliable: function() {
6315+ computeStyleTests();
6316+ return boxSizingReliableVal;
6317+ },
6318+ pixelBoxStyles: function() {
6319+ computeStyleTests();
6320+ return pixelBoxStylesVal;
6321+ },
6322+ pixelPosition: function() {
6323+ computeStyleTests();
6324+ return pixelPositionVal;
6325+ },
6326+ reliableMarginLeft: function() {
6327+ computeStyleTests();
6328+ return reliableMarginLeftVal;
6329+ },
6330+ scrollboxSize: function() {
6331+ computeStyleTests();
6332+ return scrollboxSizeVal;
6333+ }
6334+ } );
6335+} )();
6336+
6337+
6338+function curCSS( elem, name, computed ) {
6339+ var width, minWidth, maxWidth, ret,
6340+
6341+ // Support: Firefox 51+
6342+ // Retrieving style before computed somehow
6343+ // fixes an issue with getting wrong values
6344+ // on detached elements
6345+ style = elem.style;
6346+
6347+ computed = computed || getStyles( elem );
6348+
6349+ // getPropertyValue is needed for:
6350+ // .css('filter') (IE 9 only, #12537)
6351+ // .css('--customProperty) (#3144)
6352+ if ( computed ) {
6353+ ret = computed.getPropertyValue( name ) || computed[ name ];
6354+
6355+ if ( ret === "" && !isAttached( elem ) ) {
6356+ ret = jQuery.style( elem, name );
6357+ }
6358+
6359+ // A tribute to the "awesome hack by Dean Edwards"
6360+ // Android Browser returns percentage for some values,
6361+ // but width seems to be reliably pixels.
6362+ // This is against the CSSOM draft spec:
6363+ // https://drafts.csswg.org/cssom/#resolved-values
6364+ if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
6365+
6366+ // Remember the original values
6367+ width = style.width;
6368+ minWidth = style.minWidth;
6369+ maxWidth = style.maxWidth;
6370+
6371+ // Put in the new values to get a computed value out
6372+ style.minWidth = style.maxWidth = style.width = ret;
6373+ ret = computed.width;
6374+
6375+ // Revert the changed values
6376+ style.width = width;
6377+ style.minWidth = minWidth;
6378+ style.maxWidth = maxWidth;
6379+ }
6380+ }
6381+
6382+ return ret !== undefined ?
6383+
6384+ // Support: IE <=9 - 11 only
6385+ // IE returns zIndex value as an integer.
6386+ ret + "" :
6387+ ret;
6388+}
6389+
6390+
6391+function addGetHookIf( conditionFn, hookFn ) {
6392+
6393+ // Define the hook, we'll check on the first run if it's really needed.
6394+ return {
6395+ get: function() {
6396+ if ( conditionFn() ) {
6397+
6398+ // Hook not needed (or it's not possible to use it due
6399+ // to missing dependency), remove it.
6400+ delete this.get;
6401+ return;
6402+ }
6403+
6404+ // Hook needed; redefine it so that the support test is not executed again.
6405+ return ( this.get = hookFn ).apply( this, arguments );
6406+ }
6407+ };
6408+}
6409+
6410+
6411+var cssPrefixes = [ "Webkit", "Moz", "ms" ],
6412+ emptyStyle = document.createElement( "div" ).style,
6413+ vendorProps = {};
6414+
6415+// Return a vendor-prefixed property or undefined
6416+function vendorPropName( name ) {
6417+
6418+ // Check for vendor prefixed names
6419+ var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
6420+ i = cssPrefixes.length;
6421+
6422+ while ( i-- ) {
6423+ name = cssPrefixes[ i ] + capName;
6424+ if ( name in emptyStyle ) {
6425+ return name;
6426+ }
6427+ }
6428+}
6429+
6430+// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
6431+function finalPropName( name ) {
6432+ var final = jQuery.cssProps[ name ] || vendorProps[ name ];
6433+
6434+ if ( final ) {
6435+ return final;
6436+ }
6437+ if ( name in emptyStyle ) {
6438+ return name;
6439+ }
6440+ return vendorProps[ name ] = vendorPropName( name ) || name;
6441+}
6442+
6443+
6444+var
6445+
6446+ // Swappable if display is none or starts with table
6447+ // except "table", "table-cell", or "table-caption"
6448+ // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6449+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6450+ rcustomProp = /^--/,
6451+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6452+ cssNormalTransform = {
6453+ letterSpacing: "0",
6454+ fontWeight: "400"
6455+ };
6456+
6457+function setPositiveNumber( elem, value, subtract ) {
6458+
6459+ // Any relative (+/-) values have already been
6460+ // normalized at this point
6461+ var matches = rcssNum.exec( value );
6462+ return matches ?
6463+
6464+ // Guard against undefined "subtract", e.g., when used as in cssHooks
6465+ Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
6466+ value;
6467+}
6468+
6469+function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
6470+ var i = dimension === "width" ? 1 : 0,
6471+ extra = 0,
6472+ delta = 0;
6473+
6474+ // Adjustment may not be necessary
6475+ if ( box === ( isBorderBox ? "border" : "content" ) ) {
6476+ return 0;
6477+ }
6478+
6479+ for ( ; i < 4; i += 2 ) {
6480+
6481+ // Both box models exclude margin
6482+ if ( box === "margin" ) {
6483+ delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6484+ }
6485+
6486+ // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
6487+ if ( !isBorderBox ) {
6488+
6489+ // Add padding
6490+ delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6491+
6492+ // For "border" or "margin", add border
6493+ if ( box !== "padding" ) {
6494+ delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6495+
6496+ // But still keep track of it otherwise
6497+ } else {
6498+ extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6499+ }
6500+
6501+ // If we get here with a border-box (content + padding + border), we're seeking "content" or
6502+ // "padding" or "margin"
6503+ } else {
6504+
6505+ // For "content", subtract padding
6506+ if ( box === "content" ) {
6507+ delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6508+ }
6509+
6510+ // For "content" or "padding", subtract border
6511+ if ( box !== "margin" ) {
6512+ delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6513+ }
6514+ }
6515+ }
6516+
6517+ // Account for positive content-box scroll gutter when requested by providing computedVal
6518+ if ( !isBorderBox && computedVal >= 0 ) {
6519+
6520+ // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
6521+ // Assuming integer scroll gutter, subtract the rest and round down
6522+ delta += Math.max( 0, Math.ceil(
6523+ elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
6524+ computedVal -
6525+ delta -
6526+ extra -
6527+ 0.5
6528+
6529+ // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
6530+ // Use an explicit zero to avoid NaN (gh-3964)
6531+ ) ) || 0;
6532+ }
6533+
6534+ return delta;
6535+}
6536+
6537+function getWidthOrHeight( elem, dimension, extra ) {
6538+
6539+ // Start with computed style
6540+ var styles = getStyles( elem ),
6541+
6542+ // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
6543+ // Fake content-box until we know it's needed to know the true value.
6544+ boxSizingNeeded = !support.boxSizingReliable() || extra,
6545+ isBorderBox = boxSizingNeeded &&
6546+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6547+ valueIsBorderBox = isBorderBox,
6548+
6549+ val = curCSS( elem, dimension, styles ),
6550+ offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
6551+
6552+ // Support: Firefox <=54
6553+ // Return a confounding non-pixel value or feign ignorance, as appropriate.
6554+ if ( rnumnonpx.test( val ) ) {
6555+ if ( !extra ) {
6556+ return val;
6557+ }
6558+ val = "auto";
6559+ }
6560+
6561+
6562+ // Fall back to offsetWidth/offsetHeight when value is "auto"
6563+ // This happens for inline elements with no explicit setting (gh-3571)
6564+ // Support: Android <=4.1 - 4.3 only
6565+ // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
6566+ // Support: IE 9-11 only
6567+ // Also use offsetWidth/offsetHeight for when box sizing is unreliable
6568+ // We use getClientRects() to check for hidden/disconnected.
6569+ // In those cases, the computed value can be trusted to be border-box
6570+ if ( ( !support.boxSizingReliable() && isBorderBox ||
6571+ val === "auto" ||
6572+ !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
6573+ elem.getClientRects().length ) {
6574+
6575+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6576+
6577+ // Where available, offsetWidth/offsetHeight approximate border box dimensions.
6578+ // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
6579+ // retrieved value as a content box dimension.
6580+ valueIsBorderBox = offsetProp in elem;
6581+ if ( valueIsBorderBox ) {
6582+ val = elem[ offsetProp ];
6583+ }
6584+ }
6585+
6586+ // Normalize "" and auto
6587+ val = parseFloat( val ) || 0;
6588+
6589+ // Adjust for the element's box model
6590+ return ( val +
6591+ boxModelAdjustment(
6592+ elem,
6593+ dimension,
6594+ extra || ( isBorderBox ? "border" : "content" ),
6595+ valueIsBorderBox,
6596+ styles,
6597+
6598+ // Provide the current computed size to request scroll gutter calculation (gh-3589)
6599+ val
6600+ )
6601+ ) + "px";
6602+}
6603+
6604+jQuery.extend( {
6605+
6606+ // Add in style property hooks for overriding the default
6607+ // behavior of getting and setting a style property
6608+ cssHooks: {
6609+ opacity: {
6610+ get: function( elem, computed ) {
6611+ if ( computed ) {
6612+
6613+ // We should always get a number back from opacity
6614+ var ret = curCSS( elem, "opacity" );
6615+ return ret === "" ? "1" : ret;
6616+ }
6617+ }
6618+ }
6619+ },
6620+
6621+ // Don't automatically add "px" to these possibly-unitless properties
6622+ cssNumber: {
6623+ "animationIterationCount": true,
6624+ "columnCount": true,
6625+ "fillOpacity": true,
6626+ "flexGrow": true,
6627+ "flexShrink": true,
6628+ "fontWeight": true,
6629+ "gridArea": true,
6630+ "gridColumn": true,
6631+ "gridColumnEnd": true,
6632+ "gridColumnStart": true,
6633+ "gridRow": true,
6634+ "gridRowEnd": true,
6635+ "gridRowStart": true,
6636+ "lineHeight": true,
6637+ "opacity": true,
6638+ "order": true,
6639+ "orphans": true,
6640+ "widows": true,
6641+ "zIndex": true,
6642+ "zoom": true
6643+ },
6644+
6645+ // Add in properties whose names you wish to fix before
6646+ // setting or getting the value
6647+ cssProps: {},
6648+
6649+ // Get and set the style property on a DOM Node
6650+ style: function( elem, name, value, extra ) {
6651+
6652+ // Don't set styles on text and comment nodes
6653+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6654+ return;
6655+ }
6656+
6657+ // Make sure that we're working with the right name
6658+ var ret, type, hooks,
6659+ origName = camelCase( name ),
6660+ isCustomProp = rcustomProp.test( name ),
6661+ style = elem.style;
6662+
6663+ // Make sure that we're working with the right name. We don't
6664+ // want to query the value if it is a CSS custom property
6665+ // since they are user-defined.
6666+ if ( !isCustomProp ) {
6667+ name = finalPropName( origName );
6668+ }
6669+
6670+ // Gets hook for the prefixed version, then unprefixed version
6671+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6672+
6673+ // Check if we're setting a value
6674+ if ( value !== undefined ) {
6675+ type = typeof value;
6676+
6677+ // Convert "+=" or "-=" to relative numbers (#7345)
6678+ if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
6679+ value = adjustCSS( elem, name, ret );
6680+
6681+ // Fixes bug #9237
6682+ type = "number";
6683+ }
6684+
6685+ // Make sure that null and NaN values aren't set (#7116)
6686+ if ( value == null || value !== value ) {
6687+ return;
6688+ }
6689+
6690+ // If a number was passed in, add the unit (except for certain CSS properties)
6691+ // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
6692+ // "px" to a few hardcoded values.
6693+ if ( type === "number" && !isCustomProp ) {
6694+ value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
6695+ }
6696+
6697+ // background-* props affect original clone's values
6698+ if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
6699+ style[ name ] = "inherit";
6700+ }
6701+
6702+ // If a hook was provided, use that value, otherwise just set the specified value
6703+ if ( !hooks || !( "set" in hooks ) ||
6704+ ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
6705+
6706+ if ( isCustomProp ) {
6707+ style.setProperty( name, value );
6708+ } else {
6709+ style[ name ] = value;
6710+ }
6711+ }
6712+
6713+ } else {
6714+
6715+ // If a hook was provided get the non-computed value from there
6716+ if ( hooks && "get" in hooks &&
6717+ ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
6718+
6719+ return ret;
6720+ }
6721+
6722+ // Otherwise just get the value from the style object
6723+ return style[ name ];
6724+ }
6725+ },
6726+
6727+ css: function( elem, name, extra, styles ) {
6728+ var val, num, hooks,
6729+ origName = camelCase( name ),
6730+ isCustomProp = rcustomProp.test( name );
6731+
6732+ // Make sure that we're working with the right name. We don't
6733+ // want to modify the value if it is a CSS custom property
6734+ // since they are user-defined.
6735+ if ( !isCustomProp ) {
6736+ name = finalPropName( origName );
6737+ }
6738+
6739+ // Try prefixed name followed by the unprefixed name
6740+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6741+
6742+ // If a hook was provided get the computed value from there
6743+ if ( hooks && "get" in hooks ) {
6744+ val = hooks.get( elem, true, extra );
6745+ }
6746+
6747+ // Otherwise, if a way to get the computed value exists, use that
6748+ if ( val === undefined ) {
6749+ val = curCSS( elem, name, styles );
6750+ }
6751+
6752+ // Convert "normal" to computed value
6753+ if ( val === "normal" && name in cssNormalTransform ) {
6754+ val = cssNormalTransform[ name ];
6755+ }
6756+
6757+ // Make numeric if forced or a qualifier was provided and val looks numeric
6758+ if ( extra === "" || extra ) {
6759+ num = parseFloat( val );
6760+ return extra === true || isFinite( num ) ? num || 0 : val;
6761+ }
6762+
6763+ return val;
6764+ }
6765+} );
6766+
6767+jQuery.each( [ "height", "width" ], function( i, dimension ) {
6768+ jQuery.cssHooks[ dimension ] = {
6769+ get: function( elem, computed, extra ) {
6770+ if ( computed ) {
6771+
6772+ // Certain elements can have dimension info if we invisibly show them
6773+ // but it must have a current display style that would benefit
6774+ return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
6775+
6776+ // Support: Safari 8+
6777+ // Table columns in Safari have non-zero offsetWidth & zero
6778+ // getBoundingClientRect().width unless display is changed.
6779+ // Support: IE <=11 only
6780+ // Running getBoundingClientRect on a disconnected node
6781+ // in IE throws an error.
6782+ ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
6783+ swap( elem, cssShow, function() {
6784+ return getWidthOrHeight( elem, dimension, extra );
6785+ } ) :
6786+ getWidthOrHeight( elem, dimension, extra );
6787+ }
6788+ },
6789+
6790+ set: function( elem, value, extra ) {
6791+ var matches,
6792+ styles = getStyles( elem ),
6793+
6794+ // Only read styles.position if the test has a chance to fail
6795+ // to avoid forcing a reflow.
6796+ scrollboxSizeBuggy = !support.scrollboxSize() &&
6797+ styles.position === "absolute",
6798+
6799+ // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
6800+ boxSizingNeeded = scrollboxSizeBuggy || extra,
6801+ isBorderBox = boxSizingNeeded &&
6802+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6803+ subtract = extra ?
6804+ boxModelAdjustment(
6805+ elem,
6806+ dimension,
6807+ extra,
6808+ isBorderBox,
6809+ styles
6810+ ) :
6811+ 0;
6812+
6813+ // Account for unreliable border-box dimensions by comparing offset* to computed and
6814+ // faking a content-box to get border and padding (gh-3699)
6815+ if ( isBorderBox && scrollboxSizeBuggy ) {
6816+ subtract -= Math.ceil(
6817+ elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
6818+ parseFloat( styles[ dimension ] ) -
6819+ boxModelAdjustment( elem, dimension, "border", false, styles ) -
6820+ 0.5
6821+ );
6822+ }
6823+
6824+ // Convert to pixels if value adjustment is needed
6825+ if ( subtract && ( matches = rcssNum.exec( value ) ) &&
6826+ ( matches[ 3 ] || "px" ) !== "px" ) {
6827+
6828+ elem.style[ dimension ] = value;
6829+ value = jQuery.css( elem, dimension );
6830+ }
6831+
6832+ return setPositiveNumber( elem, value, subtract );
6833+ }
6834+ };
6835+} );
6836+
6837+jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
6838+ function( elem, computed ) {
6839+ if ( computed ) {
6840+ return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
6841+ elem.getBoundingClientRect().left -
6842+ swap( elem, { marginLeft: 0 }, function() {
6843+ return elem.getBoundingClientRect().left;
6844+ } )
6845+ ) + "px";
6846+ }
6847+ }
6848+);
6849+
6850+// These hooks are used by animate to expand properties
6851+jQuery.each( {
6852+ margin: "",
6853+ padding: "",
6854+ border: "Width"
6855+}, function( prefix, suffix ) {
6856+ jQuery.cssHooks[ prefix + suffix ] = {
6857+ expand: function( value ) {
6858+ var i = 0,
6859+ expanded = {},
6860+
6861+ // Assumes a single number if not a string
6862+ parts = typeof value === "string" ? value.split( " " ) : [ value ];
6863+
6864+ for ( ; i < 4; i++ ) {
6865+ expanded[ prefix + cssExpand[ i ] + suffix ] =
6866+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
6867+ }
6868+
6869+ return expanded;
6870+ }
6871+ };
6872+
6873+ if ( prefix !== "margin" ) {
6874+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
6875+ }
6876+} );
6877+
6878+jQuery.fn.extend( {
6879+ css: function( name, value ) {
6880+ return access( this, function( elem, name, value ) {
6881+ var styles, len,
6882+ map = {},
6883+ i = 0;
6884+
6885+ if ( Array.isArray( name ) ) {
6886+ styles = getStyles( elem );
6887+ len = name.length;
6888+
6889+ for ( ; i < len; i++ ) {
6890+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
6891+ }
6892+
6893+ return map;
6894+ }
6895+
6896+ return value !== undefined ?
6897+ jQuery.style( elem, name, value ) :
6898+ jQuery.css( elem, name );
6899+ }, name, value, arguments.length > 1 );
6900+ }
6901+} );
6902+
6903+
6904+function Tween( elem, options, prop, end, easing ) {
6905+ return new Tween.prototype.init( elem, options, prop, end, easing );
6906+}
6907+jQuery.Tween = Tween;
6908+
6909+Tween.prototype = {
6910+ constructor: Tween,
6911+ init: function( elem, options, prop, end, easing, unit ) {
6912+ this.elem = elem;
6913+ this.prop = prop;
6914+ this.easing = easing || jQuery.easing._default;
6915+ this.options = options;
6916+ this.start = this.now = this.cur();
6917+ this.end = end;
6918+ this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
6919+ },
6920+ cur: function() {
6921+ var hooks = Tween.propHooks[ this.prop ];
6922+
6923+ return hooks && hooks.get ?
6924+ hooks.get( this ) :
6925+ Tween.propHooks._default.get( this );
6926+ },
6927+ run: function( percent ) {
6928+ var eased,
6929+ hooks = Tween.propHooks[ this.prop ];
6930+
6931+ if ( this.options.duration ) {
6932+ this.pos = eased = jQuery.easing[ this.easing ](
6933+ percent, this.options.duration * percent, 0, 1, this.options.duration
6934+ );
6935+ } else {
6936+ this.pos = eased = percent;
6937+ }
6938+ this.now = ( this.end - this.start ) * eased + this.start;
6939+
6940+ if ( this.options.step ) {
6941+ this.options.step.call( this.elem, this.now, this );
6942+ }
6943+
6944+ if ( hooks && hooks.set ) {
6945+ hooks.set( this );
6946+ } else {
6947+ Tween.propHooks._default.set( this );
6948+ }
6949+ return this;
6950+ }
6951+};
6952+
6953+Tween.prototype.init.prototype = Tween.prototype;
6954+
6955+Tween.propHooks = {
6956+ _default: {
6957+ get: function( tween ) {
6958+ var result;
6959+
6960+ // Use a property on the element directly when it is not a DOM element,
6961+ // or when there is no matching style property that exists.
6962+ if ( tween.elem.nodeType !== 1 ||
6963+ tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
6964+ return tween.elem[ tween.prop ];
6965+ }
6966+
6967+ // Passing an empty string as a 3rd parameter to .css will automatically
6968+ // attempt a parseFloat and fallback to a string if the parse fails.
6969+ // Simple values such as "10px" are parsed to Float;
6970+ // complex values such as "rotate(1rad)" are returned as-is.
6971+ result = jQuery.css( tween.elem, tween.prop, "" );
6972+
6973+ // Empty strings, null, undefined and "auto" are converted to 0.
6974+ return !result || result === "auto" ? 0 : result;
6975+ },
6976+ set: function( tween ) {
6977+
6978+ // Use step hook for back compat.
6979+ // Use cssHook if its there.
6980+ // Use .style if available and use plain properties where available.
6981+ if ( jQuery.fx.step[ tween.prop ] ) {
6982+ jQuery.fx.step[ tween.prop ]( tween );
6983+ } else if ( tween.elem.nodeType === 1 && (
6984+ jQuery.cssHooks[ tween.prop ] ||
6985+ tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
6986+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
6987+ } else {
6988+ tween.elem[ tween.prop ] = tween.now;
6989+ }
6990+ }
6991+ }
6992+};
6993+
6994+// Support: IE <=9 only
6995+// Panic based approach to setting things on disconnected nodes
6996+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
6997+ set: function( tween ) {
6998+ if ( tween.elem.nodeType && tween.elem.parentNode ) {
6999+ tween.elem[ tween.prop ] = tween.now;
7000+ }
7001+ }
7002+};
7003+
7004+jQuery.easing = {
7005+ linear: function( p ) {
7006+ return p;
7007+ },
7008+ swing: function( p ) {
7009+ return 0.5 - Math.cos( p * Math.PI ) / 2;
7010+ },
7011+ _default: "swing"
7012+};
7013+
7014+jQuery.fx = Tween.prototype.init;
7015+
7016+// Back compat <1.8 extension point
7017+jQuery.fx.step = {};
7018+
7019+
7020+
7021+
7022+var
7023+ fxNow, inProgress,
7024+ rfxtypes = /^(?:toggle|show|hide)$/,
7025+ rrun = /queueHooks$/;
7026+
7027+function schedule() {
7028+ if ( inProgress ) {
7029+ if ( document.hidden === false && window.requestAnimationFrame ) {
7030+ window.requestAnimationFrame( schedule );
7031+ } else {
7032+ window.setTimeout( schedule, jQuery.fx.interval );
7033+ }
7034+
7035+ jQuery.fx.tick();
7036+ }
7037+}
7038+
7039+// Animations created synchronously will run synchronously
7040+function createFxNow() {
7041+ window.setTimeout( function() {
7042+ fxNow = undefined;
7043+ } );
7044+ return ( fxNow = Date.now() );
7045+}
7046+
7047+// Generate parameters to create a standard animation
7048+function genFx( type, includeWidth ) {
7049+ var which,
7050+ i = 0,
7051+ attrs = { height: type };
7052+
7053+ // If we include width, step value is 1 to do all cssExpand values,
7054+ // otherwise step value is 2 to skip over Left and Right
7055+ includeWidth = includeWidth ? 1 : 0;
7056+ for ( ; i < 4; i += 2 - includeWidth ) {
7057+ which = cssExpand[ i ];
7058+ attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
7059+ }
7060+
7061+ if ( includeWidth ) {
7062+ attrs.opacity = attrs.width = type;
7063+ }
7064+
7065+ return attrs;
7066+}
7067+
7068+function createTween( value, prop, animation ) {
7069+ var tween,
7070+ collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
7071+ index = 0,
7072+ length = collection.length;
7073+ for ( ; index < length; index++ ) {
7074+ if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
7075+
7076+ // We're done with this property
7077+ return tween;
7078+ }
7079+ }
7080+}
7081+
7082+function defaultPrefilter( elem, props, opts ) {
7083+ var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
7084+ isBox = "width" in props || "height" in props,
7085+ anim = this,
7086+ orig = {},
7087+ style = elem.style,
7088+ hidden = elem.nodeType && isHiddenWithinTree( elem ),
7089+ dataShow = dataPriv.get( elem, "fxshow" );
7090+
7091+ // Queue-skipping animations hijack the fx hooks
7092+ if ( !opts.queue ) {
7093+ hooks = jQuery._queueHooks( elem, "fx" );
7094+ if ( hooks.unqueued == null ) {
7095+ hooks.unqueued = 0;
7096+ oldfire = hooks.empty.fire;
7097+ hooks.empty.fire = function() {
7098+ if ( !hooks.unqueued ) {
7099+ oldfire();
7100+ }
7101+ };
7102+ }
7103+ hooks.unqueued++;
7104+
7105+ anim.always( function() {
7106+
7107+ // Ensure the complete handler is called before this completes
7108+ anim.always( function() {
7109+ hooks.unqueued--;
7110+ if ( !jQuery.queue( elem, "fx" ).length ) {
7111+ hooks.empty.fire();
7112+ }
7113+ } );
7114+ } );
7115+ }
7116+
7117+ // Detect show/hide animations
7118+ for ( prop in props ) {
7119+ value = props[ prop ];
7120+ if ( rfxtypes.test( value ) ) {
7121+ delete props[ prop ];
7122+ toggle = toggle || value === "toggle";
7123+ if ( value === ( hidden ? "hide" : "show" ) ) {
7124+
7125+ // Pretend to be hidden if this is a "show" and
7126+ // there is still data from a stopped show/hide
7127+ if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
7128+ hidden = true;
7129+
7130+ // Ignore all other no-op show/hide data
7131+ } else {
7132+ continue;
7133+ }
7134+ }
7135+ orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
7136+ }
7137+ }
7138+
7139+ // Bail out if this is a no-op like .hide().hide()
7140+ propTween = !jQuery.isEmptyObject( props );
7141+ if ( !propTween && jQuery.isEmptyObject( orig ) ) {
7142+ return;
7143+ }
7144+
7145+ // Restrict "overflow" and "display" styles during box animations
7146+ if ( isBox && elem.nodeType === 1 ) {
7147+
7148+ // Support: IE <=9 - 11, Edge 12 - 15
7149+ // Record all 3 overflow attributes because IE does not infer the shorthand
7150+ // from identically-valued overflowX and overflowY and Edge just mirrors
7151+ // the overflowX value there.
7152+ opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
7153+
7154+ // Identify a display type, preferring old show/hide data over the CSS cascade
7155+ restoreDisplay = dataShow && dataShow.display;
7156+ if ( restoreDisplay == null ) {
7157+ restoreDisplay = dataPriv.get( elem, "display" );
7158+ }
7159+ display = jQuery.css( elem, "display" );
7160+ if ( display === "none" ) {
7161+ if ( restoreDisplay ) {
7162+ display = restoreDisplay;
7163+ } else {
7164+
7165+ // Get nonempty value(s) by temporarily forcing visibility
7166+ showHide( [ elem ], true );
7167+ restoreDisplay = elem.style.display || restoreDisplay;
7168+ display = jQuery.css( elem, "display" );
7169+ showHide( [ elem ] );
7170+ }
7171+ }
7172+
7173+ // Animate inline elements as inline-block
7174+ if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
7175+ if ( jQuery.css( elem, "float" ) === "none" ) {
7176+
7177+ // Restore the original display value at the end of pure show/hide animations
7178+ if ( !propTween ) {
7179+ anim.done( function() {
7180+ style.display = restoreDisplay;
7181+ } );
7182+ if ( restoreDisplay == null ) {
7183+ display = style.display;
7184+ restoreDisplay = display === "none" ? "" : display;
7185+ }
7186+ }
7187+ style.display = "inline-block";
7188+ }
7189+ }
7190+ }
7191+
7192+ if ( opts.overflow ) {
7193+ style.overflow = "hidden";
7194+ anim.always( function() {
7195+ style.overflow = opts.overflow[ 0 ];
7196+ style.overflowX = opts.overflow[ 1 ];
7197+ style.overflowY = opts.overflow[ 2 ];
7198+ } );
7199+ }
7200+
7201+ // Implement show/hide animations
7202+ propTween = false;
7203+ for ( prop in orig ) {
7204+
7205+ // General show/hide setup for this element animation
7206+ if ( !propTween ) {
7207+ if ( dataShow ) {
7208+ if ( "hidden" in dataShow ) {
7209+ hidden = dataShow.hidden;
7210+ }
7211+ } else {
7212+ dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
7213+ }
7214+
7215+ // Store hidden/visible for toggle so `.stop().toggle()` "reverses"
7216+ if ( toggle ) {
7217+ dataShow.hidden = !hidden;
7218+ }
7219+
7220+ // Show elements before animating them
7221+ if ( hidden ) {
7222+ showHide( [ elem ], true );
7223+ }
7224+
7225+ /* eslint-disable no-loop-func */
7226+
7227+ anim.done( function() {
7228+
7229+ /* eslint-enable no-loop-func */
7230+
7231+ // The final step of a "hide" animation is actually hiding the element
7232+ if ( !hidden ) {
7233+ showHide( [ elem ] );
7234+ }
7235+ dataPriv.remove( elem, "fxshow" );
7236+ for ( prop in orig ) {
7237+ jQuery.style( elem, prop, orig[ prop ] );
7238+ }
7239+ } );
7240+ }
7241+
7242+ // Per-property setup
7243+ propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
7244+ if ( !( prop in dataShow ) ) {
7245+ dataShow[ prop ] = propTween.start;
7246+ if ( hidden ) {
7247+ propTween.end = propTween.start;
7248+ propTween.start = 0;
7249+ }
7250+ }
7251+ }
7252+}
7253+
7254+function propFilter( props, specialEasing ) {
7255+ var index, name, easing, value, hooks;
7256+
7257+ // camelCase, specialEasing and expand cssHook pass
7258+ for ( index in props ) {
7259+ name = camelCase( index );
7260+ easing = specialEasing[ name ];
7261+ value = props[ index ];
7262+ if ( Array.isArray( value ) ) {
7263+ easing = value[ 1 ];
7264+ value = props[ index ] = value[ 0 ];
7265+ }
7266+
7267+ if ( index !== name ) {
7268+ props[ name ] = value;
7269+ delete props[ index ];
7270+ }
7271+
7272+ hooks = jQuery.cssHooks[ name ];
7273+ if ( hooks && "expand" in hooks ) {
7274+ value = hooks.expand( value );
7275+ delete props[ name ];
7276+
7277+ // Not quite $.extend, this won't overwrite existing keys.
7278+ // Reusing 'index' because we have the correct "name"
7279+ for ( index in value ) {
7280+ if ( !( index in props ) ) {
7281+ props[ index ] = value[ index ];
7282+ specialEasing[ index ] = easing;
7283+ }
7284+ }
7285+ } else {
7286+ specialEasing[ name ] = easing;
7287+ }
7288+ }
7289+}
7290+
7291+function Animation( elem, properties, options ) {
7292+ var result,
7293+ stopped,
7294+ index = 0,
7295+ length = Animation.prefilters.length,
7296+ deferred = jQuery.Deferred().always( function() {
7297+
7298+ // Don't match elem in the :animated selector
7299+ delete tick.elem;
7300+ } ),
7301+ tick = function() {
7302+ if ( stopped ) {
7303+ return false;
7304+ }
7305+ var currentTime = fxNow || createFxNow(),
7306+ remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7307+
7308+ // Support: Android 2.3 only
7309+ // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
7310+ temp = remaining / animation.duration || 0,
7311+ percent = 1 - temp,
7312+ index = 0,
7313+ length = animation.tweens.length;
7314+
7315+ for ( ; index < length; index++ ) {
7316+ animation.tweens[ index ].run( percent );
7317+ }
7318+
7319+ deferred.notifyWith( elem, [ animation, percent, remaining ] );
7320+
7321+ // If there's more to do, yield
7322+ if ( percent < 1 && length ) {
7323+ return remaining;
7324+ }
7325+
7326+ // If this was an empty animation, synthesize a final progress notification
7327+ if ( !length ) {
7328+ deferred.notifyWith( elem, [ animation, 1, 0 ] );
7329+ }
7330+
7331+ // Resolve the animation and report its conclusion
7332+ deferred.resolveWith( elem, [ animation ] );
7333+ return false;
7334+ },
7335+ animation = deferred.promise( {
7336+ elem: elem,
7337+ props: jQuery.extend( {}, properties ),
7338+ opts: jQuery.extend( true, {
7339+ specialEasing: {},
7340+ easing: jQuery.easing._default
7341+ }, options ),
7342+ originalProperties: properties,
7343+ originalOptions: options,
7344+ startTime: fxNow || createFxNow(),
7345+ duration: options.duration,
7346+ tweens: [],
7347+ createTween: function( prop, end ) {
7348+ var tween = jQuery.Tween( elem, animation.opts, prop, end,
7349+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
7350+ animation.tweens.push( tween );
7351+ return tween;
7352+ },
7353+ stop: function( gotoEnd ) {
7354+ var index = 0,
7355+
7356+ // If we are going to the end, we want to run all the tweens
7357+ // otherwise we skip this part
7358+ length = gotoEnd ? animation.tweens.length : 0;
7359+ if ( stopped ) {
7360+ return this;
7361+ }
7362+ stopped = true;
7363+ for ( ; index < length; index++ ) {
7364+ animation.tweens[ index ].run( 1 );
7365+ }
7366+
7367+ // Resolve when we played the last frame; otherwise, reject
7368+ if ( gotoEnd ) {
7369+ deferred.notifyWith( elem, [ animation, 1, 0 ] );
7370+ deferred.resolveWith( elem, [ animation, gotoEnd ] );
7371+ } else {
7372+ deferred.rejectWith( elem, [ animation, gotoEnd ] );
7373+ }
7374+ return this;
7375+ }
7376+ } ),
7377+ props = animation.props;
7378+
7379+ propFilter( props, animation.opts.specialEasing );
7380+
7381+ for ( ; index < length; index++ ) {
7382+ result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
7383+ if ( result ) {
7384+ if ( isFunction( result.stop ) ) {
7385+ jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
7386+ result.stop.bind( result );
7387+ }
7388+ return result;
7389+ }
7390+ }
7391+
7392+ jQuery.map( props, createTween, animation );
7393+
7394+ if ( isFunction( animation.opts.start ) ) {
7395+ animation.opts.start.call( elem, animation );
7396+ }
7397+
7398+ // Attach callbacks from options
7399+ animation
7400+ .progress( animation.opts.progress )
7401+ .done( animation.opts.done, animation.opts.complete )
7402+ .fail( animation.opts.fail )
7403+ .always( animation.opts.always );
7404+
7405+ jQuery.fx.timer(
7406+ jQuery.extend( tick, {
7407+ elem: elem,
7408+ anim: animation,
7409+ queue: animation.opts.queue
7410+ } )
7411+ );
7412+
7413+ return animation;
7414+}
7415+
7416+jQuery.Animation = jQuery.extend( Animation, {
7417+
7418+ tweeners: {
7419+ "*": [ function( prop, value ) {
7420+ var tween = this.createTween( prop, value );
7421+ adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
7422+ return tween;
7423+ } ]
7424+ },
7425+
7426+ tweener: function( props, callback ) {
7427+ if ( isFunction( props ) ) {
7428+ callback = props;
7429+ props = [ "*" ];
7430+ } else {
7431+ props = props.match( rnothtmlwhite );
7432+ }
7433+
7434+ var prop,
7435+ index = 0,
7436+ length = props.length;
7437+
7438+ for ( ; index < length; index++ ) {
7439+ prop = props[ index ];
7440+ Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
7441+ Animation.tweeners[ prop ].unshift( callback );
7442+ }
7443+ },
7444+
7445+ prefilters: [ defaultPrefilter ],
7446+
7447+ prefilter: function( callback, prepend ) {
7448+ if ( prepend ) {
7449+ Animation.prefilters.unshift( callback );
7450+ } else {
7451+ Animation.prefilters.push( callback );
7452+ }
7453+ }
7454+} );
7455+
7456+jQuery.speed = function( speed, easing, fn ) {
7457+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7458+ complete: fn || !fn && easing ||
7459+ isFunction( speed ) && speed,
7460+ duration: speed,
7461+ easing: fn && easing || easing && !isFunction( easing ) && easing
7462+ };
7463+
7464+ // Go to the end state if fx are off
7465+ if ( jQuery.fx.off ) {
7466+ opt.duration = 0;
7467+
7468+ } else {
7469+ if ( typeof opt.duration !== "number" ) {
7470+ if ( opt.duration in jQuery.fx.speeds ) {
7471+ opt.duration = jQuery.fx.speeds[ opt.duration ];
7472+
7473+ } else {
7474+ opt.duration = jQuery.fx.speeds._default;
7475+ }
7476+ }
7477+ }
7478+
7479+ // Normalize opt.queue - true/undefined/null -> "fx"
7480+ if ( opt.queue == null || opt.queue === true ) {
7481+ opt.queue = "fx";
7482+ }
7483+
7484+ // Queueing
7485+ opt.old = opt.complete;
7486+
7487+ opt.complete = function() {
7488+ if ( isFunction( opt.old ) ) {
7489+ opt.old.call( this );
7490+ }
7491+
7492+ if ( opt.queue ) {
7493+ jQuery.dequeue( this, opt.queue );
7494+ }
7495+ };
7496+
7497+ return opt;
7498+};
7499+
7500+jQuery.fn.extend( {
7501+ fadeTo: function( speed, to, easing, callback ) {
7502+
7503+ // Show any hidden elements after setting opacity to 0
7504+ return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
7505+
7506+ // Animate to the value specified
7507+ .end().animate( { opacity: to }, speed, easing, callback );
7508+ },
7509+ animate: function( prop, speed, easing, callback ) {
7510+ var empty = jQuery.isEmptyObject( prop ),
7511+ optall = jQuery.speed( speed, easing, callback ),
7512+ doAnimation = function() {
7513+
7514+ // Operate on a copy of prop so per-property easing won't be lost
7515+ var anim = Animation( this, jQuery.extend( {}, prop ), optall );
7516+
7517+ // Empty animations, or finishing resolves immediately
7518+ if ( empty || dataPriv.get( this, "finish" ) ) {
7519+ anim.stop( true );
7520+ }
7521+ };
7522+ doAnimation.finish = doAnimation;
7523+
7524+ return empty || optall.queue === false ?
7525+ this.each( doAnimation ) :
7526+ this.queue( optall.queue, doAnimation );
7527+ },
7528+ stop: function( type, clearQueue, gotoEnd ) {
7529+ var stopQueue = function( hooks ) {
7530+ var stop = hooks.stop;
7531+ delete hooks.stop;
7532+ stop( gotoEnd );
7533+ };
7534+
7535+ if ( typeof type !== "string" ) {
7536+ gotoEnd = clearQueue;
7537+ clearQueue = type;
7538+ type = undefined;
7539+ }
7540+ if ( clearQueue && type !== false ) {
7541+ this.queue( type || "fx", [] );
7542+ }
7543+
7544+ return this.each( function() {
7545+ var dequeue = true,
7546+ index = type != null && type + "queueHooks",
7547+ timers = jQuery.timers,
7548+ data = dataPriv.get( this );
7549+
7550+ if ( index ) {
7551+ if ( data[ index ] && data[ index ].stop ) {
7552+ stopQueue( data[ index ] );
7553+ }
7554+ } else {
7555+ for ( index in data ) {
7556+ if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
7557+ stopQueue( data[ index ] );
7558+ }
7559+ }
7560+ }
7561+
7562+ for ( index = timers.length; index--; ) {
7563+ if ( timers[ index ].elem === this &&
7564+ ( type == null || timers[ index ].queue === type ) ) {
7565+
7566+ timers[ index ].anim.stop( gotoEnd );
7567+ dequeue = false;
7568+ timers.splice( index, 1 );
7569+ }
7570+ }
7571+
7572+ // Start the next in the queue if the last step wasn't forced.
7573+ // Timers currently will call their complete callbacks, which
7574+ // will dequeue but only if they were gotoEnd.
7575+ if ( dequeue || !gotoEnd ) {
7576+ jQuery.dequeue( this, type );
7577+ }
7578+ } );
7579+ },
7580+ finish: function( type ) {
7581+ if ( type !== false ) {
7582+ type = type || "fx";
7583+ }
7584+ return this.each( function() {
7585+ var index,
7586+ data = dataPriv.get( this ),
7587+ queue = data[ type + "queue" ],
7588+ hooks = data[ type + "queueHooks" ],
7589+ timers = jQuery.timers,
7590+ length = queue ? queue.length : 0;
7591+
7592+ // Enable finishing flag on private data
7593+ data.finish = true;
7594+
7595+ // Empty the queue first
7596+ jQuery.queue( this, type, [] );
7597+
7598+ if ( hooks && hooks.stop ) {
7599+ hooks.stop.call( this, true );
7600+ }
7601+
7602+ // Look for any active animations, and finish them
7603+ for ( index = timers.length; index--; ) {
7604+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
7605+ timers[ index ].anim.stop( true );
7606+ timers.splice( index, 1 );
7607+ }
7608+ }
7609+
7610+ // Look for any animations in the old queue and finish them
7611+ for ( index = 0; index < length; index++ ) {
7612+ if ( queue[ index ] && queue[ index ].finish ) {
7613+ queue[ index ].finish.call( this );
7614+ }
7615+ }
7616+
7617+ // Turn off finishing flag
7618+ delete data.finish;
7619+ } );
7620+ }
7621+} );
7622+
7623+jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
7624+ var cssFn = jQuery.fn[ name ];
7625+ jQuery.fn[ name ] = function( speed, easing, callback ) {
7626+ return speed == null || typeof speed === "boolean" ?
7627+ cssFn.apply( this, arguments ) :
7628+ this.animate( genFx( name, true ), speed, easing, callback );
7629+ };
7630+} );
7631+
7632+// Generate shortcuts for custom animations
7633+jQuery.each( {
7634+ slideDown: genFx( "show" ),
7635+ slideUp: genFx( "hide" ),
7636+ slideToggle: genFx( "toggle" ),
7637+ fadeIn: { opacity: "show" },
7638+ fadeOut: { opacity: "hide" },
7639+ fadeToggle: { opacity: "toggle" }
7640+}, function( name, props ) {
7641+ jQuery.fn[ name ] = function( speed, easing, callback ) {
7642+ return this.animate( props, speed, easing, callback );
7643+ };
7644+} );
7645+
7646+jQuery.timers = [];
7647+jQuery.fx.tick = function() {
7648+ var timer,
7649+ i = 0,
7650+ timers = jQuery.timers;
7651+
7652+ fxNow = Date.now();
7653+
7654+ for ( ; i < timers.length; i++ ) {
7655+ timer = timers[ i ];
7656+
7657+ // Run the timer and safely remove it when done (allowing for external removal)
7658+ if ( !timer() && timers[ i ] === timer ) {
7659+ timers.splice( i--, 1 );
7660+ }
7661+ }
7662+
7663+ if ( !timers.length ) {
7664+ jQuery.fx.stop();
7665+ }
7666+ fxNow = undefined;
7667+};
7668+
7669+jQuery.fx.timer = function( timer ) {
7670+ jQuery.timers.push( timer );
7671+ jQuery.fx.start();
7672+};
7673+
7674+jQuery.fx.interval = 13;
7675+jQuery.fx.start = function() {
7676+ if ( inProgress ) {
7677+ return;
7678+ }
7679+
7680+ inProgress = true;
7681+ schedule();
7682+};
7683+
7684+jQuery.fx.stop = function() {
7685+ inProgress = null;
7686+};
7687+
7688+jQuery.fx.speeds = {
7689+ slow: 600,
7690+ fast: 200,
7691+
7692+ // Default speed
7693+ _default: 400
7694+};
7695+
7696+
7697+// Based off of the plugin by Clint Helfers, with permission.
7698+// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
7699+jQuery.fn.delay = function( time, type ) {
7700+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7701+ type = type || "fx";
7702+
7703+ return this.queue( type, function( next, hooks ) {
7704+ var timeout = window.setTimeout( next, time );
7705+ hooks.stop = function() {
7706+ window.clearTimeout( timeout );
7707+ };
7708+ } );
7709+};
7710+
7711+
7712+( function() {
7713+ var input = document.createElement( "input" ),
7714+ select = document.createElement( "select" ),
7715+ opt = select.appendChild( document.createElement( "option" ) );
7716+
7717+ input.type = "checkbox";
7718+
7719+ // Support: Android <=4.3 only
7720+ // Default value for a checkbox should be "on"
7721+ support.checkOn = input.value !== "";
7722+
7723+ // Support: IE <=11 only
7724+ // Must access selectedIndex to make default options select
7725+ support.optSelected = opt.selected;
7726+
7727+ // Support: IE <=11 only
7728+ // An input loses its value after becoming a radio
7729+ input = document.createElement( "input" );
7730+ input.value = "t";
7731+ input.type = "radio";
7732+ support.radioValue = input.value === "t";
7733+} )();
7734+
7735+
7736+var boolHook,
7737+ attrHandle = jQuery.expr.attrHandle;
7738+
7739+jQuery.fn.extend( {
7740+ attr: function( name, value ) {
7741+ return access( this, jQuery.attr, name, value, arguments.length > 1 );
7742+ },
7743+
7744+ removeAttr: function( name ) {
7745+ return this.each( function() {
7746+ jQuery.removeAttr( this, name );
7747+ } );
7748+ }
7749+} );
7750+
7751+jQuery.extend( {
7752+ attr: function( elem, name, value ) {
7753+ var ret, hooks,
7754+ nType = elem.nodeType;
7755+
7756+ // Don't get/set attributes on text, comment and attribute nodes
7757+ if ( nType === 3 || nType === 8 || nType === 2 ) {
7758+ return;
7759+ }
7760+
7761+ // Fallback to prop when attributes are not supported
7762+ if ( typeof elem.getAttribute === "undefined" ) {
7763+ return jQuery.prop( elem, name, value );
7764+ }
7765+
7766+ // Attribute hooks are determined by the lowercase version
7767+ // Grab necessary hook if one is defined
7768+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7769+ hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
7770+ ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
7771+ }
7772+
7773+ if ( value !== undefined ) {
7774+ if ( value === null ) {
7775+ jQuery.removeAttr( elem, name );
7776+ return;
7777+ }
7778+
7779+ if ( hooks && "set" in hooks &&
7780+ ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
7781+ return ret;
7782+ }
7783+
7784+ elem.setAttribute( name, value + "" );
7785+ return value;
7786+ }
7787+
7788+ if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
7789+ return ret;
7790+ }
7791+
7792+ ret = jQuery.find.attr( elem, name );
7793+
7794+ // Non-existent attributes return null, we normalize to undefined
7795+ return ret == null ? undefined : ret;
7796+ },
7797+
7798+ attrHooks: {
7799+ type: {
7800+ set: function( elem, value ) {
7801+ if ( !support.radioValue && value === "radio" &&
7802+ nodeName( elem, "input" ) ) {
7803+ var val = elem.value;
7804+ elem.setAttribute( "type", value );
7805+ if ( val ) {
7806+ elem.value = val;
7807+ }
7808+ return value;
7809+ }
7810+ }
7811+ }
7812+ },
7813+
7814+ removeAttr: function( elem, value ) {
7815+ var name,
7816+ i = 0,
7817+
7818+ // Attribute names can contain non-HTML whitespace characters
7819+ // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
7820+ attrNames = value && value.match( rnothtmlwhite );
7821+
7822+ if ( attrNames && elem.nodeType === 1 ) {
7823+ while ( ( name = attrNames[ i++ ] ) ) {
7824+ elem.removeAttribute( name );
7825+ }
7826+ }
7827+ }
7828+} );
7829+
7830+// Hooks for boolean attributes
7831+boolHook = {
7832+ set: function( elem, value, name ) {
7833+ if ( value === false ) {
7834+
7835+ // Remove boolean attributes when set to false
7836+ jQuery.removeAttr( elem, name );
7837+ } else {
7838+ elem.setAttribute( name, name );
7839+ }
7840+ return name;
7841+ }
7842+};
7843+
7844+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
7845+ var getter = attrHandle[ name ] || jQuery.find.attr;
7846+
7847+ attrHandle[ name ] = function( elem, name, isXML ) {
7848+ var ret, handle,
7849+ lowercaseName = name.toLowerCase();
7850+
7851+ if ( !isXML ) {
7852+
7853+ // Avoid an infinite loop by temporarily removing this function from the getter
7854+ handle = attrHandle[ lowercaseName ];
7855+ attrHandle[ lowercaseName ] = ret;
7856+ ret = getter( elem, name, isXML ) != null ?
7857+ lowercaseName :
7858+ null;
7859+ attrHandle[ lowercaseName ] = handle;
7860+ }
7861+ return ret;
7862+ };
7863+} );
7864+
7865+
7866+
7867+
7868+var rfocusable = /^(?:input|select|textarea|button)$/i,
7869+ rclickable = /^(?:a|area)$/i;
7870+
7871+jQuery.fn.extend( {
7872+ prop: function( name, value ) {
7873+ return access( this, jQuery.prop, name, value, arguments.length > 1 );
7874+ },
7875+
7876+ removeProp: function( name ) {
7877+ return this.each( function() {
7878+ delete this[ jQuery.propFix[ name ] || name ];
7879+ } );
7880+ }
7881+} );
7882+
7883+jQuery.extend( {
7884+ prop: function( elem, name, value ) {
7885+ var ret, hooks,
7886+ nType = elem.nodeType;
7887+
7888+ // Don't get/set properties on text, comment and attribute nodes
7889+ if ( nType === 3 || nType === 8 || nType === 2 ) {
7890+ return;
7891+ }
7892+
7893+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7894+
7895+ // Fix name and attach hooks
7896+ name = jQuery.propFix[ name ] || name;
7897+ hooks = jQuery.propHooks[ name ];
7898+ }
7899+
7900+ if ( value !== undefined ) {
7901+ if ( hooks && "set" in hooks &&
7902+ ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
7903+ return ret;
7904+ }
7905+
7906+ return ( elem[ name ] = value );
7907+ }
7908+
7909+ if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
7910+ return ret;
7911+ }
7912+
7913+ return elem[ name ];
7914+ },
7915+
7916+ propHooks: {
7917+ tabIndex: {
7918+ get: function( elem ) {
7919+
7920+ // Support: IE <=9 - 11 only
7921+ // elem.tabIndex doesn't always return the
7922+ // correct value when it hasn't been explicitly set
7923+ // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
7924+ // Use proper attribute retrieval(#12072)
7925+ var tabindex = jQuery.find.attr( elem, "tabindex" );
7926+
7927+ if ( tabindex ) {
7928+ return parseInt( tabindex, 10 );
7929+ }
7930+
7931+ if (
7932+ rfocusable.test( elem.nodeName ) ||
7933+ rclickable.test( elem.nodeName ) &&
7934+ elem.href
7935+ ) {
7936+ return 0;
7937+ }
7938+
7939+ return -1;
7940+ }
7941+ }
7942+ },
7943+
7944+ propFix: {
7945+ "for": "htmlFor",
7946+ "class": "className"
7947+ }
7948+} );
7949+
7950+// Support: IE <=11 only
7951+// Accessing the selectedIndex property
7952+// forces the browser to respect setting selected
7953+// on the option
7954+// The getter ensures a default option is selected
7955+// when in an optgroup
7956+// eslint rule "no-unused-expressions" is disabled for this code
7957+// since it considers such accessions noop
7958+if ( !support.optSelected ) {
7959+ jQuery.propHooks.selected = {
7960+ get: function( elem ) {
7961+
7962+ /* eslint no-unused-expressions: "off" */
7963+
7964+ var parent = elem.parentNode;
7965+ if ( parent && parent.parentNode ) {
7966+ parent.parentNode.selectedIndex;
7967+ }
7968+ return null;
7969+ },
7970+ set: function( elem ) {
7971+
7972+ /* eslint no-unused-expressions: "off" */
7973+
7974+ var parent = elem.parentNode;
7975+ if ( parent ) {
7976+ parent.selectedIndex;
7977+
7978+ if ( parent.parentNode ) {
7979+ parent.parentNode.selectedIndex;
7980+ }
7981+ }
7982+ }
7983+ };
7984+}
7985+
7986+jQuery.each( [
7987+ "tabIndex",
7988+ "readOnly",
7989+ "maxLength",
7990+ "cellSpacing",
7991+ "cellPadding",
7992+ "rowSpan",
7993+ "colSpan",
7994+ "useMap",
7995+ "frameBorder",
7996+ "contentEditable"
7997+], function() {
7998+ jQuery.propFix[ this.toLowerCase() ] = this;
7999+} );
8000+
8001+
8002+
8003+
8004+ // Strip and collapse whitespace according to HTML spec
8005+ // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
8006+ function stripAndCollapse( value ) {
8007+ var tokens = value.match( rnothtmlwhite ) || [];
8008+ return tokens.join( " " );
8009+ }
8010+
8011+
8012+function getClass( elem ) {
8013+ return elem.getAttribute && elem.getAttribute( "class" ) || "";
8014+}
8015+
8016+function classesToArray( value ) {
8017+ if ( Array.isArray( value ) ) {
8018+ return value;
8019+ }
8020+ if ( typeof value === "string" ) {
8021+ return value.match( rnothtmlwhite ) || [];
8022+ }
8023+ return [];
8024+}
8025+
8026+jQuery.fn.extend( {
8027+ addClass: function( value ) {
8028+ var classes, elem, cur, curValue, clazz, j, finalValue,
8029+ i = 0;
8030+
8031+ if ( isFunction( value ) ) {
8032+ return this.each( function( j ) {
8033+ jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
8034+ } );
8035+ }
8036+
8037+ classes = classesToArray( value );
8038+
8039+ if ( classes.length ) {
8040+ while ( ( elem = this[ i++ ] ) ) {
8041+ curValue = getClass( elem );
8042+ cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8043+
8044+ if ( cur ) {
8045+ j = 0;
8046+ while ( ( clazz = classes[ j++ ] ) ) {
8047+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
8048+ cur += clazz + " ";
8049+ }
8050+ }
8051+
8052+ // Only assign if different to avoid unneeded rendering.
8053+ finalValue = stripAndCollapse( cur );
8054+ if ( curValue !== finalValue ) {
8055+ elem.setAttribute( "class", finalValue );
8056+ }
8057+ }
8058+ }
8059+ }
8060+
8061+ return this;
8062+ },
8063+
8064+ removeClass: function( value ) {
8065+ var classes, elem, cur, curValue, clazz, j, finalValue,
8066+ i = 0;
8067+
8068+ if ( isFunction( value ) ) {
8069+ return this.each( function( j ) {
8070+ jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
8071+ } );
8072+ }
8073+
8074+ if ( !arguments.length ) {
8075+ return this.attr( "class", "" );
8076+ }
8077+
8078+ classes = classesToArray( value );
8079+
8080+ if ( classes.length ) {
8081+ while ( ( elem = this[ i++ ] ) ) {
8082+ curValue = getClass( elem );
8083+
8084+ // This expression is here for better compressibility (see addClass)
8085+ cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8086+
8087+ if ( cur ) {
8088+ j = 0;
8089+ while ( ( clazz = classes[ j++ ] ) ) {
8090+
8091+ // Remove *all* instances
8092+ while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
8093+ cur = cur.replace( " " + clazz + " ", " " );
8094+ }
8095+ }
8096+
8097+ // Only assign if different to avoid unneeded rendering.
8098+ finalValue = stripAndCollapse( cur );
8099+ if ( curValue !== finalValue ) {
8100+ elem.setAttribute( "class", finalValue );
8101+ }
8102+ }
8103+ }
8104+ }
8105+
8106+ return this;
8107+ },
8108+
8109+ toggleClass: function( value, stateVal ) {
8110+ var type = typeof value,
8111+ isValidValue = type === "string" || Array.isArray( value );
8112+
8113+ if ( typeof stateVal === "boolean" && isValidValue ) {
8114+ return stateVal ? this.addClass( value ) : this.removeClass( value );
8115+ }
8116+
8117+ if ( isFunction( value ) ) {
8118+ return this.each( function( i ) {
8119+ jQuery( this ).toggleClass(
8120+ value.call( this, i, getClass( this ), stateVal ),
8121+ stateVal
8122+ );
8123+ } );
8124+ }
8125+
8126+ return this.each( function() {
8127+ var className, i, self, classNames;
8128+
8129+ if ( isValidValue ) {
8130+
8131+ // Toggle individual class names
8132+ i = 0;
8133+ self = jQuery( this );
8134+ classNames = classesToArray( value );
8135+
8136+ while ( ( className = classNames[ i++ ] ) ) {
8137+
8138+ // Check each className given, space separated list
8139+ if ( self.hasClass( className ) ) {
8140+ self.removeClass( className );
8141+ } else {
8142+ self.addClass( className );
8143+ }
8144+ }
8145+
8146+ // Toggle whole class name
8147+ } else if ( value === undefined || type === "boolean" ) {
8148+ className = getClass( this );
8149+ if ( className ) {
8150+
8151+ // Store className if set
8152+ dataPriv.set( this, "__className__", className );
8153+ }
8154+
8155+ // If the element has a class name or if we're passed `false`,
8156+ // then remove the whole classname (if there was one, the above saved it).
8157+ // Otherwise bring back whatever was previously saved (if anything),
8158+ // falling back to the empty string if nothing was stored.
8159+ if ( this.setAttribute ) {
8160+ this.setAttribute( "class",
8161+ className || value === false ?
8162+ "" :
8163+ dataPriv.get( this, "__className__" ) || ""
8164+ );
8165+ }
8166+ }
8167+ } );
8168+ },
8169+
8170+ hasClass: function( selector ) {
8171+ var className, elem,
8172+ i = 0;
8173+
8174+ className = " " + selector + " ";
8175+ while ( ( elem = this[ i++ ] ) ) {
8176+ if ( elem.nodeType === 1 &&
8177+ ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
8178+ return true;
8179+ }
8180+ }
8181+
8182+ return false;
8183+ }
8184+} );
8185+
8186+
8187+
8188+
8189+var rreturn = /\r/g;
8190+
8191+jQuery.fn.extend( {
8192+ val: function( value ) {
8193+ var hooks, ret, valueIsFunction,
8194+ elem = this[ 0 ];
8195+
8196+ if ( !arguments.length ) {
8197+ if ( elem ) {
8198+ hooks = jQuery.valHooks[ elem.type ] ||
8199+ jQuery.valHooks[ elem.nodeName.toLowerCase() ];
8200+
8201+ if ( hooks &&
8202+ "get" in hooks &&
8203+ ( ret = hooks.get( elem, "value" ) ) !== undefined
8204+ ) {
8205+ return ret;
8206+ }
8207+
8208+ ret = elem.value;
8209+
8210+ // Handle most common string cases
8211+ if ( typeof ret === "string" ) {
8212+ return ret.replace( rreturn, "" );
8213+ }
8214+
8215+ // Handle cases where value is null/undef or number
8216+ return ret == null ? "" : ret;
8217+ }
8218+
8219+ return;
8220+ }
8221+
8222+ valueIsFunction = isFunction( value );
8223+
8224+ return this.each( function( i ) {
8225+ var val;
8226+
8227+ if ( this.nodeType !== 1 ) {
8228+ return;
8229+ }
8230+
8231+ if ( valueIsFunction ) {
8232+ val = value.call( this, i, jQuery( this ).val() );
8233+ } else {
8234+ val = value;
8235+ }
8236+
8237+ // Treat null/undefined as ""; convert numbers to string
8238+ if ( val == null ) {
8239+ val = "";
8240+
8241+ } else if ( typeof val === "number" ) {
8242+ val += "";
8243+
8244+ } else if ( Array.isArray( val ) ) {
8245+ val = jQuery.map( val, function( value ) {
8246+ return value == null ? "" : value + "";
8247+ } );
8248+ }
8249+
8250+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
8251+
8252+ // If set returns undefined, fall back to normal setting
8253+ if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
8254+ this.value = val;
8255+ }
8256+ } );
8257+ }
8258+} );
8259+
8260+jQuery.extend( {
8261+ valHooks: {
8262+ option: {
8263+ get: function( elem ) {
8264+
8265+ var val = jQuery.find.attr( elem, "value" );
8266+ return val != null ?
8267+ val :
8268+
8269+ // Support: IE <=10 - 11 only
8270+ // option.text throws exceptions (#14686, #14858)
8271+ // Strip and collapse whitespace
8272+ // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8273+ stripAndCollapse( jQuery.text( elem ) );
8274+ }
8275+ },
8276+ select: {
8277+ get: function( elem ) {
8278+ var value, option, i,
8279+ options = elem.options,
8280+ index = elem.selectedIndex,
8281+ one = elem.type === "select-one",
8282+ values = one ? null : [],
8283+ max = one ? index + 1 : options.length;
8284+
8285+ if ( index < 0 ) {
8286+ i = max;
8287+
8288+ } else {
8289+ i = one ? index : 0;
8290+ }
8291+
8292+ // Loop through all the selected options
8293+ for ( ; i < max; i++ ) {
8294+ option = options[ i ];
8295+
8296+ // Support: IE <=9 only
8297+ // IE8-9 doesn't update selected after form reset (#2551)
8298+ if ( ( option.selected || i === index ) &&
8299+
8300+ // Don't return options that are disabled or in a disabled optgroup
8301+ !option.disabled &&
8302+ ( !option.parentNode.disabled ||
8303+ !nodeName( option.parentNode, "optgroup" ) ) ) {
8304+
8305+ // Get the specific value for the option
8306+ value = jQuery( option ).val();
8307+
8308+ // We don't need an array for one selects
8309+ if ( one ) {
8310+ return value;
8311+ }
8312+
8313+ // Multi-Selects return an array
8314+ values.push( value );
8315+ }
8316+ }
8317+
8318+ return values;
8319+ },
8320+
8321+ set: function( elem, value ) {
8322+ var optionSet, option,
8323+ options = elem.options,
8324+ values = jQuery.makeArray( value ),
8325+ i = options.length;
8326+
8327+ while ( i-- ) {
8328+ option = options[ i ];
8329+
8330+ /* eslint-disable no-cond-assign */
8331+
8332+ if ( option.selected =
8333+ jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
8334+ ) {
8335+ optionSet = true;
8336+ }
8337+
8338+ /* eslint-enable no-cond-assign */
8339+ }
8340+
8341+ // Force browsers to behave consistently when non-matching value is set
8342+ if ( !optionSet ) {
8343+ elem.selectedIndex = -1;
8344+ }
8345+ return values;
8346+ }
8347+ }
8348+ }
8349+} );
8350+
8351+// Radios and checkboxes getter/setter
8352+jQuery.each( [ "radio", "checkbox" ], function() {
8353+ jQuery.valHooks[ this ] = {
8354+ set: function( elem, value ) {
8355+ if ( Array.isArray( value ) ) {
8356+ return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
8357+ }
8358+ }
8359+ };
8360+ if ( !support.checkOn ) {
8361+ jQuery.valHooks[ this ].get = function( elem ) {
8362+ return elem.getAttribute( "value" ) === null ? "on" : elem.value;
8363+ };
8364+ }
8365+} );
8366+
8367+
8368+
8369+
8370+// Return jQuery for attributes-only inclusion
8371+
8372+
8373+support.focusin = "onfocusin" in window;
8374+
8375+
8376+var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
8377+ stopPropagationCallback = function( e ) {
8378+ e.stopPropagation();
8379+ };
8380+
8381+jQuery.extend( jQuery.event, {
8382+
8383+ trigger: function( event, data, elem, onlyHandlers ) {
8384+
8385+ var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
8386+ eventPath = [ elem || document ],
8387+ type = hasOwn.call( event, "type" ) ? event.type : event,
8388+ namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
8389+
8390+ cur = lastElement = tmp = elem = elem || document;
8391+
8392+ // Don't do events on text and comment nodes
8393+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
8394+ return;
8395+ }
8396+
8397+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
8398+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
8399+ return;
8400+ }
8401+
8402+ if ( type.indexOf( "." ) > -1 ) {
8403+
8404+ // Namespaced trigger; create a regexp to match event type in handle()
8405+ namespaces = type.split( "." );
8406+ type = namespaces.shift();
8407+ namespaces.sort();
8408+ }
8409+ ontype = type.indexOf( ":" ) < 0 && "on" + type;
8410+
8411+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
8412+ event = event[ jQuery.expando ] ?
8413+ event :
8414+ new jQuery.Event( type, typeof event === "object" && event );
8415+
8416+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
8417+ event.isTrigger = onlyHandlers ? 2 : 3;
8418+ event.namespace = namespaces.join( "." );
8419+ event.rnamespace = event.namespace ?
8420+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
8421+ null;
8422+
8423+ // Clean up the event in case it is being reused
8424+ event.result = undefined;
8425+ if ( !event.target ) {
8426+ event.target = elem;
8427+ }
8428+
8429+ // Clone any incoming data and prepend the event, creating the handler arg list
8430+ data = data == null ?
8431+ [ event ] :
8432+ jQuery.makeArray( data, [ event ] );
8433+
8434+ // Allow special events to draw outside the lines
8435+ special = jQuery.event.special[ type ] || {};
8436+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
8437+ return;
8438+ }
8439+
8440+ // Determine event propagation path in advance, per W3C events spec (#9951)
8441+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
8442+ if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
8443+
8444+ bubbleType = special.delegateType || type;
8445+ if ( !rfocusMorph.test( bubbleType + type ) ) {
8446+ cur = cur.parentNode;
8447+ }
8448+ for ( ; cur; cur = cur.parentNode ) {
8449+ eventPath.push( cur );
8450+ tmp = cur;
8451+ }
8452+
8453+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
8454+ if ( tmp === ( elem.ownerDocument || document ) ) {
8455+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
8456+ }
8457+ }
8458+
8459+ // Fire handlers on the event path
8460+ i = 0;
8461+ while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
8462+ lastElement = cur;
8463+ event.type = i > 1 ?
8464+ bubbleType :
8465+ special.bindType || type;
8466+
8467+ // jQuery handler
8468+ handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
8469+ dataPriv.get( cur, "handle" );
8470+ if ( handle ) {
8471+ handle.apply( cur, data );
8472+ }
8473+
8474+ // Native handler
8475+ handle = ontype && cur[ ontype ];
8476+ if ( handle && handle.apply && acceptData( cur ) ) {
8477+ event.result = handle.apply( cur, data );
8478+ if ( event.result === false ) {
8479+ event.preventDefault();
8480+ }
8481+ }
8482+ }
8483+ event.type = type;
8484+
8485+ // If nobody prevented the default action, do it now
8486+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
8487+
8488+ if ( ( !special._default ||
8489+ special._default.apply( eventPath.pop(), data ) === false ) &&
8490+ acceptData( elem ) ) {
8491+
8492+ // Call a native DOM method on the target with the same name as the event.
8493+ // Don't do default actions on window, that's where global variables be (#6170)
8494+ if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
8495+
8496+ // Don't re-trigger an onFOO event when we call its FOO() method
8497+ tmp = elem[ ontype ];
8498+
8499+ if ( tmp ) {
8500+ elem[ ontype ] = null;
8501+ }
8502+
8503+ // Prevent re-triggering of the same event, since we already bubbled it above
8504+ jQuery.event.triggered = type;
8505+
8506+ if ( event.isPropagationStopped() ) {
8507+ lastElement.addEventListener( type, stopPropagationCallback );
8508+ }
8509+
8510+ elem[ type ]();
8511+
8512+ if ( event.isPropagationStopped() ) {
8513+ lastElement.removeEventListener( type, stopPropagationCallback );
8514+ }
8515+
8516+ jQuery.event.triggered = undefined;
8517+
8518+ if ( tmp ) {
8519+ elem[ ontype ] = tmp;
8520+ }
8521+ }
8522+ }
8523+ }
8524+
8525+ return event.result;
8526+ },
8527+
8528+ // Piggyback on a donor event to simulate a different one
8529+ // Used only for `focus(in | out)` events
8530+ simulate: function( type, elem, event ) {
8531+ var e = jQuery.extend(
8532+ new jQuery.Event(),
8533+ event,
8534+ {
8535+ type: type,
8536+ isSimulated: true
8537+ }
8538+ );
8539+
8540+ jQuery.event.trigger( e, null, elem );
8541+ }
8542+
8543+} );
8544+
8545+jQuery.fn.extend( {
8546+
8547+ trigger: function( type, data ) {
8548+ return this.each( function() {
8549+ jQuery.event.trigger( type, data, this );
8550+ } );
8551+ },
8552+ triggerHandler: function( type, data ) {
8553+ var elem = this[ 0 ];
8554+ if ( elem ) {
8555+ return jQuery.event.trigger( type, data, elem, true );
8556+ }
8557+ }
8558+} );
8559+
8560+
8561+// Support: Firefox <=44
8562+// Firefox doesn't have focus(in | out) events
8563+// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
8564+//
8565+// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
8566+// focus(in | out) events fire after focus & blur events,
8567+// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
8568+// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
8569+if ( !support.focusin ) {
8570+ jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
8571+
8572+ // Attach a single capturing handler on the document while someone wants focusin/focusout
8573+ var handler = function( event ) {
8574+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
8575+ };
8576+
8577+ jQuery.event.special[ fix ] = {
8578+ setup: function() {
8579+ var doc = this.ownerDocument || this,
8580+ attaches = dataPriv.access( doc, fix );
8581+
8582+ if ( !attaches ) {
8583+ doc.addEventListener( orig, handler, true );
8584+ }
8585+ dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
8586+ },
8587+ teardown: function() {
8588+ var doc = this.ownerDocument || this,
8589+ attaches = dataPriv.access( doc, fix ) - 1;
8590+
8591+ if ( !attaches ) {
8592+ doc.removeEventListener( orig, handler, true );
8593+ dataPriv.remove( doc, fix );
8594+
8595+ } else {
8596+ dataPriv.access( doc, fix, attaches );
8597+ }
8598+ }
8599+ };
8600+ } );
8601+}
8602+var location = window.location;
8603+
8604+var nonce = Date.now();
8605+
8606+var rquery = ( /\?/ );
8607+
8608+
8609+
8610+// Cross-browser xml parsing
8611+jQuery.parseXML = function( data ) {
8612+ var xml;
8613+ if ( !data || typeof data !== "string" ) {
8614+ return null;
8615+ }
8616+
8617+ // Support: IE 9 - 11 only
8618+ // IE throws on parseFromString with invalid input.
8619+ try {
8620+ xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8621+ } catch ( e ) {
8622+ xml = undefined;
8623+ }
8624+
8625+ if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
8626+ jQuery.error( "Invalid XML: " + data );
8627+ }
8628+ return xml;
8629+};
8630+
8631+
8632+var
8633+ rbracket = /\[\]$/,
8634+ rCRLF = /\r?\n/g,
8635+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
8636+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
8637+
8638+function buildParams( prefix, obj, traditional, add ) {
8639+ var name;
8640+
8641+ if ( Array.isArray( obj ) ) {
8642+
8643+ // Serialize array item.
8644+ jQuery.each( obj, function( i, v ) {
8645+ if ( traditional || rbracket.test( prefix ) ) {
8646+
8647+ // Treat each array item as a scalar.
8648+ add( prefix, v );
8649+
8650+ } else {
8651+
8652+ // Item is non-scalar (array or object), encode its numeric index.
8653+ buildParams(
8654+ prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
8655+ v,
8656+ traditional,
8657+ add
8658+ );
8659+ }
8660+ } );
8661+
8662+ } else if ( !traditional && toType( obj ) === "object" ) {
8663+
8664+ // Serialize object item.
8665+ for ( name in obj ) {
8666+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
8667+ }
8668+
8669+ } else {
8670+
8671+ // Serialize scalar item.
8672+ add( prefix, obj );
8673+ }
8674+}
8675+
8676+// Serialize an array of form elements or a set of
8677+// key/values into a query string
8678+jQuery.param = function( a, traditional ) {
8679+ var prefix,
8680+ s = [],
8681+ add = function( key, valueOrFunction ) {
8682+
8683+ // If value is a function, invoke it and use its return value
8684+ var value = isFunction( valueOrFunction ) ?
8685+ valueOrFunction() :
8686+ valueOrFunction;
8687+
8688+ s[ s.length ] = encodeURIComponent( key ) + "=" +
8689+ encodeURIComponent( value == null ? "" : value );
8690+ };
8691+
8692+ if ( a == null ) {
8693+ return "";
8694+ }
8695+
8696+ // If an array was passed in, assume that it is an array of form elements.
8697+ if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8698+
8699+ // Serialize the form elements
8700+ jQuery.each( a, function() {
8701+ add( this.name, this.value );
8702+ } );
8703+
8704+ } else {
8705+
8706+ // If traditional, encode the "old" way (the way 1.3.2 or older
8707+ // did it), otherwise encode params recursively.
8708+ for ( prefix in a ) {
8709+ buildParams( prefix, a[ prefix ], traditional, add );
8710+ }
8711+ }
8712+
8713+ // Return the resulting serialization
8714+ return s.join( "&" );
8715+};
8716+
8717+jQuery.fn.extend( {
8718+ serialize: function() {
8719+ return jQuery.param( this.serializeArray() );
8720+ },
8721+ serializeArray: function() {
8722+ return this.map( function() {
8723+
8724+ // Can add propHook for "elements" to filter or add form elements
8725+ var elements = jQuery.prop( this, "elements" );
8726+ return elements ? jQuery.makeArray( elements ) : this;
8727+ } )
8728+ .filter( function() {
8729+ var type = this.type;
8730+
8731+ // Use .is( ":disabled" ) so that fieldset[disabled] works
8732+ return this.name && !jQuery( this ).is( ":disabled" ) &&
8733+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8734+ ( this.checked || !rcheckableType.test( type ) );
8735+ } )
8736+ .map( function( i, elem ) {
8737+ var val = jQuery( this ).val();
8738+
8739+ if ( val == null ) {
8740+ return null;
8741+ }
8742+
8743+ if ( Array.isArray( val ) ) {
8744+ return jQuery.map( val, function( val ) {
8745+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8746+ } );
8747+ }
8748+
8749+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8750+ } ).get();
8751+ }
8752+} );
8753+
8754+
8755+var
8756+ r20 = /%20/g,
8757+ rhash = /#.*$/,
8758+ rantiCache = /([?&])_=[^&]*/,
8759+ rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
8760+
8761+ // #7653, #8125, #8152: local protocol detection
8762+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
8763+ rnoContent = /^(?:GET|HEAD)$/,
8764+ rprotocol = /^\/\//,
8765+
8766+ /* Prefilters
8767+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
8768+ * 2) These are called:
8769+ * - BEFORE asking for a transport
8770+ * - AFTER param serialization (s.data is a string if s.processData is true)
8771+ * 3) key is the dataType
8772+ * 4) the catchall symbol "*" can be used
8773+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed
8774+ */
8775+ prefilters = {},
8776+
8777+ /* Transports bindings
8778+ * 1) key is the dataType
8779+ * 2) the catchall symbol "*" can be used
8780+ * 3) selection will start with transport dataType and THEN go to "*" if needed
8781+ */
8782+ transports = {},
8783+
8784+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
8785+ allTypes = "*/".concat( "*" ),
8786+
8787+ // Anchor tag for parsing the document origin
8788+ originAnchor = document.createElement( "a" );
8789+ originAnchor.href = location.href;
8790+
8791+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
8792+function addToPrefiltersOrTransports( structure ) {
8793+
8794+ // dataTypeExpression is optional and defaults to "*"
8795+ return function( dataTypeExpression, func ) {
8796+
8797+ if ( typeof dataTypeExpression !== "string" ) {
8798+ func = dataTypeExpression;
8799+ dataTypeExpression = "*";
8800+ }
8801+
8802+ var dataType,
8803+ i = 0,
8804+ dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
8805+
8806+ if ( isFunction( func ) ) {
8807+
8808+ // For each dataType in the dataTypeExpression
8809+ while ( ( dataType = dataTypes[ i++ ] ) ) {
8810+
8811+ // Prepend if requested
8812+ if ( dataType[ 0 ] === "+" ) {
8813+ dataType = dataType.slice( 1 ) || "*";
8814+ ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
8815+
8816+ // Otherwise append
8817+ } else {
8818+ ( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
8819+ }
8820+ }
8821+ }
8822+ };
8823+}
8824+
8825+// Base inspection function for prefilters and transports
8826+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
8827+
8828+ var inspected = {},
8829+ seekingTransport = ( structure === transports );
8830+
8831+ function inspect( dataType ) {
8832+ var selected;
8833+ inspected[ dataType ] = true;
8834+ jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
8835+ var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
8836+ if ( typeof dataTypeOrTransport === "string" &&
8837+ !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
8838+
8839+ options.dataTypes.unshift( dataTypeOrTransport );
8840+ inspect( dataTypeOrTransport );
8841+ return false;
8842+ } else if ( seekingTransport ) {
8843+ return !( selected = dataTypeOrTransport );
8844+ }
8845+ } );
8846+ return selected;
8847+ }
8848+
8849+ return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
8850+}
8851+
8852+// A special extend for ajax options
8853+// that takes "flat" options (not to be deep extended)
8854+// Fixes #9887
8855+function ajaxExtend( target, src ) {
8856+ var key, deep,
8857+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
8858+
8859+ for ( key in src ) {
8860+ if ( src[ key ] !== undefined ) {
8861+ ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
8862+ }
8863+ }
8864+ if ( deep ) {
8865+ jQuery.extend( true, target, deep );
8866+ }
8867+
8868+ return target;
8869+}
8870+
8871+/* Handles responses to an ajax request:
8872+ * - finds the right dataType (mediates between content-type and expected dataType)
8873+ * - returns the corresponding response
8874+ */
8875+function ajaxHandleResponses( s, jqXHR, responses ) {
8876+
8877+ var ct, type, finalDataType, firstDataType,
8878+ contents = s.contents,
8879+ dataTypes = s.dataTypes;
8880+
8881+ // Remove auto dataType and get content-type in the process
8882+ while ( dataTypes[ 0 ] === "*" ) {
8883+ dataTypes.shift();
8884+ if ( ct === undefined ) {
8885+ ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
8886+ }
8887+ }
8888+
8889+ // Check if we're dealing with a known content-type
8890+ if ( ct ) {
8891+ for ( type in contents ) {
8892+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
8893+ dataTypes.unshift( type );
8894+ break;
8895+ }
8896+ }
8897+ }
8898+
8899+ // Check to see if we have a response for the expected dataType
8900+ if ( dataTypes[ 0 ] in responses ) {
8901+ finalDataType = dataTypes[ 0 ];
8902+ } else {
8903+
8904+ // Try convertible dataTypes
8905+ for ( type in responses ) {
8906+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
8907+ finalDataType = type;
8908+ break;
8909+ }
8910+ if ( !firstDataType ) {
8911+ firstDataType = type;
8912+ }
8913+ }
8914+
8915+ // Or just use first one
8916+ finalDataType = finalDataType || firstDataType;
8917+ }
8918+
8919+ // If we found a dataType
8920+ // We add the dataType to the list if needed
8921+ // and return the corresponding response
8922+ if ( finalDataType ) {
8923+ if ( finalDataType !== dataTypes[ 0 ] ) {
8924+ dataTypes.unshift( finalDataType );
8925+ }
8926+ return responses[ finalDataType ];
8927+ }
8928+}
8929+
8930+/* Chain conversions given the request and the original response
8931+ * Also sets the responseXXX fields on the jqXHR instance
8932+ */
8933+function ajaxConvert( s, response, jqXHR, isSuccess ) {
8934+ var conv2, current, conv, tmp, prev,
8935+ converters = {},
8936+
8937+ // Work with a copy of dataTypes in case we need to modify it for conversion
8938+ dataTypes = s.dataTypes.slice();
8939+
8940+ // Create converters map with lowercased keys
8941+ if ( dataTypes[ 1 ] ) {
8942+ for ( conv in s.converters ) {
8943+ converters[ conv.toLowerCase() ] = s.converters[ conv ];
8944+ }
8945+ }
8946+
8947+ current = dataTypes.shift();
8948+
8949+ // Convert to each sequential dataType
8950+ while ( current ) {
8951+
8952+ if ( s.responseFields[ current ] ) {
8953+ jqXHR[ s.responseFields[ current ] ] = response;
8954+ }
8955+
8956+ // Apply the dataFilter if provided
8957+ if ( !prev && isSuccess && s.dataFilter ) {
8958+ response = s.dataFilter( response, s.dataType );
8959+ }
8960+
8961+ prev = current;
8962+ current = dataTypes.shift();
8963+
8964+ if ( current ) {
8965+
8966+ // There's only work to do if current dataType is non-auto
8967+ if ( current === "*" ) {
8968+
8969+ current = prev;
8970+
8971+ // Convert response if prev dataType is non-auto and differs from current
8972+ } else if ( prev !== "*" && prev !== current ) {
8973+
8974+ // Seek a direct converter
8975+ conv = converters[ prev + " " + current ] || converters[ "* " + current ];
8976+
8977+ // If none found, seek a pair
8978+ if ( !conv ) {
8979+ for ( conv2 in converters ) {
8980+
8981+ // If conv2 outputs current
8982+ tmp = conv2.split( " " );
8983+ if ( tmp[ 1 ] === current ) {
8984+
8985+ // If prev can be converted to accepted input
8986+ conv = converters[ prev + " " + tmp[ 0 ] ] ||
8987+ converters[ "* " + tmp[ 0 ] ];
8988+ if ( conv ) {
8989+
8990+ // Condense equivalence converters
8991+ if ( conv === true ) {
8992+ conv = converters[ conv2 ];
8993+
8994+ // Otherwise, insert the intermediate dataType
8995+ } else if ( converters[ conv2 ] !== true ) {
8996+ current = tmp[ 0 ];
8997+ dataTypes.unshift( tmp[ 1 ] );
8998+ }
8999+ break;
9000+ }
9001+ }
9002+ }
9003+ }
9004+
9005+ // Apply converter (if not an equivalence)
9006+ if ( conv !== true ) {
9007+
9008+ // Unless errors are allowed to bubble, catch and return them
9009+ if ( conv && s.throws ) {
9010+ response = conv( response );
9011+ } else {
9012+ try {
9013+ response = conv( response );
9014+ } catch ( e ) {
9015+ return {
9016+ state: "parsererror",
9017+ error: conv ? e : "No conversion from " + prev + " to " + current
9018+ };
9019+ }
9020+ }
9021+ }
9022+ }
9023+ }
9024+ }
9025+
9026+ return { state: "success", data: response };
9027+}
9028+
9029+jQuery.extend( {
9030+
9031+ // Counter for holding the number of active queries
9032+ active: 0,
9033+
9034+ // Last-Modified header cache for next request
9035+ lastModified: {},
9036+ etag: {},
9037+
9038+ ajaxSettings: {
9039+ url: location.href,
9040+ type: "GET",
9041+ isLocal: rlocalProtocol.test( location.protocol ),
9042+ global: true,
9043+ processData: true,
9044+ async: true,
9045+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",
9046+
9047+ /*
9048+ timeout: 0,
9049+ data: null,
9050+ dataType: null,
9051+ username: null,
9052+ password: null,
9053+ cache: null,
9054+ throws: false,
9055+ traditional: false,
9056+ headers: {},
9057+ */
9058+
9059+ accepts: {
9060+ "*": allTypes,
9061+ text: "text/plain",
9062+ html: "text/html",
9063+ xml: "application/xml, text/xml",
9064+ json: "application/json, text/javascript"
9065+ },
9066+
9067+ contents: {
9068+ xml: /\bxml\b/,
9069+ html: /\bhtml/,
9070+ json: /\bjson\b/
9071+ },
9072+
9073+ responseFields: {
9074+ xml: "responseXML",
9075+ text: "responseText",
9076+ json: "responseJSON"
9077+ },
9078+
9079+ // Data converters
9080+ // Keys separate source (or catchall "*") and destination types with a single space
9081+ converters: {
9082+
9083+ // Convert anything to text
9084+ "* text": String,
9085+
9086+ // Text to html (true = no transformation)
9087+ "text html": true,
9088+
9089+ // Evaluate text as a json expression
9090+ "text json": JSON.parse,
9091+
9092+ // Parse text as xml
9093+ "text xml": jQuery.parseXML
9094+ },
9095+
9096+ // For options that shouldn't be deep extended:
9097+ // you can add your own custom options here if
9098+ // and when you create one that shouldn't be
9099+ // deep extended (see ajaxExtend)
9100+ flatOptions: {
9101+ url: true,
9102+ context: true
9103+ }
9104+ },
9105+
9106+ // Creates a full fledged settings object into target
9107+ // with both ajaxSettings and settings fields.
9108+ // If target is omitted, writes into ajaxSettings.
9109+ ajaxSetup: function( target, settings ) {
9110+ return settings ?
9111+
9112+ // Building a settings object
9113+ ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
9114+
9115+ // Extending ajaxSettings
9116+ ajaxExtend( jQuery.ajaxSettings, target );
9117+ },
9118+
9119+ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
9120+ ajaxTransport: addToPrefiltersOrTransports( transports ),
9121+
9122+ // Main method
9123+ ajax: function( url, options ) {
9124+
9125+ // If url is an object, simulate pre-1.5 signature
9126+ if ( typeof url === "object" ) {
9127+ options = url;
9128+ url = undefined;
9129+ }
9130+
9131+ // Force options to be an object
9132+ options = options || {};
9133+
9134+ var transport,
9135+
9136+ // URL without anti-cache param
9137+ cacheURL,
9138+
9139+ // Response headers
9140+ responseHeadersString,
9141+ responseHeaders,
9142+
9143+ // timeout handle
9144+ timeoutTimer,
9145+
9146+ // Url cleanup var
9147+ urlAnchor,
9148+
9149+ // Request state (becomes false upon send and true upon completion)
9150+ completed,
9151+
9152+ // To know if global events are to be dispatched
9153+ fireGlobals,
9154+
9155+ // Loop variable
9156+ i,
9157+
9158+ // uncached part of the url
9159+ uncached,
9160+
9161+ // Create the final options object
9162+ s = jQuery.ajaxSetup( {}, options ),
9163+
9164+ // Callbacks context
9165+ callbackContext = s.context || s,
9166+
9167+ // Context for global events is callbackContext if it is a DOM node or jQuery collection
9168+ globalEventContext = s.context &&
9169+ ( callbackContext.nodeType || callbackContext.jquery ) ?
9170+ jQuery( callbackContext ) :
9171+ jQuery.event,
9172+
9173+ // Deferreds
9174+ deferred = jQuery.Deferred(),
9175+ completeDeferred = jQuery.Callbacks( "once memory" ),
9176+
9177+ // Status-dependent callbacks
9178+ statusCode = s.statusCode || {},
9179+
9180+ // Headers (they are sent all at once)
9181+ requestHeaders = {},
9182+ requestHeadersNames = {},
9183+
9184+ // Default abort message
9185+ strAbort = "canceled",
9186+
9187+ // Fake xhr
9188+ jqXHR = {
9189+ readyState: 0,
9190+
9191+ // Builds headers hashtable if needed
9192+ getResponseHeader: function( key ) {
9193+ var match;
9194+ if ( completed ) {
9195+ if ( !responseHeaders ) {
9196+ responseHeaders = {};
9197+ while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
9198+ responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
9199+ ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
9200+ .concat( match[ 2 ] );
9201+ }
9202+ }
9203+ match = responseHeaders[ key.toLowerCase() + " " ];
9204+ }
9205+ return match == null ? null : match.join( ", " );
9206+ },
9207+
9208+ // Raw string
9209+ getAllResponseHeaders: function() {
9210+ return completed ? responseHeadersString : null;
9211+ },
9212+
9213+ // Caches the header
9214+ setRequestHeader: function( name, value ) {
9215+ if ( completed == null ) {
9216+ name = requestHeadersNames[ name.toLowerCase() ] =
9217+ requestHeadersNames[ name.toLowerCase() ] || name;
9218+ requestHeaders[ name ] = value;
9219+ }
9220+ return this;
9221+ },
9222+
9223+ // Overrides response content-type header
9224+ overrideMimeType: function( type ) {
9225+ if ( completed == null ) {
9226+ s.mimeType = type;
9227+ }
9228+ return this;
9229+ },
9230+
9231+ // Status-dependent callbacks
9232+ statusCode: function( map ) {
9233+ var code;
9234+ if ( map ) {
9235+ if ( completed ) {
9236+
9237+ // Execute the appropriate callbacks
9238+ jqXHR.always( map[ jqXHR.status ] );
9239+ } else {
9240+
9241+ // Lazy-add the new callbacks in a way that preserves old ones
9242+ for ( code in map ) {
9243+ statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
9244+ }
9245+ }
9246+ }
9247+ return this;
9248+ },
9249+
9250+ // Cancel the request
9251+ abort: function( statusText ) {
9252+ var finalText = statusText || strAbort;
9253+ if ( transport ) {
9254+ transport.abort( finalText );
9255+ }
9256+ done( 0, finalText );
9257+ return this;
9258+ }
9259+ };
9260+
9261+ // Attach deferreds
9262+ deferred.promise( jqXHR );
9263+
9264+ // Add protocol if not provided (prefilters might expect it)
9265+ // Handle falsy url in the settings object (#10093: consistency with old signature)
9266+ // We also use the url parameter if available
9267+ s.url = ( ( url || s.url || location.href ) + "" )
9268+ .replace( rprotocol, location.protocol + "//" );
9269+
9270+ // Alias method option to type as per ticket #12004
9271+ s.type = options.method || options.type || s.method || s.type;
9272+
9273+ // Extract dataTypes list
9274+ s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
9275+
9276+ // A cross-domain request is in order when the origin doesn't match the current origin.
9277+ if ( s.crossDomain == null ) {
9278+ urlAnchor = document.createElement( "a" );
9279+
9280+ // Support: IE <=8 - 11, Edge 12 - 15
9281+ // IE throws exception on accessing the href property if url is malformed,
9282+ // e.g. http://example.com:80x/
9283+ try {
9284+ urlAnchor.href = s.url;
9285+
9286+ // Support: IE <=8 - 11 only
9287+ // Anchor's host property isn't correctly set when s.url is relative
9288+ urlAnchor.href = urlAnchor.href;
9289+ s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
9290+ urlAnchor.protocol + "//" + urlAnchor.host;
9291+ } catch ( e ) {
9292+
9293+ // If there is an error parsing the URL, assume it is crossDomain,
9294+ // it can be rejected by the transport if it is invalid
9295+ s.crossDomain = true;
9296+ }
9297+ }
9298+
9299+ // Convert data if not already a string
9300+ if ( s.data && s.processData && typeof s.data !== "string" ) {
9301+ s.data = jQuery.param( s.data, s.traditional );
9302+ }
9303+
9304+ // Apply prefilters
9305+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
9306+
9307+ // If request was aborted inside a prefilter, stop there
9308+ if ( completed ) {
9309+ return jqXHR;
9310+ }
9311+
9312+ // We can fire global events as of now if asked to
9313+ // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9314+ fireGlobals = jQuery.event && s.global;
9315+
9316+ // Watch for a new set of requests
9317+ if ( fireGlobals && jQuery.active++ === 0 ) {
9318+ jQuery.event.trigger( "ajaxStart" );
9319+ }
9320+
9321+ // Uppercase the type
9322+ s.type = s.type.toUpperCase();
9323+
9324+ // Determine if request has content
9325+ s.hasContent = !rnoContent.test( s.type );
9326+
9327+ // Save the URL in case we're toying with the If-Modified-Since
9328+ // and/or If-None-Match header later on
9329+ // Remove hash to simplify url manipulation
9330+ cacheURL = s.url.replace( rhash, "" );
9331+
9332+ // More options handling for requests with no content
9333+ if ( !s.hasContent ) {
9334+
9335+ // Remember the hash so we can put it back
9336+ uncached = s.url.slice( cacheURL.length );
9337+
9338+ // If data is available and should be processed, append data to url
9339+ if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
9340+ cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
9341+
9342+ // #9682: remove data so that it's not used in an eventual retry
9343+ delete s.data;
9344+ }
9345+
9346+ // Add or update anti-cache param if needed
9347+ if ( s.cache === false ) {
9348+ cacheURL = cacheURL.replace( rantiCache, "$1" );
9349+ uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
9350+ }
9351+
9352+ // Put hash and anti-cache on the URL that will be requested (gh-1732)
9353+ s.url = cacheURL + uncached;
9354+
9355+ // Change '%20' to '+' if this is encoded form body content (gh-2658)
9356+ } else if ( s.data && s.processData &&
9357+ ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
9358+ s.data = s.data.replace( r20, "+" );
9359+ }
9360+
9361+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9362+ if ( s.ifModified ) {
9363+ if ( jQuery.lastModified[ cacheURL ] ) {
9364+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
9365+ }
9366+ if ( jQuery.etag[ cacheURL ] ) {
9367+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
9368+ }
9369+ }
9370+
9371+ // Set the correct header, if data is being sent
9372+ if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
9373+ jqXHR.setRequestHeader( "Content-Type", s.contentType );
9374+ }
9375+
9376+ // Set the Accepts header for the server, depending on the dataType
9377+ jqXHR.setRequestHeader(
9378+ "Accept",
9379+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
9380+ s.accepts[ s.dataTypes[ 0 ] ] +
9381+ ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
9382+ s.accepts[ "*" ]
9383+ );
9384+
9385+ // Check for headers option
9386+ for ( i in s.headers ) {
9387+ jqXHR.setRequestHeader( i, s.headers[ i ] );
9388+ }
9389+
9390+ // Allow custom headers/mimetypes and early abort
9391+ if ( s.beforeSend &&
9392+ ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
9393+
9394+ // Abort if not done already and return
9395+ return jqXHR.abort();
9396+ }
9397+
9398+ // Aborting is no longer a cancellation
9399+ strAbort = "abort";
9400+
9401+ // Install callbacks on deferreds
9402+ completeDeferred.add( s.complete );
9403+ jqXHR.done( s.success );
9404+ jqXHR.fail( s.error );
9405+
9406+ // Get transport
9407+ transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
9408+
9409+ // If no transport, we auto-abort
9410+ if ( !transport ) {
9411+ done( -1, "No Transport" );
9412+ } else {
9413+ jqXHR.readyState = 1;
9414+
9415+ // Send global event
9416+ if ( fireGlobals ) {
9417+ globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
9418+ }
9419+
9420+ // If request was aborted inside ajaxSend, stop there
9421+ if ( completed ) {
9422+ return jqXHR;
9423+ }
9424+
9425+ // Timeout
9426+ if ( s.async && s.timeout > 0 ) {
9427+ timeoutTimer = window.setTimeout( function() {
9428+ jqXHR.abort( "timeout" );
9429+ }, s.timeout );
9430+ }
9431+
9432+ try {
9433+ completed = false;
9434+ transport.send( requestHeaders, done );
9435+ } catch ( e ) {
9436+
9437+ // Rethrow post-completion exceptions
9438+ if ( completed ) {
9439+ throw e;
9440+ }
9441+
9442+ // Propagate others as results
9443+ done( -1, e );
9444+ }
9445+ }
9446+
9447+ // Callback for when everything is done
9448+ function done( status, nativeStatusText, responses, headers ) {
9449+ var isSuccess, success, error, response, modified,
9450+ statusText = nativeStatusText;
9451+
9452+ // Ignore repeat invocations
9453+ if ( completed ) {
9454+ return;
9455+ }
9456+
9457+ completed = true;
9458+
9459+ // Clear timeout if it exists
9460+ if ( timeoutTimer ) {
9461+ window.clearTimeout( timeoutTimer );
9462+ }
9463+
9464+ // Dereference transport for early garbage collection
9465+ // (no matter how long the jqXHR object will be used)
9466+ transport = undefined;
9467+
9468+ // Cache response headers
9469+ responseHeadersString = headers || "";
9470+
9471+ // Set readyState
9472+ jqXHR.readyState = status > 0 ? 4 : 0;
9473+
9474+ // Determine if successful
9475+ isSuccess = status >= 200 && status < 300 || status === 304;
9476+
9477+ // Get response data
9478+ if ( responses ) {
9479+ response = ajaxHandleResponses( s, jqXHR, responses );
9480+ }
9481+
9482+ // Convert no matter what (that way responseXXX fields are always set)
9483+ response = ajaxConvert( s, response, jqXHR, isSuccess );
9484+
9485+ // If successful, handle type chaining
9486+ if ( isSuccess ) {
9487+
9488+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9489+ if ( s.ifModified ) {
9490+ modified = jqXHR.getResponseHeader( "Last-Modified" );
9491+ if ( modified ) {
9492+ jQuery.lastModified[ cacheURL ] = modified;
9493+ }
9494+ modified = jqXHR.getResponseHeader( "etag" );
9495+ if ( modified ) {
9496+ jQuery.etag[ cacheURL ] = modified;
9497+ }
9498+ }
9499+
9500+ // if no content
9501+ if ( status === 204 || s.type === "HEAD" ) {
9502+ statusText = "nocontent";
9503+
9504+ // if not modified
9505+ } else if ( status === 304 ) {
9506+ statusText = "notmodified";
9507+
9508+ // If we have data, let's convert it
9509+ } else {
9510+ statusText = response.state;
9511+ success = response.data;
9512+ error = response.error;
9513+ isSuccess = !error;
9514+ }
9515+ } else {
9516+
9517+ // Extract error from statusText and normalize for non-aborts
9518+ error = statusText;
9519+ if ( status || !statusText ) {
9520+ statusText = "error";
9521+ if ( status < 0 ) {
9522+ status = 0;
9523+ }
9524+ }
9525+ }
9526+
9527+ // Set data for the fake xhr object
9528+ jqXHR.status = status;
9529+ jqXHR.statusText = ( nativeStatusText || statusText ) + "";
9530+
9531+ // Success/Error
9532+ if ( isSuccess ) {
9533+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
9534+ } else {
9535+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
9536+ }
9537+
9538+ // Status-dependent callbacks
9539+ jqXHR.statusCode( statusCode );
9540+ statusCode = undefined;
9541+
9542+ if ( fireGlobals ) {
9543+ globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
9544+ [ jqXHR, s, isSuccess ? success : error ] );
9545+ }
9546+
9547+ // Complete
9548+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
9549+
9550+ if ( fireGlobals ) {
9551+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
9552+
9553+ // Handle the global AJAX counter
9554+ if ( !( --jQuery.active ) ) {
9555+ jQuery.event.trigger( "ajaxStop" );
9556+ }
9557+ }
9558+ }
9559+
9560+ return jqXHR;
9561+ },
9562+
9563+ getJSON: function( url, data, callback ) {
9564+ return jQuery.get( url, data, callback, "json" );
9565+ },
9566+
9567+ getScript: function( url, callback ) {
9568+ return jQuery.get( url, undefined, callback, "script" );
9569+ }
9570+} );
9571+
9572+jQuery.each( [ "get", "post" ], function( i, method ) {
9573+ jQuery[ method ] = function( url, data, callback, type ) {
9574+
9575+ // Shift arguments if data argument was omitted
9576+ if ( isFunction( data ) ) {
9577+ type = type || callback;
9578+ callback = data;
9579+ data = undefined;
9580+ }
9581+
9582+ // The url can be an options object (which then must have .url)
9583+ return jQuery.ajax( jQuery.extend( {
9584+ url: url,
9585+ type: method,
9586+ dataType: type,
9587+ data: data,
9588+ success: callback
9589+ }, jQuery.isPlainObject( url ) && url ) );
9590+ };
9591+} );
9592+
9593+
9594+jQuery._evalUrl = function( url, options ) {
9595+ return jQuery.ajax( {
9596+ url: url,
9597+
9598+ // Make this explicit, since user can override this through ajaxSetup (#11264)
9599+ type: "GET",
9600+ dataType: "script",
9601+ cache: true,
9602+ async: false,
9603+ global: false,
9604+
9605+ // Only evaluate the response if it is successful (gh-4126)
9606+ // dataFilter is not invoked for failure responses, so using it instead
9607+ // of the default converter is kludgy but it works.
9608+ converters: {
9609+ "text script": function() {}
9610+ },
9611+ dataFilter: function( response ) {
9612+ jQuery.globalEval( response, options );
9613+ }
9614+ } );
9615+};
9616+
9617+
9618+jQuery.fn.extend( {
9619+ wrapAll: function( html ) {
9620+ var wrap;
9621+
9622+ if ( this[ 0 ] ) {
9623+ if ( isFunction( html ) ) {
9624+ html = html.call( this[ 0 ] );
9625+ }
9626+
9627+ // The elements to wrap the target around
9628+ wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
9629+
9630+ if ( this[ 0 ].parentNode ) {
9631+ wrap.insertBefore( this[ 0 ] );
9632+ }
9633+
9634+ wrap.map( function() {
9635+ var elem = this;
9636+
9637+ while ( elem.firstElementChild ) {
9638+ elem = elem.firstElementChild;
9639+ }
9640+
9641+ return elem;
9642+ } ).append( this );
9643+ }
9644+
9645+ return this;
9646+ },
9647+
9648+ wrapInner: function( html ) {
9649+ if ( isFunction( html ) ) {
9650+ return this.each( function( i ) {
9651+ jQuery( this ).wrapInner( html.call( this, i ) );
9652+ } );
9653+ }
9654+
9655+ return this.each( function() {
9656+ var self = jQuery( this ),
9657+ contents = self.contents();
9658+
9659+ if ( contents.length ) {
9660+ contents.wrapAll( html );
9661+
9662+ } else {
9663+ self.append( html );
9664+ }
9665+ } );
9666+ },
9667+
9668+ wrap: function( html ) {
9669+ var htmlIsFunction = isFunction( html );
9670+
9671+ return this.each( function( i ) {
9672+ jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
9673+ } );
9674+ },
9675+
9676+ unwrap: function( selector ) {
9677+ this.parent( selector ).not( "body" ).each( function() {
9678+ jQuery( this ).replaceWith( this.childNodes );
9679+ } );
9680+ return this;
9681+ }
9682+} );
9683+
9684+
9685+jQuery.expr.pseudos.hidden = function( elem ) {
9686+ return !jQuery.expr.pseudos.visible( elem );
9687+};
9688+jQuery.expr.pseudos.visible = function( elem ) {
9689+ return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
9690+};
9691+
9692+
9693+
9694+
9695+jQuery.ajaxSettings.xhr = function() {
9696+ try {
9697+ return new window.XMLHttpRequest();
9698+ } catch ( e ) {}
9699+};
9700+
9701+var xhrSuccessStatus = {
9702+
9703+ // File protocol always yields status code 0, assume 200
9704+ 0: 200,
9705+
9706+ // Support: IE <=9 only
9707+ // #1450: sometimes IE returns 1223 when it should be 204
9708+ 1223: 204
9709+ },
9710+ xhrSupported = jQuery.ajaxSettings.xhr();
9711+
9712+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
9713+support.ajax = xhrSupported = !!xhrSupported;
9714+
9715+jQuery.ajaxTransport( function( options ) {
9716+ var callback, errorCallback;
9717+
9718+ // Cross domain only allowed if supported through XMLHttpRequest
9719+ if ( support.cors || xhrSupported && !options.crossDomain ) {
9720+ return {
9721+ send: function( headers, complete ) {
9722+ var i,
9723+ xhr = options.xhr();
9724+
9725+ xhr.open(
9726+ options.type,
9727+ options.url,
9728+ options.async,
9729+ options.username,
9730+ options.password
9731+ );
9732+
9733+ // Apply custom fields if provided
9734+ if ( options.xhrFields ) {
9735+ for ( i in options.xhrFields ) {
9736+ xhr[ i ] = options.xhrFields[ i ];
9737+ }
9738+ }
9739+
9740+ // Override mime type if needed
9741+ if ( options.mimeType && xhr.overrideMimeType ) {
9742+ xhr.overrideMimeType( options.mimeType );
9743+ }
9744+
9745+ // X-Requested-With header
9746+ // For cross-domain requests, seeing as conditions for a preflight are
9747+ // akin to a jigsaw puzzle, we simply never set it to be sure.
9748+ // (it can always be set on a per-request basis or even using ajaxSetup)
9749+ // For same-domain requests, won't change header if already provided.
9750+ if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
9751+ headers[ "X-Requested-With" ] = "XMLHttpRequest";
9752+ }
9753+
9754+ // Set headers
9755+ for ( i in headers ) {
9756+ xhr.setRequestHeader( i, headers[ i ] );
9757+ }
9758+
9759+ // Callback
9760+ callback = function( type ) {
9761+ return function() {
9762+ if ( callback ) {
9763+ callback = errorCallback = xhr.onload =
9764+ xhr.onerror = xhr.onabort = xhr.ontimeout =
9765+ xhr.onreadystatechange = null;
9766+
9767+ if ( type === "abort" ) {
9768+ xhr.abort();
9769+ } else if ( type === "error" ) {
9770+
9771+ // Support: IE <=9 only
9772+ // On a manual native abort, IE9 throws
9773+ // errors on any property access that is not readyState
9774+ if ( typeof xhr.status !== "number" ) {
9775+ complete( 0, "error" );
9776+ } else {
9777+ complete(
9778+
9779+ // File: protocol always yields status 0; see #8605, #14207
9780+ xhr.status,
9781+ xhr.statusText
9782+ );
9783+ }
9784+ } else {
9785+ complete(
9786+ xhrSuccessStatus[ xhr.status ] || xhr.status,
9787+ xhr.statusText,
9788+
9789+ // Support: IE <=9 only
9790+ // IE9 has no XHR2 but throws on binary (trac-11426)
9791+ // For XHR2 non-text, let the caller handle it (gh-2498)
9792+ ( xhr.responseType || "text" ) !== "text" ||
9793+ typeof xhr.responseText !== "string" ?
9794+ { binary: xhr.response } :
9795+ { text: xhr.responseText },
9796+ xhr.getAllResponseHeaders()
9797+ );
9798+ }
9799+ }
9800+ };
9801+ };
9802+
9803+ // Listen to events
9804+ xhr.onload = callback();
9805+ errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
9806+
9807+ // Support: IE 9 only
9808+ // Use onreadystatechange to replace onabort
9809+ // to handle uncaught aborts
9810+ if ( xhr.onabort !== undefined ) {
9811+ xhr.onabort = errorCallback;
9812+ } else {
9813+ xhr.onreadystatechange = function() {
9814+
9815+ // Check readyState before timeout as it changes
9816+ if ( xhr.readyState === 4 ) {
9817+
9818+ // Allow onerror to be called first,
9819+ // but that will not handle a native abort
9820+ // Also, save errorCallback to a variable
9821+ // as xhr.onerror cannot be accessed
9822+ window.setTimeout( function() {
9823+ if ( callback ) {
9824+ errorCallback();
9825+ }
9826+ } );
9827+ }
9828+ };
9829+ }
9830+
9831+ // Create the abort callback
9832+ callback = callback( "abort" );
9833+
9834+ try {
9835+
9836+ // Do send the request (this may raise an exception)
9837+ xhr.send( options.hasContent && options.data || null );
9838+ } catch ( e ) {
9839+
9840+ // #14683: Only rethrow if this hasn't been notified as an error yet
9841+ if ( callback ) {
9842+ throw e;
9843+ }
9844+ }
9845+ },
9846+
9847+ abort: function() {
9848+ if ( callback ) {
9849+ callback();
9850+ }
9851+ }
9852+ };
9853+ }
9854+} );
9855+
9856+
9857+
9858+
9859+// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
9860+jQuery.ajaxPrefilter( function( s ) {
9861+ if ( s.crossDomain ) {
9862+ s.contents.script = false;
9863+ }
9864+} );
9865+
9866+// Install script dataType
9867+jQuery.ajaxSetup( {
9868+ accepts: {
9869+ script: "text/javascript, application/javascript, " +
9870+ "application/ecmascript, application/x-ecmascript"
9871+ },
9872+ contents: {
9873+ script: /\b(?:java|ecma)script\b/
9874+ },
9875+ converters: {
9876+ "text script": function( text ) {
9877+ jQuery.globalEval( text );
9878+ return text;
9879+ }
9880+ }
9881+} );
9882+
9883+// Handle cache's special case and crossDomain
9884+jQuery.ajaxPrefilter( "script", function( s ) {
9885+ if ( s.cache === undefined ) {
9886+ s.cache = false;
9887+ }
9888+ if ( s.crossDomain ) {
9889+ s.type = "GET";
9890+ }
9891+} );
9892+
9893+// Bind script tag hack transport
9894+jQuery.ajaxTransport( "script", function( s ) {
9895+
9896+ // This transport only deals with cross domain or forced-by-attrs requests
9897+ if ( s.crossDomain || s.scriptAttrs ) {
9898+ var script, callback;
9899+ return {
9900+ send: function( _, complete ) {
9901+ script = jQuery( "<script>" )
9902+ .attr( s.scriptAttrs || {} )
9903+ .prop( { charset: s.scriptCharset, src: s.url } )
9904+ .on( "load error", callback = function( evt ) {
9905+ script.remove();
9906+ callback = null;
9907+ if ( evt ) {
9908+ complete( evt.type === "error" ? 404 : 200, evt.type );
9909+ }
9910+ } );
9911+
9912+ // Use native DOM manipulation to avoid our domManip AJAX trickery
9913+ document.head.appendChild( script[ 0 ] );
9914+ },
9915+ abort: function() {
9916+ if ( callback ) {
9917+ callback();
9918+ }
9919+ }
9920+ };
9921+ }
9922+} );
9923+
9924+
9925+
9926+
9927+var oldCallbacks = [],
9928+ rjsonp = /(=)\?(?=&|$)|\?\?/;
9929+
9930+// Default jsonp settings
9931+jQuery.ajaxSetup( {
9932+ jsonp: "callback",
9933+ jsonpCallback: function() {
9934+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
9935+ this[ callback ] = true;
9936+ return callback;
9937+ }
9938+} );
9939+
9940+// Detect, normalize options and install callbacks for jsonp requests
9941+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
9942+
9943+ var callbackName, overwritten, responseContainer,
9944+ jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
9945+ "url" :
9946+ typeof s.data === "string" &&
9947+ ( s.contentType || "" )
9948+ .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
9949+ rjsonp.test( s.data ) && "data"
9950+ );
9951+
9952+ // Handle iff the expected data type is "jsonp" or we have a parameter to set
9953+ if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
9954+
9955+ // Get callback name, remembering preexisting value associated with it
9956+ callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
9957+ s.jsonpCallback() :
9958+ s.jsonpCallback;
9959+
9960+ // Insert callback into url or form data
9961+ if ( jsonProp ) {
9962+ s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
9963+ } else if ( s.jsonp !== false ) {
9964+ s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
9965+ }
9966+
9967+ // Use data converter to retrieve json after script execution
9968+ s.converters[ "script json" ] = function() {
9969+ if ( !responseContainer ) {
9970+ jQuery.error( callbackName + " was not called" );
9971+ }
9972+ return responseContainer[ 0 ];
9973+ };
9974+
9975+ // Force json dataType
9976+ s.dataTypes[ 0 ] = "json";
9977+
9978+ // Install callback
9979+ overwritten = window[ callbackName ];
9980+ window[ callbackName ] = function() {
9981+ responseContainer = arguments;
9982+ };
9983+
9984+ // Clean-up function (fires after converters)
9985+ jqXHR.always( function() {
9986+
9987+ // If previous value didn't exist - remove it
9988+ if ( overwritten === undefined ) {
9989+ jQuery( window ).removeProp( callbackName );
9990+
9991+ // Otherwise restore preexisting value
9992+ } else {
9993+ window[ callbackName ] = overwritten;
9994+ }
9995+
9996+ // Save back as free
9997+ if ( s[ callbackName ] ) {
9998+
9999+ // Make sure that re-using the options doesn't screw things around
10000+ s.jsonpCallback = originalSettings.jsonpCallback;
10001+
10002+ // Save the callback name for future use
10003+ oldCallbacks.push( callbackName );
10004+ }
10005+
10006+ // Call if it was a function and we have a response
10007+ if ( responseContainer && isFunction( overwritten ) ) {
10008+ overwritten( responseContainer[ 0 ] );
10009+ }
10010+
10011+ responseContainer = overwritten = undefined;
10012+ } );
10013+
10014+ // Delegate to script
10015+ return "script";
10016+ }
10017+} );
10018+
10019+
10020+
10021+
10022+// Support: Safari 8 only
10023+// In Safari 8 documents created via document.implementation.createHTMLDocument
10024+// collapse sibling forms: the second one becomes a child of the first one.
10025+// Because of that, this security measure has to be disabled in Safari 8.
10026+// https://bugs.webkit.org/show_bug.cgi?id=137337
10027+support.createHTMLDocument = ( function() {
10028+ var body = document.implementation.createHTMLDocument( "" ).body;
10029+ body.innerHTML = "<form></form><form></form>";
10030+ return body.childNodes.length === 2;
10031+} )();
10032+
10033+
10034+// Argument "data" should be string of html
10035+// context (optional): If specified, the fragment will be created in this context,
10036+// defaults to document
10037+// keepScripts (optional): If true, will include scripts passed in the html string
10038+jQuery.parseHTML = function( data, context, keepScripts ) {
10039+ if ( typeof data !== "string" ) {
10040+ return [];
10041+ }
10042+ if ( typeof context === "boolean" ) {
10043+ keepScripts = context;
10044+ context = false;
10045+ }
10046+
10047+ var base, parsed, scripts;
10048+
10049+ if ( !context ) {
10050+
10051+ // Stop scripts or inline event handlers from being executed immediately
10052+ // by using document.implementation
10053+ if ( support.createHTMLDocument ) {
10054+ context = document.implementation.createHTMLDocument( "" );
10055+
10056+ // Set the base href for the created document
10057+ // so any parsed elements with URLs
10058+ // are based on the document's URL (gh-2965)
10059+ base = context.createElement( "base" );
10060+ base.href = document.location.href;
10061+ context.head.appendChild( base );
10062+ } else {
10063+ context = document;
10064+ }
10065+ }
10066+
10067+ parsed = rsingleTag.exec( data );
10068+ scripts = !keepScripts && [];
10069+
10070+ // Single tag
10071+ if ( parsed ) {
10072+ return [ context.createElement( parsed[ 1 ] ) ];
10073+ }
10074+
10075+ parsed = buildFragment( [ data ], context, scripts );
10076+
10077+ if ( scripts && scripts.length ) {
10078+ jQuery( scripts ).remove();
10079+ }
10080+
10081+ return jQuery.merge( [], parsed.childNodes );
10082+};
10083+
10084+
10085+/**
10086+ * Load a url into a page
10087+ */
10088+jQuery.fn.load = function( url, params, callback ) {
10089+ var selector, type, response,
10090+ self = this,
10091+ off = url.indexOf( " " );
10092+
10093+ if ( off > -1 ) {
10094+ selector = stripAndCollapse( url.slice( off ) );
10095+ url = url.slice( 0, off );
10096+ }
10097+
10098+ // If it's a function
10099+ if ( isFunction( params ) ) {
10100+
10101+ // We assume that it's the callback
10102+ callback = params;
10103+ params = undefined;
10104+
10105+ // Otherwise, build a param string
10106+ } else if ( params && typeof params === "object" ) {
10107+ type = "POST";
10108+ }
10109+
10110+ // If we have elements to modify, make the request
10111+ if ( self.length > 0 ) {
10112+ jQuery.ajax( {
10113+ url: url,
10114+
10115+ // If "type" variable is undefined, then "GET" method will be used.
10116+ // Make value of this field explicit since
10117+ // user can override it through ajaxSetup method
10118+ type: type || "GET",
10119+ dataType: "html",
10120+ data: params
10121+ } ).done( function( responseText ) {
10122+
10123+ // Save response for use in complete callback
10124+ response = arguments;
10125+
10126+ self.html( selector ?
10127+
10128+ // If a selector was specified, locate the right elements in a dummy div
10129+ // Exclude scripts to avoid IE 'Permission Denied' errors
10130+ jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
10131+
10132+ // Otherwise use the full result
10133+ responseText );
10134+
10135+ // If the request succeeds, this function gets "data", "status", "jqXHR"
10136+ // but they are ignored because response was set above.
10137+ // If it fails, this function gets "jqXHR", "status", "error"
10138+ } ).always( callback && function( jqXHR, status ) {
10139+ self.each( function() {
10140+ callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
10141+ } );
10142+ } );
10143+ }
10144+
10145+ return this;
10146+};
10147+
10148+
10149+
10150+
10151+// Attach a bunch of functions for handling common AJAX events
10152+jQuery.each( [
10153+ "ajaxStart",
10154+ "ajaxStop",
10155+ "ajaxComplete",
10156+ "ajaxError",
10157+ "ajaxSuccess",
10158+ "ajaxSend"
10159+], function( i, type ) {
10160+ jQuery.fn[ type ] = function( fn ) {
10161+ return this.on( type, fn );
10162+ };
10163+} );
10164+
10165+
10166+
10167+
10168+jQuery.expr.pseudos.animated = function( elem ) {
10169+ return jQuery.grep( jQuery.timers, function( fn ) {
10170+ return elem === fn.elem;
10171+ } ).length;
10172+};
10173+
10174+
10175+
10176+
10177+jQuery.offset = {
10178+ setOffset: function( elem, options, i ) {
10179+ var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
10180+ position = jQuery.css( elem, "position" ),
10181+ curElem = jQuery( elem ),
10182+ props = {};
10183+
10184+ // Set position first, in-case top/left are set even on static elem
10185+ if ( position === "static" ) {
10186+ elem.style.position = "relative";
10187+ }
10188+
10189+ curOffset = curElem.offset();
10190+ curCSSTop = jQuery.css( elem, "top" );
10191+ curCSSLeft = jQuery.css( elem, "left" );
10192+ calculatePosition = ( position === "absolute" || position === "fixed" ) &&
10193+ ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
10194+
10195+ // Need to be able to calculate position if either
10196+ // top or left is auto and position is either absolute or fixed
10197+ if ( calculatePosition ) {
10198+ curPosition = curElem.position();
10199+ curTop = curPosition.top;
10200+ curLeft = curPosition.left;
10201+
10202+ } else {
10203+ curTop = parseFloat( curCSSTop ) || 0;
10204+ curLeft = parseFloat( curCSSLeft ) || 0;
10205+ }
10206+
10207+ if ( isFunction( options ) ) {
10208+
10209+ // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
10210+ options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
10211+ }
10212+
10213+ if ( options.top != null ) {
10214+ props.top = ( options.top - curOffset.top ) + curTop;
10215+ }
10216+ if ( options.left != null ) {
10217+ props.left = ( options.left - curOffset.left ) + curLeft;
10218+ }
10219+
10220+ if ( "using" in options ) {
10221+ options.using.call( elem, props );
10222+
10223+ } else {
10224+ curElem.css( props );
10225+ }
10226+ }
10227+};
10228+
10229+jQuery.fn.extend( {
10230+
10231+ // offset() relates an element's border box to the document origin
10232+ offset: function( options ) {
10233+
10234+ // Preserve chaining for setter
10235+ if ( arguments.length ) {
10236+ return options === undefined ?
10237+ this :
10238+ this.each( function( i ) {
10239+ jQuery.offset.setOffset( this, options, i );
10240+ } );
10241+ }
10242+
10243+ var rect, win,
10244+ elem = this[ 0 ];
10245+
10246+ if ( !elem ) {
10247+ return;
10248+ }
10249+
10250+ // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
10251+ // Support: IE <=11 only
10252+ // Running getBoundingClientRect on a
10253+ // disconnected node in IE throws an error
10254+ if ( !elem.getClientRects().length ) {
10255+ return { top: 0, left: 0 };
10256+ }
10257+
10258+ // Get document-relative position by adding viewport scroll to viewport-relative gBCR
10259+ rect = elem.getBoundingClientRect();
10260+ win = elem.ownerDocument.defaultView;
10261+ return {
10262+ top: rect.top + win.pageYOffset,
10263+ left: rect.left + win.pageXOffset
10264+ };
10265+ },
10266+
10267+ // position() relates an element's margin box to its offset parent's padding box
10268+ // This corresponds to the behavior of CSS absolute positioning
10269+ position: function() {
10270+ if ( !this[ 0 ] ) {
10271+ return;
10272+ }
10273+
10274+ var offsetParent, offset, doc,
10275+ elem = this[ 0 ],
10276+ parentOffset = { top: 0, left: 0 };
10277+
10278+ // position:fixed elements are offset from the viewport, which itself always has zero offset
10279+ if ( jQuery.css( elem, "position" ) === "fixed" ) {
10280+
10281+ // Assume position:fixed implies availability of getBoundingClientRect
10282+ offset = elem.getBoundingClientRect();
10283+
10284+ } else {
10285+ offset = this.offset();
10286+
10287+ // Account for the *real* offset parent, which can be the document or its root element
10288+ // when a statically positioned element is identified
10289+ doc = elem.ownerDocument;
10290+ offsetParent = elem.offsetParent || doc.documentElement;
10291+ while ( offsetParent &&
10292+ ( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
10293+ jQuery.css( offsetParent, "position" ) === "static" ) {
10294+
10295+ offsetParent = offsetParent.parentNode;
10296+ }
10297+ if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
10298+
10299+ // Incorporate borders into its offset, since they are outside its content origin
10300+ parentOffset = jQuery( offsetParent ).offset();
10301+ parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
10302+ parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
10303+ }
10304+ }
10305+
10306+ // Subtract parent offsets and element margins
10307+ return {
10308+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
10309+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
10310+ };
10311+ },
10312+
10313+ // This method will return documentElement in the following cases:
10314+ // 1) For the element inside the iframe without offsetParent, this method will return
10315+ // documentElement of the parent window
10316+ // 2) For the hidden or detached element
10317+ // 3) For body or html element, i.e. in case of the html node - it will return itself
10318+ //
10319+ // but those exceptions were never presented as a real life use-cases
10320+ // and might be considered as more preferable results.
10321+ //
10322+ // This logic, however, is not guaranteed and can change at any point in the future
10323+ offsetParent: function() {
10324+ return this.map( function() {
10325+ var offsetParent = this.offsetParent;
10326+
10327+ while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
10328+ offsetParent = offsetParent.offsetParent;
10329+ }
10330+
10331+ return offsetParent || documentElement;
10332+ } );
10333+ }
10334+} );
10335+
10336+// Create scrollLeft and scrollTop methods
10337+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
10338+ var top = "pageYOffset" === prop;
10339+
10340+ jQuery.fn[ method ] = function( val ) {
10341+ return access( this, function( elem, method, val ) {
10342+
10343+ // Coalesce documents and windows
10344+ var win;
10345+ if ( isWindow( elem ) ) {
10346+ win = elem;
10347+ } else if ( elem.nodeType === 9 ) {
10348+ win = elem.defaultView;
10349+ }
10350+
10351+ if ( val === undefined ) {
10352+ return win ? win[ prop ] : elem[ method ];
10353+ }
10354+
10355+ if ( win ) {
10356+ win.scrollTo(
10357+ !top ? val : win.pageXOffset,
10358+ top ? val : win.pageYOffset
10359+ );
10360+
10361+ } else {
10362+ elem[ method ] = val;
10363+ }
10364+ }, method, val, arguments.length );
10365+ };
10366+} );
10367+
10368+// Support: Safari <=7 - 9.1, Chrome <=37 - 49
10369+// Add the top/left cssHooks using jQuery.fn.position
10370+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10371+// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
10372+// getComputedStyle returns percent when specified for top/left/bottom/right;
10373+// rather than make the css module depend on the offset module, just check for it here
10374+jQuery.each( [ "top", "left" ], function( i, prop ) {
10375+ jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10376+ function( elem, computed ) {
10377+ if ( computed ) {
10378+ computed = curCSS( elem, prop );
10379+
10380+ // If curCSS returns percentage, fallback to offset
10381+ return rnumnonpx.test( computed ) ?
10382+ jQuery( elem ).position()[ prop ] + "px" :
10383+ computed;
10384+ }
10385+ }
10386+ );
10387+} );
10388+
10389+
10390+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10391+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10392+ jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
10393+ function( defaultExtra, funcName ) {
10394+
10395+ // Margin is only for outerHeight, outerWidth
10396+ jQuery.fn[ funcName ] = function( margin, value ) {
10397+ var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
10398+ extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
10399+
10400+ return access( this, function( elem, type, value ) {
10401+ var doc;
10402+
10403+ if ( isWindow( elem ) ) {
10404+
10405+ // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
10406+ return funcName.indexOf( "outer" ) === 0 ?
10407+ elem[ "inner" + name ] :
10408+ elem.document.documentElement[ "client" + name ];
10409+ }
10410+
10411+ // Get document width or height
10412+ if ( elem.nodeType === 9 ) {
10413+ doc = elem.documentElement;
10414+
10415+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
10416+ // whichever is greatest
10417+ return Math.max(
10418+ elem.body[ "scroll" + name ], doc[ "scroll" + name ],
10419+ elem.body[ "offset" + name ], doc[ "offset" + name ],
10420+ doc[ "client" + name ]
10421+ );
10422+ }
10423+
10424+ return value === undefined ?
10425+
10426+ // Get width or height on the element, requesting but not forcing parseFloat
10427+ jQuery.css( elem, type, extra ) :
10428+
10429+ // Set width or height on the element
10430+ jQuery.style( elem, type, value, extra );
10431+ }, type, chainable ? margin : undefined, chainable );
10432+ };
10433+ } );
10434+} );
10435+
10436+
10437+jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
10438+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
10439+ "change select submit keydown keypress keyup contextmenu" ).split( " " ),
10440+ function( i, name ) {
10441+
10442+ // Handle event binding
10443+ jQuery.fn[ name ] = function( data, fn ) {
10444+ return arguments.length > 0 ?
10445+ this.on( name, null, data, fn ) :
10446+ this.trigger( name );
10447+ };
10448+} );
10449+
10450+jQuery.fn.extend( {
10451+ hover: function( fnOver, fnOut ) {
10452+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
10453+ }
10454+} );
10455+
10456+
10457+
10458+
10459+jQuery.fn.extend( {
10460+
10461+ bind: function( types, data, fn ) {
10462+ return this.on( types, null, data, fn );
10463+ },
10464+ unbind: function( types, fn ) {
10465+ return this.off( types, null, fn );
10466+ },
10467+
10468+ delegate: function( selector, types, data, fn ) {
10469+ return this.on( types, selector, data, fn );
10470+ },
10471+ undelegate: function( selector, types, fn ) {
10472+
10473+ // ( namespace ) or ( selector, types [, fn] )
10474+ return arguments.length === 1 ?
10475+ this.off( selector, "**" ) :
10476+ this.off( types, selector || "**", fn );
10477+ }
10478+} );
10479+
10480+// Bind a function to a context, optionally partially applying any
10481+// arguments.
10482+// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
10483+// However, it is not slated for removal any time soon
10484+jQuery.proxy = function( fn, context ) {
10485+ var tmp, args, proxy;
10486+
10487+ if ( typeof context === "string" ) {
10488+ tmp = fn[ context ];
10489+ context = fn;
10490+ fn = tmp;
10491+ }
10492+
10493+ // Quick check to determine if target is callable, in the spec
10494+ // this throws a TypeError, but we will just return undefined.
10495+ if ( !isFunction( fn ) ) {
10496+ return undefined;
10497+ }
10498+
10499+ // Simulated bind
10500+ args = slice.call( arguments, 2 );
10501+ proxy = function() {
10502+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
10503+ };
10504+
10505+ // Set the guid of unique handler to the same of original handler, so it can be removed
10506+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
10507+
10508+ return proxy;
10509+};
10510+
10511+jQuery.holdReady = function( hold ) {
10512+ if ( hold ) {
10513+ jQuery.readyWait++;
10514+ } else {
10515+ jQuery.ready( true );
10516+ }
10517+};
10518+jQuery.isArray = Array.isArray;
10519+jQuery.parseJSON = JSON.parse;
10520+jQuery.nodeName = nodeName;
10521+jQuery.isFunction = isFunction;
10522+jQuery.isWindow = isWindow;
10523+jQuery.camelCase = camelCase;
10524+jQuery.type = toType;
10525+
10526+jQuery.now = Date.now;
10527+
10528+jQuery.isNumeric = function( obj ) {
10529+
10530+ // As of jQuery 3.0, isNumeric is limited to
10531+ // strings and numbers (primitives or objects)
10532+ // that can be coerced to finite numbers (gh-2662)
10533+ var type = jQuery.type( obj );
10534+ return ( type === "number" || type === "string" ) &&
10535+
10536+ // parseFloat NaNs numeric-cast false positives ("")
10537+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
10538+ // subtraction forces infinities to NaN
10539+ !isNaN( obj - parseFloat( obj ) );
10540+};
10541+
10542+
10543+
10544+
10545+// Register as a named AMD module, since jQuery can be concatenated with other
10546+// files that may use define, but not via a proper concatenation script that
10547+// understands anonymous AMD modules. A named AMD is safest and most robust
10548+// way to register. Lowercase jquery is used because AMD module names are
10549+// derived from file names, and jQuery is normally delivered in a lowercase
10550+// file name. Do this after creating the global so that if an AMD module wants
10551+// to call noConflict to hide this version of jQuery, it will work.
10552+
10553+// Note that for maximum portability, libraries that are not jQuery should
10554+// declare themselves as anonymous modules, and avoid setting a global if an
10555+// AMD loader is present. jQuery is a special case. For more information, see
10556+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10557+
10558+if ( typeof define === "function" && define.amd ) {
10559+ define( "jquery", [], function() {
10560+ return jQuery;
10561+ } );
10562+}
10563+
10564+
10565+
10566+
10567+var
10568+
10569+ // Map over jQuery in case of overwrite
10570+ _jQuery = window.jQuery,
10571+
10572+ // Map over the $ in case of overwrite
10573+ _$ = window.$;
10574+
10575+jQuery.noConflict = function( deep ) {
10576+ if ( window.$ === jQuery ) {
10577+ window.$ = _$;
10578+ }
10579+
10580+ if ( deep && window.jQuery === jQuery ) {
10581+ window.jQuery = _jQuery;
10582+ }
10583+
10584+ return jQuery;
10585+};
10586+
10587+// Expose jQuery and $ identifiers, even in AMD
10588+// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10589+// and CommonJS for browser emulators (#13566)
10590+if ( !noGlobal ) {
10591+ window.jQuery = window.$ = jQuery;
10592+}
10593+
10594+
10595+
10596+
10597+return jQuery;
10598+} );
_static/jquery.jsnew file+2
@@ -0,0 +1,2 @@
1+/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */
2+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}k.fn=k.prototype={jquery:f,constructor:k,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=k.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return k.each(this,e)},map:function(n){return this.pushStack(k.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},k.extend=k.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(k.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||k.isPlainObject(n)?n:{},i=!1,a[t]=k.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},k.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t){b(e,{nonce:t&&t.nonce})},each:function(e,t){var n,r=0;if(d(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(p,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(d(Object(e))?k.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(d(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g.apply([],a)},guid:1,support:y}),"function"==typeof Symbol&&(k.fn[Symbol.iterator]=t[Symbol.iterator]),k.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var h=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,k="sizzle"+1*new Date,m=n.document,S=0,r=0,p=ue(),x=ue(),N=ue(),A=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",$=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",F=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="<a id='"+k+"'></a><select id='"+k+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!==C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!==C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(F," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[S,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[S,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[k]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace(B,"$1"));return s[k]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[S,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[k]||(e[k]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===S&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[k]&&(v=Ce(v)),y&&!y[k]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[k]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(B,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(B," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=N[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[k]?i.push(a):o.push(a);(a=N(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=S+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t===C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument===C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(S=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(S=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=k.split("").sort(D).join("")===k,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);k.find=h,k.expr=h.selectors,k.expr[":"]=k.expr.pseudos,k.uniqueSort=k.unique=h.uniqueSort,k.text=h.getText,k.isXMLDoc=h.isXML,k.contains=h.contains,k.escapeSelector=h.escape;var T=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&k(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},N=k.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var D=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1<i.call(n,e)!==r}):k.filter(n,e,r)}k.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?k.find.matchesSelector(r,e)?[r]:[]:k.find.matches(e,k.grep(t,function(e){return 1===e.nodeType}))},k.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(k(e).filter(function(){for(t=0;t<r;t++)if(k.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)k.find(e,i[t],n);return 1<r?k.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&N.test(e)?k(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(k.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&k(e);if(!N.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&k.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?k.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(k(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(k.uniqueSort(k.merge(this.get(),k(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),k.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return T(e,"parentNode")},parentsUntil:function(e,t,n){return T(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return T(e,"nextSibling")},prevAll:function(e){return T(e,"previousSibling")},nextUntil:function(e,t,n){return T(e,"nextSibling",n)},prevUntil:function(e,t,n){return T(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return"undefined"!=typeof e.contentDocument?e.contentDocument:(A(e,"template")&&(e=e.content||e),k.merge([],e.childNodes))}},function(r,i){k.fn[r]=function(e,t){var n=k.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=k.filter(t,n)),1<this.length&&(O[r]||k.uniqueSort(n),H.test(r)&&n.reverse()),this.pushStack(n)}});var R=/[^\x20\t\r\n\f]+/g;function M(e){return e}function I(e){throw e}function W(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}k.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},k.each(e.match(R)||[],function(e,t){n[t]=!0}),n):k.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){k.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return k.each(arguments,function(e,t){var n;while(-1<(n=k.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<k.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},k.extend({Deferred:function(e){var o=[["notify","progress",k.Callbacks("memory"),k.Callbacks("memory"),2],["resolve","done",k.Callbacks("once memory"),k.Callbacks("once memory"),0,"resolved"],["reject","fail",k.Callbacks("once memory"),k.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return k.Deferred(function(r){k.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,M,s),l(u,o,I,s)):(u++,t.call(e,l(u,o,M,s),l(u,o,I,s),l(u,o,M,o.notifyWith))):(a!==M&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){k.Deferred.exceptionHook&&k.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==I&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(k.Deferred.getStackHook&&(t.stackTrace=k.Deferred.getStackHook()),C.setTimeout(t))}}return k.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:M,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:M)),o[2][3].add(l(0,e,m(n)?n:I))}).promise()},promise:function(e){return null!=e?k.extend(e,a):a}},s={};return k.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=k.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(W(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)W(i[t],a(t),o.reject);return o.promise()}});var $=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;k.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&$.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},k.readyException=function(e){C.setTimeout(function(){throw e})};var F=k.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),k.ready()}k.fn.ready=function(e){return F.then(e)["catch"](function(e){k.readyException(e)}),this},k.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--k.readyWait:k.isReady)||(k.isReady=!0)!==e&&0<--k.readyWait||F.resolveWith(E,[k])}}),k.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(k.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var _=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)_(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(k(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},z=/^-ms-/,U=/-([a-z])/g;function X(e,t){return t.toUpperCase()}function V(e){return e.replace(z,"ms-").replace(U,X)}var G=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Y(){this.expando=k.expando+Y.uid++}Y.uid=1,Y.prototype={cache:function(e){var t=e[this.expando];return t||(t={},G(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[V(t)]=n;else for(r in t)i[V(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][V(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(V):(t=V(t))in r?[t]:t.match(R)||[]).length;while(n--)delete r[t[n]]}(void 0===t||k.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!k.isEmptyObject(t)}};var Q=new Y,J=new Y,K=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function ee(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Z,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:K.test(i)?JSON.parse(i):i)}catch(e){}J.set(e,t,n)}else n=void 0;return n}k.extend({hasData:function(e){return J.hasData(e)||Q.hasData(e)},data:function(e,t,n){return J.access(e,t,n)},removeData:function(e,t){J.remove(e,t)},_data:function(e,t,n){return Q.access(e,t,n)},_removeData:function(e,t){Q.remove(e,t)}}),k.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=J.get(o),1===o.nodeType&&!Q.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=V(r.slice(5)),ee(o,r,i[r]));Q.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){J.set(this,n)}):_(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=J.get(o,n))?t:void 0!==(t=ee(o,n))?t:void 0;this.each(function(){J.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){J.remove(this,e)})}}),k.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Q.get(e,t),n&&(!r||Array.isArray(n)?r=Q.access(e,t,k.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=k.queue(e,t),r=n.length,i=n.shift(),o=k._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){k.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Q.get(e,n)||Q.access(e,n,{empty:k.Callbacks("once memory").add(function(){Q.remove(e,[t+"queue",n])})})}}),k.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?k.queue(this[0],t):void 0===n?this:this.each(function(){var e=k.queue(this,t,n);k._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&k.dequeue(this,t)})},dequeue:function(e){return this.each(function(){k.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=k.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Q.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var te=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ne=new RegExp("^(?:([+-])=|)("+te+")([a-z%]*)$","i"),re=["Top","Right","Bottom","Left"],ie=E.documentElement,oe=function(e){return k.contains(e.ownerDocument,e)},ae={composed:!0};ie.getRootNode&&(oe=function(e){return k.contains(e.ownerDocument,e)||e.getRootNode(ae)===e.ownerDocument});var se=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&oe(e)&&"none"===k.css(e,"display")},ue=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];for(o in i=n.apply(e,r||[]),t)e.style[o]=a[o];return i};function le(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return k.css(e,t,"")},u=s(),l=n&&n[3]||(k.cssNumber[t]?"":"px"),c=e.nodeType&&(k.cssNumber[t]||"px"!==l&&+u)&&ne.exec(k.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)k.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,k.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ce={};function fe(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Q.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&se(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ce[s])||(o=a.body.appendChild(a.createElement(s)),u=k.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ce[s]=u)))):"none"!==n&&(l[c]="none",Q.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}k.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){se(this)?k(this).show():k(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Q.set(e[n],"globalEval",!t||Q.get(t[n],"globalEval"))}ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;var me,xe,be=/<|&#?\w+;/;function we(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))k.merge(p,o.nodeType?[o]:o);else if(be.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+k.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;k.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<k.inArray(o,r))i&&i.push(o);else if(l=oe(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}me=E.createDocumentFragment().appendChild(E.createElement("div")),(xe=E.createElement("input")).setAttribute("type","radio"),xe.setAttribute("checked","checked"),xe.setAttribute("name","t"),me.appendChild(xe),y.checkClone=me.cloneNode(!0).cloneNode(!0).lastChild.checked,me.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t<arguments.length;t++)u[t]=arguments[t];if(s.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,s)){a=k.event.handlers.call(this,s,l),t=0;while((i=a[t++])&&!s.isPropagationStopped()){s.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!s.isImmediatePropagationStopped())s.rnamespace&&!1!==o.namespace&&!s.rnamespace.test(o.namespace)||(s.handleObj=o,s.data=o.data,void 0!==(r=((k.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,u))&&!1===(s.result=r)&&(s.preventDefault(),s.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,s),s.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<k(i,this).index(l):k.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(k.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[k.expando]?e:new k.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&De(t,"click",ke),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&De(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Q.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},k.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},k.Event=function(e,t){if(!(this instanceof k.Event))return new k.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?ke:Se,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&k.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[k.expando]=!0},k.Event.prototype={constructor:k.Event,isDefaultPrevented:Se,isPropagationStopped:Se,isImmediatePropagationStopped:Se,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=ke,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=ke,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=ke,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},k.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&Te.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Ce.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},k.event.addProp),k.each({focus:"focusin",blur:"focusout"},function(e,t){k.event.special[e]={setup:function(){return De(this,e,Ne),!1},trigger:function(){return De(this,e),!0},delegateType:t}}),k.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){k.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||k.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),k.fn.extend({on:function(e,t,n,r){return Ae(this,e,t,n,r)},one:function(e,t,n,r){return Ae(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,k(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Se),this.each(function(){k.event.remove(this,e,n,t)})}});var je=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/<script|<style|<link/i,Le=/checked\s*(?:[^=]|=\s*.checked.)/i,He=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n<r;n++)k.event.add(t,i,l[i][n]);J.hasData(e)&&(s=J.access(e),u=k.extend({},s),J.set(t,u))}}function Ie(n,r,i,o){r=g.apply([],r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Le.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Ie(t,r,i,o)});if(f&&(t=(e=we(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=k.map(ve(e,"script"),Pe)).length;c<f;c++)u=e,c!==p&&(u=k.clone(u,!0,!0),s&&k.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,k.map(a,Re),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Q.access(u,"globalEval")&&k.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?k._evalUrl&&!u.noModule&&k._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")}):b(u.textContent.replace(He,""),u,l))}return n}function We(e,t,n){for(var r,i=t?k.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||k.cleanData(ve(r)),r.parentNode&&(n&&oe(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}k.extend({htmlPrefilter:function(e){return e.replace(je,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Me(o[r],a[r]);else Me(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=k.event.special,o=0;void 0!==(n=e[o]);o++)if(G(n)){if(t=n[Q.expando]){if(t.events)for(r in t.events)i[r]?k.event.remove(n,r):k.removeEvent(n,r,t.handle);n[Q.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),k.fn.extend({detach:function(e){return We(this,e,!0)},remove:function(e){return We(this,e)},text:function(e){return _(this,function(e){return void 0===e?k.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Ie(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Oe(this,e).appendChild(e)})},prepend:function(){return Ie(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Oe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(k.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return k.clone(this,e,t)})},html:function(e){return _(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!qe.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=k.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(k.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Ie(this,arguments,function(e){var t=this.parentNode;k.inArray(this,n)<0&&(k.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),k.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){k.fn[e]=function(e){for(var t,n=[],r=k(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),k(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var $e=new RegExp("^("+te+")(?!px)[a-z%]+$","i"),Fe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Be=new RegExp(re.join("|"),"i");function _e(e,t,n){var r,i,o,a,s=e.style;return(n=n||Fe(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||oe(e)||(a=k.style(e,t)),!y.pixelBoxStyles()&&$e.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function ze(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(u){s.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",u.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",ie.appendChild(s).appendChild(u);var e=C.getComputedStyle(u);n="1%"!==e.top,a=12===t(e.marginLeft),u.style.right="60%",o=36===t(e.right),r=36===t(e.width),u.style.position="absolute",i=12===t(u.offsetWidth/3),ie.removeChild(s),u=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s=E.createElement("div"),u=E.createElement("div");u.style&&(u.style.backgroundClip="content-box",u.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===u.style.backgroundClip,k.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),a},scrollboxSize:function(){return e(),i}}))}();var Ue=["Webkit","Moz","ms"],Xe=E.createElement("div").style,Ve={};function Ge(e){var t=k.cssProps[e]||Ve[e];return t||(e in Xe?e:Ve[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Ue.length;while(n--)if((e=Ue[n]+t)in Xe)return e}(e)||e)}var Ye=/^(none|table(?!-c[ea]).+)/,Qe=/^--/,Je={position:"absolute",visibility:"hidden",display:"block"},Ke={letterSpacing:"0",fontWeight:"400"};function Ze(e,t,n){var r=ne.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function et(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=k.css(e,n+re[a],!0,i)),r?("content"===n&&(u-=k.css(e,"padding"+re[a],!0,i)),"margin"!==n&&(u-=k.css(e,"border"+re[a]+"Width",!0,i))):(u+=k.css(e,"padding"+re[a],!0,i),"padding"!==n?u+=k.css(e,"border"+re[a]+"Width",!0,i):s+=k.css(e,"border"+re[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function tt(e,t,n){var r=Fe(e),i=(!y.boxSizingReliable()||n)&&"border-box"===k.css(e,"boxSizing",!1,r),o=i,a=_e(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if($e.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||"auto"===a||!parseFloat(a)&&"inline"===k.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===k.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+et(e,t,n||(i?"border":"content"),o,r,a)+"px"}function nt(e,t,n,r,i){return new nt.prototype.init(e,t,n,r,i)}k.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=_e(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=V(t),u=Qe.test(t),l=e.style;if(u||(t=Ge(s)),a=k.cssHooks[t]||k.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=ne.exec(n))&&i[1]&&(n=le(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(k.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=V(t);return Qe.test(t)||(t=Ge(s)),(a=k.cssHooks[t]||k.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=_e(e,t,r)),"normal"===i&&t in Ke&&(i=Ke[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),k.each(["height","width"],function(e,u){k.cssHooks[u]={get:function(e,t,n){if(t)return!Ye.test(k.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?tt(e,u,n):ue(e,Je,function(){return tt(e,u,n)})},set:function(e,t,n){var r,i=Fe(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===k.css(e,"boxSizing",!1,i),s=n?et(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-et(e,u,"border",!1,i)-.5)),s&&(r=ne.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=k.css(e,u)),Ze(0,t,s)}}}),k.cssHooks.marginLeft=ze(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(_e(e,"marginLeft"))||e.getBoundingClientRect().left-ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),k.each({margin:"",padding:"",border:"Width"},function(i,o){k.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+re[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(k.cssHooks[i+o].set=Ze)}),k.fn.extend({css:function(e,t){return _(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Fe(e),i=t.length;a<i;a++)o[t[a]]=k.css(e,t[a],!1,r);return o}return void 0!==n?k.style(e,t,n):k.css(e,t)},e,t,1<arguments.length)}}),((k.Tween=nt).prototype={constructor:nt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||k.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(k.cssNumber[n]?"":"px")},cur:function(){var e=nt.propHooks[this.prop];return e&&e.get?e.get(this):nt.propHooks._default.get(this)},run:function(e){var t,n=nt.propHooks[this.prop];return this.options.duration?this.pos=t=k.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):nt.propHooks._default.set(this),this}}).init.prototype=nt.prototype,(nt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=k.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){k.fx.step[e.prop]?k.fx.step[e.prop](e):1!==e.elem.nodeType||!k.cssHooks[e.prop]&&null==e.elem.style[Ge(e.prop)]?e.elem[e.prop]=e.now:k.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=nt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},k.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},k.fx=nt.prototype.init,k.fx.step={};var rt,it,ot,at,st=/^(?:toggle|show|hide)$/,ut=/queueHooks$/;function lt(){it&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(lt):C.setTimeout(lt,k.fx.interval),k.fx.tick())}function ct(){return C.setTimeout(function(){rt=void 0}),rt=Date.now()}function ft(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=re[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function pt(e,t,n){for(var r,i=(dt.tweeners[t]||[]).concat(dt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function dt(o,e,t){var n,a,r=0,i=dt.prefilters.length,s=k.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=rt||ct(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:k.extend({},e),opts:k.extend(!0,{specialEasing:{},easing:k.easing._default},t),originalProperties:e,originalOptions:t,startTime:rt||ct(),duration:t.duration,tweens:[],createTween:function(e,t){var n=k.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=V(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=k.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=dt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(k._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return k.map(c,pt,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),k.fx.timer(k.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}k.Animation=k.extend(dt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return le(n.elem,e,ne.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(R);for(var n,r=0,i=e.length;r<i;r++)n=e[r],dt.tweeners[n]=dt.tweeners[n]||[],dt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&se(e),v=Q.get(e,"fxshow");for(r in n.queue||(null==(a=k._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,k.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],st.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||k.style(e,r)}if((u=!k.isEmptyObject(t))||!k.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Q.get(e,"display")),"none"===(c=k.css(e,"display"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=k.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===k.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Q.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&fe([e],!0),p.done(function(){for(r in g||fe([e]),Q.remove(e,"fxshow"),d)k.style(e,r,d[r])})),u=pt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?dt.prefilters.unshift(e):dt.prefilters.push(e)}}),k.speed=function(e,t,n){var r=e&&"object"==typeof e?k.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return k.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in k.fx.speeds?r.duration=k.fx.speeds[r.duration]:r.duration=k.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&k.dequeue(this,r.queue)},r},k.fn.extend({fadeTo:function(e,t,n,r){return this.filter(se).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=k.isEmptyObject(t),o=k.speed(e,n,r),a=function(){var e=dt(this,k.extend({},t),o);(i||Q.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&!1!==i&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=k.timers,r=Q.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&ut.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||k.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Q.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=k.timers,o=n?n.length:0;for(t.finish=!0,k.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),k.each(["toggle","show","hide"],function(e,r){var i=k.fn[r];k.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(ft(r,!0),e,t,n)}}),k.each({slideDown:ft("show"),slideUp:ft("hide"),slideToggle:ft("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){k.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),k.timers=[],k.fx.tick=function(){var e,t=0,n=k.timers;for(rt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||k.fx.stop(),rt=void 0},k.fx.timer=function(e){k.timers.push(e),k.fx.start()},k.fx.interval=13,k.fx.start=function(){it||(it=!0,lt())},k.fx.stop=function(){it=null},k.fx.speeds={slow:600,fast:200,_default:400},k.fn.delay=function(r,e){return r=k.fx&&k.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},ot=E.createElement("input"),at=E.createElement("select").appendChild(E.createElement("option")),ot.type="checkbox",y.checkOn=""!==ot.value,y.optSelected=at.selected,(ot=E.createElement("input")).value="t",ot.type="radio",y.radioValue="t"===ot.value;var ht,gt=k.expr.attrHandle;k.fn.extend({attr:function(e,t){return _(this,k.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){k.removeAttr(this,e)})}}),k.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?k.prop(e,t,n):(1===o&&k.isXMLDoc(e)||(i=k.attrHooks[t.toLowerCase()]||(k.expr.match.bool.test(t)?ht:void 0)),void 0!==n?null===n?void k.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=k.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(R);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ht={set:function(e,t,n){return!1===t?k.removeAttr(e,n):e.setAttribute(n,n),n}},k.each(k.expr.match.bool.source.match(/\w+/g),function(e,t){var a=gt[t]||k.find.attr;gt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=gt[o],gt[o]=r,r=null!=a(e,t,n)?o:null,gt[o]=i),r}});var vt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;function mt(e){return(e.match(R)||[]).join(" ")}function xt(e){return e.getAttribute&&e.getAttribute("class")||""}function bt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(R)||[]}k.fn.extend({prop:function(e,t){return _(this,k.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[k.propFix[e]||e]})}}),k.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&k.isXMLDoc(e)||(t=k.propFix[t]||t,i=k.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=k.find.attr(e,"tabindex");return t?parseInt(t,10):vt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(k.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),k.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){k.propFix[this.toLowerCase()]=this}),k.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).addClass(t.call(this,e,xt(this)))});if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).removeClass(t.call(this,e,xt(this)))});if(!arguments.length)return this.attr("class","");if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){k(this).toggleClass(i.call(this,e,xt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=k(this),r=bt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=xt(this))&&Q.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Q.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+mt(xt(n))+" ").indexOf(t))return!0;return!1}});var wt=/\r/g;k.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,k(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=k.map(t,function(e){return null==e?"":e+""})),(r=k.valHooks[this.type]||k.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=k.valHooks[t.type]||k.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(wt,""):null==e?"":e:void 0}}),k.extend({valHooks:{option:{get:function(e){var t=k.find.attr(e,"value");return null!=t?t:mt(k.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=k(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=k.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<k.inArray(k.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),k.each(["radio","checkbox"],function(){k.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<k.inArray(k(e).val(),t)}},y.checkOn||(k.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var Tt=/^(?:focusinfocus|focusoutblur)$/,Ct=function(e){e.stopPropagation()};k.extend(k.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!Tt.test(d+k.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[k.expando]?e:new k.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:k.makeArray(t,[e]),c=k.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,Tt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Q.get(o,"events")||{})[e.type]&&Q.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&G(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!G(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),k.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Ct),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Ct),k.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=k.extend(new k.Event,n,{type:e,isSimulated:!0});k.event.trigger(r,null,t)}}),k.fn.extend({trigger:function(e,t){return this.each(function(){k.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return k.event.trigger(e,t,n,!0)}}),y.focusin||k.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){k.event.simulate(r,e.target,k.event.fix(e))};k.event.special[r]={setup:function(){var e=this.ownerDocument||this,t=Q.access(e,r);t||e.addEventListener(n,i,!0),Q.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this,t=Q.access(e,r)-1;t?Q.access(e,r,t):(e.removeEventListener(n,i,!0),Q.remove(e,r))}}});var Et=C.location,kt=Date.now(),St=/\?/;k.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||k.error("Invalid XML: "+e),t};var Nt=/\[\]$/,At=/\r?\n/g,Dt=/^(?:submit|button|image|reset|file)$/i,jt=/^(?:input|select|textarea|keygen)/i;function qt(n,e,r,i){var t;if(Array.isArray(e))k.each(e,function(e,t){r||Nt.test(n)?i(n,t):qt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)qt(n+"["+t+"]",e[t],r,i)}k.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!k.isPlainObject(e))k.each(e,function(){i(this.name,this.value)});else for(n in e)qt(n,e[n],t,i);return r.join("&")},k.fn.extend({serialize:function(){return k.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=k.prop(this,"elements");return e?k.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!k(this).is(":disabled")&&jt.test(this.nodeName)&&!Dt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=k(this).val();return null==n?null:Array.isArray(n)?k.map(n,function(e){return{name:t.name,value:e.replace(At,"\r\n")}}):{name:t.name,value:n.replace(At,"\r\n")}}).get()}});var Lt=/%20/g,Ht=/#.*$/,Ot=/([?&])_=[^&]*/,Pt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Rt=/^(?:GET|HEAD)$/,Mt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Ft=E.createElement("a");function Bt(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(R)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function _t(t,i,o,a){var s={},u=t===Wt;function l(e){var r;return s[e]=!0,k.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function zt(e,t){var n,r,i=k.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&k.extend(!0,e,r),e}Ft.href=Et.href,k.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":k.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,k.ajaxSettings),t):zt(k.ajaxSettings,e)},ajaxPrefilter:Bt(It),ajaxTransport:Bt(Wt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=k.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?k(y):k.event,x=k.Deferred(),b=k.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Pt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+"").replace(Mt,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(R)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Ft.protocol+"//"+Ft.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=k.param(v.data,v.traditional)),_t(It,v,t,T),h)return T;for(i in(g=k.event&&v.global)&&0==k.active++&&k.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Rt.test(v.type),f=v.url.replace(Ht,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Lt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(St.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Ot,"$1"),o=(St.test(f)?"&":"?")+"_="+kt+++o),v.url=f+o),v.ifModified&&(k.lastModified[f]&&T.setRequestHeader("If-Modified-Since",k.lastModified[f]),k.etag[f]&&T.setRequestHeader("If-None-Match",k.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+$t+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=_t(Wt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(k.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(k.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--k.active||k.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return k.get(e,t,n,"json")},getScript:function(e,t){return k.get(e,void 0,t,"script")}}),k.each(["get","post"],function(e,i){k[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),k.ajax(k.extend({url:e,type:i,dataType:r,data:t,success:n},k.isPlainObject(e)&&e))}}),k._evalUrl=function(e,t){return k.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){k.globalEval(e,t)}})},k.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=k(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){k(this).wrapInner(n.call(this,e))}):this.each(function(){var e=k(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){k(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){k(this).replaceWith(this.childNodes)}),this}}),k.expr.pseudos.hidden=function(e){return!k.expr.pseudos.visible(e)},k.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},k.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Ut={0:200,1223:204},Xt=k.ajaxSettings.xhr();y.cors=!!Xt&&"withCredentials"in Xt,y.ajax=Xt=!!Xt,k.ajaxTransport(function(i){var o,a;if(y.cors||Xt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Ut[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),k.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),k.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return k.globalEval(e),e}}}),k.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),k.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=k("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=mt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&k.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?k("<div>").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}}),k.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),k.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),k.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||k.guid++,i},k.holdReady=function(e){e?k.readyWait++:k.ready(!0)},k.isArray=Array.isArray,k.parseJSON=JSON.parse,k.nodeName=A,k.isFunction=m,k.isWindow=x,k.camelCase=V,k.type=w,k.now=Date.now,k.isNumeric=function(e){var t=k.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return k});var Qt=C.jQuery,Jt=C.$;return k.noConflict=function(e){return C.$===k&&(C.$=Jt),e&&C.jQuery===k&&(C.jQuery=Qt),k},e||(C.jQuery=C.$=k),k});
_static/language_data.jsnew file+297
@@ -0,0 +1,297 @@
1+/*
2+ * language_data.js
3+ * ~~~~~~~~~~~~~~~~
4+ *
5+ * This script contains the language-specific data used by searchtools.js,
6+ * namely the list of stopwords, stemmer, scorer and splitter.
7+ *
8+ * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
9+ * :license: BSD, see LICENSE for details.
10+ *
11+ */
12+
13+var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
14+
15+
16+/* Non-minified version JS is _stemmer.js if file is provided */
17+/**
18+ * Porter Stemmer
19+ */
20+var Stemmer = function() {
21+
22+ var step2list = {
23+ ational: 'ate',
24+ tional: 'tion',
25+ enci: 'ence',
26+ anci: 'ance',
27+ izer: 'ize',
28+ bli: 'ble',
29+ alli: 'al',
30+ entli: 'ent',
31+ eli: 'e',
32+ ousli: 'ous',
33+ ization: 'ize',
34+ ation: 'ate',
35+ ator: 'ate',
36+ alism: 'al',
37+ iveness: 'ive',
38+ fulness: 'ful',
39+ ousness: 'ous',
40+ aliti: 'al',
41+ iviti: 'ive',
42+ biliti: 'ble',
43+ logi: 'log'
44+ };
45+
46+ var step3list = {
47+ icate: 'ic',
48+ ative: '',
49+ alize: 'al',
50+ iciti: 'ic',
51+ ical: 'ic',
52+ ful: '',
53+ ness: ''
54+ };
55+
56+ var c = "[^aeiou]"; // consonant
57+ var v = "[aeiouy]"; // vowel
58+ var C = c + "[^aeiouy]*"; // consonant sequence
59+ var V = v + "[aeiou]*"; // vowel sequence
60+
61+ var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
62+ var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
63+ var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
64+ var s_v = "^(" + C + ")?" + v; // vowel in stem
65+
66+ this.stemWord = function (w) {
67+ var stem;
68+ var suffix;
69+ var firstch;
70+ var origword = w;
71+
72+ if (w.length < 3)
73+ return w;
74+
75+ var re;
76+ var re2;
77+ var re3;
78+ var re4;
79+
80+ firstch = w.substr(0,1);
81+ if (firstch == "y")
82+ w = firstch.toUpperCase() + w.substr(1);
83+
84+ // Step 1a
85+ re = /^(.+?)(ss|i)es$/;
86+ re2 = /^(.+?)([^s])s$/;
87+
88+ if (re.test(w))
89+ w = w.replace(re,"$1$2");
90+ else if (re2.test(w))
91+ w = w.replace(re2,"$1$2");
92+
93+ // Step 1b
94+ re = /^(.+?)eed$/;
95+ re2 = /^(.+?)(ed|ing)$/;
96+ if (re.test(w)) {
97+ var fp = re.exec(w);
98+ re = new RegExp(mgr0);
99+ if (re.test(fp[1])) {
100+ re = /.$/;
101+ w = w.replace(re,"");
102+ }
103+ }
104+ else if (re2.test(w)) {
105+ var fp = re2.exec(w);
106+ stem = fp[1];
107+ re2 = new RegExp(s_v);
108+ if (re2.test(stem)) {
109+ w = stem;
110+ re2 = /(at|bl|iz)$/;
111+ re3 = new RegExp("([^aeiouylsz])\\1$");
112+ re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
113+ if (re2.test(w))
114+ w = w + "e";
115+ else if (re3.test(w)) {
116+ re = /.$/;
117+ w = w.replace(re,"");
118+ }
119+ else if (re4.test(w))
120+ w = w + "e";
121+ }
122+ }
123+
124+ // Step 1c
125+ re = /^(.+?)y$/;
126+ if (re.test(w)) {
127+ var fp = re.exec(w);
128+ stem = fp[1];
129+ re = new RegExp(s_v);
130+ if (re.test(stem))
131+ w = stem + "i";
132+ }
133+
134+ // Step 2
135+ re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
136+ if (re.test(w)) {
137+ var fp = re.exec(w);
138+ stem = fp[1];
139+ suffix = fp[2];
140+ re = new RegExp(mgr0);
141+ if (re.test(stem))
142+ w = stem + step2list[suffix];
143+ }
144+
145+ // Step 3
146+ re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
147+ if (re.test(w)) {
148+ var fp = re.exec(w);
149+ stem = fp[1];
150+ suffix = fp[2];
151+ re = new RegExp(mgr0);
152+ if (re.test(stem))
153+ w = stem + step3list[suffix];
154+ }
155+
156+ // Step 4
157+ re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
158+ re2 = /^(.+?)(s|t)(ion)$/;
159+ if (re.test(w)) {
160+ var fp = re.exec(w);
161+ stem = fp[1];
162+ re = new RegExp(mgr1);
163+ if (re.test(stem))
164+ w = stem;
165+ }
166+ else if (re2.test(w)) {
167+ var fp = re2.exec(w);
168+ stem = fp[1] + fp[2];
169+ re2 = new RegExp(mgr1);
170+ if (re2.test(stem))
171+ w = stem;
172+ }
173+
174+ // Step 5
175+ re = /^(.+?)e$/;
176+ if (re.test(w)) {
177+ var fp = re.exec(w);
178+ stem = fp[1];
179+ re = new RegExp(mgr1);
180+ re2 = new RegExp(meq1);
181+ re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
182+ if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
183+ w = stem;
184+ }
185+ re = /ll$/;
186+ re2 = new RegExp(mgr1);
187+ if (re.test(w) && re2.test(w)) {
188+ re = /.$/;
189+ w = w.replace(re,"");
190+ }
191+
192+ // and turn initial Y back to y
193+ if (firstch == "y")
194+ w = firstch.toLowerCase() + w.substr(1);
195+ return w;
196+ }
197+}
198+
199+
200+
201+
202+
203+var splitChars = (function() {
204+ var result = {};
205+ var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,
206+ 1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702,
207+ 2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971,
208+ 2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345,
209+ 3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761,
210+ 3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823,
211+ 4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125,
212+ 8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695,
213+ 11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587,
214+ 43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141];
215+ var i, j, start, end;
216+ for (i = 0; i < singles.length; i++) {
217+ result[singles[i]] = true;
218+ }
219+ var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709],
220+ [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161],
221+ [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568],
222+ [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807],
223+ [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047],
224+ [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383],
225+ [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450],
226+ [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547],
227+ [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673],
228+ [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820],
229+ [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946],
230+ [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023],
231+ [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173],
232+ [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332],
233+ [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481],
234+ [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718],
235+ [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791],
236+ [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095],
237+ [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205],
238+ [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687],
239+ [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968],
240+ [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869],
241+ [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102],
242+ [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271],
243+ [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592],
244+ [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822],
245+ [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167],
246+ [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959],
247+ [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143],
248+ [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318],
249+ [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483],
250+ [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101],
251+ [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567],
252+ [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292],
253+ [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444],
254+ [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783],
255+ [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311],
256+ [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511],
257+ [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774],
258+ [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071],
259+ [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263],
260+ [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519],
261+ [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647],
262+ [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967],
263+ [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295],
264+ [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274],
265+ [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007],
266+ [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381],
267+ [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]];
268+ for (i = 0; i < ranges.length; i++) {
269+ start = ranges[i][0];
270+ end = ranges[i][1];
271+ for (j = start; j <= end; j++) {
272+ result[j] = true;
273+ }
274+ }
275+ return result;
276+})();
277+
278+function splitQuery(query) {
279+ var result = [];
280+ var start = -1;
281+ for (var i = 0; i < query.length; i++) {
282+ if (splitChars[query.charCodeAt(i)]) {
283+ if (start !== -1) {
284+ result.push(query.slice(start, i));
285+ start = -1;
286+ }
287+ } else if (start === -1) {
288+ start = i;
289+ }
290+ }
291+ if (start !== -1) {
292+ result.push(query.slice(start));
293+ }
294+ return result;
295+}
296+
297+
_static/minus.pngnew file

Binary file not shown.

_static/plus.pngnew file

Binary file not shown.

_static/pocoo.cssnew file+483
@@ -0,0 +1,483 @@
1+@import url("basic.css");
2+
3+/* -- page layout --------------------------------------------------- */
4+
5+body {
6+ font-family: 'Garamond', 'Georgia', serif;
7+ font-size: 17px;
8+ background-color: #fff;
9+ color: #3e4349;
10+ margin: 0;
11+ padding: 0;
12+}
13+
14+div.related {
15+ max-width: 1140px;
16+ margin: 10px auto;
17+
18+ /* displayed on mobile */
19+ display: none;
20+}
21+
22+div.document {
23+ max-width: 1140px;
24+ margin: 10px auto;
25+}
26+
27+div.documentwrapper {
28+ float: left;
29+ width: 100%;
30+}
31+
32+div.bodywrapper {
33+ margin: 0 0 0 220px;
34+}
35+
36+div.body {
37+ min-width: initial;
38+ max-width: initial;
39+ padding: 0 30px;
40+}
41+
42+div.sphinxsidebarwrapper {
43+ padding: 10px;
44+}
45+
46+div.sphinxsidebar {
47+ width: 220px;
48+ font-size: 14px;
49+ line-height: 1.5;
50+ color: #444;
51+}
52+
53+div.sphinxsidebar a,
54+div.sphinxsidebar a code {
55+ color: #444;
56+ border-color: #444;
57+}
58+
59+div.sphinxsidebar p.logo {
60+ margin: 0;
61+ text-align: center;
62+}
63+
64+div.sphinxsidebar h3,
65+div.sphinxsidebar h4 {
66+ font-size: 24px;
67+ color: #444;
68+}
69+
70+div.sphinxsidebar p.logo a,
71+div.sphinxsidebar h3 a,
72+div.sphinxsidebar p.logo a:hover,
73+div.sphinxsidebar h3 a:hover {
74+ border: none;
75+}
76+
77+div.sphinxsidebar p,
78+div.sphinxsidebar h3,
79+div.sphinxsidebar h4 {
80+ margin: 10px 0;
81+}
82+
83+div.sphinxsidebar ul {
84+ margin: 10px 0;
85+ padding: 0;
86+}
87+
88+div.sphinxsidebar input {
89+ border: 1px solid #999;
90+ font-size: 1em;
91+}
92+
93+div.footer {
94+ max-width: 1140px;
95+ margin: 20px auto;
96+ font-size: 14px;
97+ text-align: right;
98+ color: #888;
99+}
100+
101+div.footer a {
102+ color: #888;
103+ border-color: #888;
104+}
105+
106+/* -- quick search -------------------------------------------------- */
107+
108+div.sphinxsidebar #searchbox form {
109+ display: flex;
110+}
111+
112+div.sphinxsidebar #searchbox form > div {
113+ display: flex;
114+ flex: 1 1 auto;
115+}
116+
117+div.sphinxsidebar #searchbox input[type=text] {
118+ flex: 1 1 auto;
119+ width: 1% !important;
120+}
121+
122+div.sphinxsidebar #searchbox input[type=submit] {
123+ border-left-width: 0;
124+}
125+
126+/* -- versions ------------------------------------------------------ */
127+
128+div.sphinxsidebar ul.versions a.current {
129+ font-style: italic;
130+ border-bottom: 1px solid #000;
131+ color: #000;
132+}
133+
134+div.sphinxsidebar ul.versions span.note {
135+ color: #999;
136+}
137+
138+/* -- version warning ----------------------------------------------- */
139+
140+p.version-warning {
141+ top: 10px;
142+ position: sticky;
143+
144+ margin: 10px 0;
145+ padding: 5px 10px;
146+ border-radius: 4px;
147+
148+ letter-spacing: 1px;
149+ color: #fff;
150+ text-shadow: 0 0 2px #000;
151+ text-align: center;
152+
153+ background: #d40 repeating-linear-gradient(
154+ 135deg,
155+ transparent,
156+ transparent 56px,
157+ rgba(255, 255, 255, 0.2) 56px,
158+ rgba(255, 255, 255, 0.2) 112px
159+ );
160+}
161+
162+p.version-warning a {
163+ color: #fff;
164+ border-color: #fff;
165+}
166+
167+/* -- body styles --------------------------------------------------- */
168+
169+a {
170+ text-decoration: none;
171+ border-bottom: 1px dotted #000;
172+}
173+
174+a:hover {
175+ border-bottom-style: solid;
176+}
177+
178+h1, h2, h3, h4, h5, h6 {
179+ font-weight: normal;
180+ margin: 30px 0 10px;
181+ padding: 0;
182+ color: black;
183+}
184+
185+div.body h1 {
186+ font-size: 240%;
187+}
188+
189+div.body h2 {
190+ font-size: 180%;
191+}
192+
193+div.body h3 {
194+ font-size: 150%;
195+}
196+
197+div.body h4 {
198+ font-size: 130%;
199+}
200+
201+div.body h5 {
202+ font-size: 100%;
203+}
204+
205+div.body h6 {
206+ font-size: 100%;
207+}
208+
209+div.body h1:first-of-type {
210+ margin-top: 0;
211+}
212+
213+a.headerlink {
214+ color: #ddd;
215+ margin: 0 0.2em;
216+ padding: 0 0.2em;
217+ border: none;
218+}
219+
220+a.headerlink:hover {
221+ color: #444;
222+}
223+
224+div.body p,
225+div.body dd,
226+div.body li {
227+ line-height: 1.4;
228+}
229+
230+img.screenshot {
231+ box-shadow: 2px 2px 4px #eee;
232+}
233+
234+hr {
235+ border: 1px solid #999;
236+}
237+
238+blockquote {
239+ margin: 0 0 0 30px;
240+ padding: 0;
241+}
242+
243+ul, ol {
244+ margin: 10px 0 10px 30px;
245+ padding: 0;
246+}
247+
248+a.footnote-reference {
249+ font-size: 0.7em;
250+ vertical-align: top;
251+}
252+
253+/* -- admonitions --------------------------------------------------- */
254+
255+div.admonition,
256+div.topic {
257+ background-color: #fafafa;
258+ margin: 10px -10px;
259+ padding: 10px;
260+ border-top: 1px solid #ccc;
261+ border-right: none;
262+ border-bottom: 1px solid #ccc;
263+ border-left: none;
264+}
265+
266+div.admonition p.admonition-title,
267+div.topic p.topic-title {
268+ font-weight: normal;
269+ font-size: 24px;
270+ margin: 0 0 10px 0;
271+ padding: 0;
272+ line-height: 1;
273+ display: inline;
274+}
275+
276+p.admonition-title::after {
277+ content: ":";
278+}
279+
280+div.admonition p.last,
281+div.topic p:last-child {
282+ margin-bottom: 0;
283+}
284+
285+div.danger, div.error {
286+ background-color: #fff0f0;
287+ border-color: #ffb0b0;
288+}
289+
290+div.seealso {
291+ background-color: #fffff0;
292+ border-color: #f0f0a8;
293+}
294+
295+/* -- changelog ----------------------------------------------------- */
296+
297+details.changelog summary {
298+ cursor: pointer;
299+ font-style: italic;
300+ margin-bottom: 10px;
301+}
302+
303+/* -- search highlight ---------------------------------------------- */
304+
305+dt:target,
306+.footnote:target,
307+span.highlighted {
308+ background-color: #ffdf80;
309+}
310+
311+rect.highlighted {
312+ fill: #ffdf80;
313+}
314+
315+/* -- code displays ------------------------------------------------- */
316+
317+pre, code {
318+ font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
319+ font-size: 0.9em;
320+}
321+
322+pre {
323+ margin: 0;
324+ padding: 0;
325+ line-height: 1.3;
326+}
327+
328+div.literal-block-wrapper {
329+ padding: 10px 0 0;
330+}
331+
332+div.code-block-caption {
333+ padding: 0;
334+}
335+
336+div.highlight, div.literal-block-wrapper div.highlight {
337+ margin: 10px -10px;
338+ padding: 10px;
339+}
340+
341+code {
342+ color: #222;
343+ background: #e8eff0;
344+}
345+
346+/* -- tables -------------------------------------------------------- */
347+
348+table.docutils {
349+ border: 1px solid #888;
350+ box-shadow: 2px 2px 4px #eee;
351+}
352+
353+table.docutils td,
354+table.docutils th {
355+ border: 1px solid #888;
356+ padding: 0.25em 0.7em;
357+}
358+
359+table.field-list,
360+table.footnote {
361+ border: none;
362+ box-shadow: none;
363+}
364+
365+table.footnote {
366+ margin: 15px 0;
367+ width: 100%;
368+ border: 1px solid #eee;
369+ background-color: #fafafa;
370+ font-size: 0.9em;
371+}
372+
373+table.footnote + table.footnote {
374+ margin-top: -15px;
375+ border-top: none;
376+}
377+
378+table.field-list th {
379+ padding: 0 0.8em 0 0;
380+}
381+
382+table.field-list td {
383+ padding: 0;
384+}
385+
386+table.footnote td.label {
387+ width: 0;
388+ padding: 0.3em 0 0.3em 0.5em;
389+}
390+
391+table.footnote td {
392+ padding: 0.3em 0.5em;
393+}
394+
395+/* -- responsive screen --------------------------------------------- */
396+
397+@media screen and (max-width: 1139px) {
398+ p.version-warning {
399+ margin: 10px;
400+ }
401+
402+ div.footer {
403+ margin: 20px 10px;
404+ }
405+}
406+
407+/* -- small screen -------------------------------------------------- */
408+
409+@media screen and (max-width: 767px) {
410+ body {
411+ padding: 0 20px;
412+ }
413+
414+ div.related {
415+ display: block;
416+ }
417+
418+ p.version-warning {
419+ margin: 10px 0;
420+ }
421+
422+ div.documentwrapper {
423+ float: none;
424+ }
425+
426+ div.bodywrapper {
427+ margin: 0;
428+ }
429+
430+ div.body {
431+ min-height: 0;
432+ padding: 0;
433+ }
434+
435+ div.sphinxsidebar {
436+ float: none;
437+ width: 100%;
438+ margin: 0 -20px -10px;
439+ padding: 0 20px;
440+ background-color: #333;
441+ color: #ccc;
442+ }
443+
444+ div.sphinxsidebar a,
445+ div.sphinxsidebar a code,
446+ div.sphinxsidebar h3,
447+ div.sphinxsidebar h4,
448+ div.footer a {
449+ color: #ccc;
450+ border-color: #ccc;
451+ }
452+
453+ div.sphinxsidebar p.logo {
454+ display: none;
455+ }
456+
457+ div.sphinxsidebar ul.versions a.current {
458+ border-bottom-color: #fff;
459+ color: #fff;
460+ }
461+
462+ div.footer {
463+ text-align: left;
464+ margin: 0 -20px;
465+ padding: 20px;
466+ background-color: #333;
467+ color: #ccc;
468+ }
469+}
470+
471+/* https://github.com/twbs/bootstrap/blob
472+ /0e8831505ac845f3102fa2c5996a7141c9ab01ee
473+ /scss/mixins/_screen-reader.scss */
474+.hide-header > h1:first-child {
475+ position: absolute;
476+ width: 1px;
477+ height: 1px;
478+ padding: 0;
479+ overflow: hidden;
480+ clip: rect(0, 0, 0, 0);
481+ white-space: nowrap;
482+ border: 0;
483+}
_static/pygments.cssnew file+73
@@ -0,0 +1,73 @@
1+.highlight .hll { background-color: #ffffcc }
2+.highlight { background: #f8f8f8; }
3+.highlight .c { color: #8f5902; font-style: italic } /* Comment */
4+.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */
5+.highlight .g { color: #000000 } /* Generic */
6+.highlight .k { color: #004461; font-weight: bold } /* Keyword */
7+.highlight .l { color: #000000 } /* Literal */
8+.highlight .n { color: #000000 } /* Name */
9+.highlight .o { color: #582800 } /* Operator */
10+.highlight .x { color: #000000 } /* Other */
11+.highlight .p { color: #000000; font-weight: bold } /* Punctuation */
12+.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */
13+.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */
14+.highlight .cp { color: #8f5902 } /* Comment.Preproc */
15+.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */
16+.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */
17+.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */
18+.highlight .gd { color: #a40000 } /* Generic.Deleted */
19+.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */
20+.highlight .gr { color: #ef2929 } /* Generic.Error */
21+.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
22+.highlight .gi { color: #00A000 } /* Generic.Inserted */
23+.highlight .go { color: #888888 } /* Generic.Output */
24+.highlight .gp { color: #745334 } /* Generic.Prompt */
25+.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */
26+.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
27+.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */
28+.highlight .kc { color: #004461; font-weight: bold } /* Keyword.Constant */
29+.highlight .kd { color: #004461; font-weight: bold } /* Keyword.Declaration */
30+.highlight .kn { color: #004461; font-weight: bold } /* Keyword.Namespace */
31+.highlight .kp { color: #004461; font-weight: bold } /* Keyword.Pseudo */
32+.highlight .kr { color: #004461; font-weight: bold } /* Keyword.Reserved */
33+.highlight .kt { color: #004461; font-weight: bold } /* Keyword.Type */
34+.highlight .ld { color: #000000 } /* Literal.Date */
35+.highlight .m { color: #990000 } /* Literal.Number */
36+.highlight .s { color: #4e9a06 } /* Literal.String */
37+.highlight .na { color: #c4a000 } /* Name.Attribute */
38+.highlight .nb { color: #004461 } /* Name.Builtin */
39+.highlight .nc { color: #000000 } /* Name.Class */
40+.highlight .no { color: #000000 } /* Name.Constant */
41+.highlight .nd { color: #888888 } /* Name.Decorator */
42+.highlight .ni { color: #ce5c00 } /* Name.Entity */
43+.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */
44+.highlight .nf { color: #000000 } /* Name.Function */
45+.highlight .nl { color: #f57900 } /* Name.Label */
46+.highlight .nn { color: #000000 } /* Name.Namespace */
47+.highlight .nx { color: #000000 } /* Name.Other */
48+.highlight .py { color: #000000 } /* Name.Property */
49+.highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */
50+.highlight .nv { color: #000000 } /* Name.Variable */
51+.highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */
52+.highlight .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */
53+.highlight .mb { color: #990000 } /* Literal.Number.Bin */
54+.highlight .mf { color: #990000 } /* Literal.Number.Float */
55+.highlight .mh { color: #990000 } /* Literal.Number.Hex */
56+.highlight .mi { color: #990000 } /* Literal.Number.Integer */
57+.highlight .mo { color: #990000 } /* Literal.Number.Oct */
58+.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */
59+.highlight .sc { color: #4e9a06 } /* Literal.String.Char */
60+.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */
61+.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */
62+.highlight .se { color: #4e9a06 } /* Literal.String.Escape */
63+.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */
64+.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */
65+.highlight .sx { color: #4e9a06 } /* Literal.String.Other */
66+.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */
67+.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */
68+.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */
69+.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */
70+.highlight .vc { color: #000000 } /* Name.Variable.Class */
71+.highlight .vg { color: #000000 } /* Name.Variable.Global */
72+.highlight .vi { color: #000000 } /* Name.Variable.Instance */
73+.highlight .il { color: #990000 } /* Literal.Number.Integer.Long */
_static/searchtools.jsnew file+515
@@ -0,0 +1,515 @@
1+/*
2+ * searchtools.js
3+ * ~~~~~~~~~~~~~~~~
4+ *
5+ * Sphinx JavaScript utilities for the full-text search.
6+ *
7+ * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
8+ * :license: BSD, see LICENSE for details.
9+ *
10+ */
11+
12+if (!Scorer) {
13+ /**
14+ * Simple result scoring code.
15+ */
16+ var Scorer = {
17+ // Implement the following function to further tweak the score for each result
18+ // The function takes a result array [filename, title, anchor, descr, score]
19+ // and returns the new score.
20+ /*
21+ score: function(result) {
22+ return result[4];
23+ },
24+ */
25+
26+ // query matches the full name of an object
27+ objNameMatch: 11,
28+ // or matches in the last dotted part of the object name
29+ objPartialMatch: 6,
30+ // Additive scores depending on the priority of the object
31+ objPrio: {0: 15, // used to be importantResults
32+ 1: 5, // used to be objectResults
33+ 2: -5}, // used to be unimportantResults
34+ // Used when the priority is not in the mapping.
35+ objPrioDefault: 0,
36+
37+ // query found in title
38+ title: 15,
39+ partialTitle: 7,
40+ // query found in terms
41+ term: 5,
42+ partialTerm: 2
43+ };
44+}
45+
46+if (!splitQuery) {
47+ function splitQuery(query) {
48+ return query.split(/\s+/);
49+ }
50+}
51+
52+/**
53+ * Search Module
54+ */
55+var Search = {
56+
57+ _index : null,
58+ _queued_query : null,
59+ _pulse_status : -1,
60+
61+ htmlToText : function(htmlString) {
62+ var htmlElement = document.createElement('span');
63+ htmlElement.innerHTML = htmlString;
64+ $(htmlElement).find('.headerlink').remove();
65+ docContent = $(htmlElement).find('[role=main]')[0];
66+ if(docContent === undefined) {
67+ console.warn("Content block not found. Sphinx search tries to obtain it " +
68+ "via '[role=main]'. Could you check your theme or template.");
69+ return "";
70+ }
71+ return docContent.textContent || docContent.innerText;
72+ },
73+
74+ init : function() {
75+ var params = $.getQueryParameters();
76+ if (params.q) {
77+ var query = params.q[0];
78+ $('input[name="q"]')[0].value = query;
79+ this.performSearch(query);
80+ }
81+ },
82+
83+ loadIndex : function(url) {
84+ $.ajax({type: "GET", url: url, data: null,
85+ dataType: "script", cache: true,
86+ complete: function(jqxhr, textstatus) {
87+ if (textstatus != "success") {
88+ document.getElementById("searchindexloader").src = url;
89+ }
90+ }});
91+ },
92+
93+ setIndex : function(index) {
94+ var q;
95+ this._index = index;
96+ if ((q = this._queued_query) !== null) {
97+ this._queued_query = null;
98+ Search.query(q);
99+ }
100+ },
101+
102+ hasIndex : function() {
103+ return this._index !== null;
104+ },
105+
106+ deferQuery : function(query) {
107+ this._queued_query = query;
108+ },
109+
110+ stopPulse : function() {
111+ this._pulse_status = 0;
112+ },
113+
114+ startPulse : function() {
115+ if (this._pulse_status >= 0)
116+ return;
117+ function pulse() {
118+ var i;
119+ Search._pulse_status = (Search._pulse_status + 1) % 4;
120+ var dotString = '';
121+ for (i = 0; i < Search._pulse_status; i++)
122+ dotString += '.';
123+ Search.dots.text(dotString);
124+ if (Search._pulse_status > -1)
125+ window.setTimeout(pulse, 500);
126+ }
127+ pulse();
128+ },
129+
130+ /**
131+ * perform a search for something (or wait until index is loaded)
132+ */
133+ performSearch : function(query) {
134+ // create the required interface elements
135+ this.out = $('#search-results');
136+ this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
137+ this.dots = $('<span></span>').appendTo(this.title);
138+ this.status = $('<p class="search-summary">&nbsp;</p>').appendTo(this.out);
139+ this.output = $('<ul class="search"/>').appendTo(this.out);
140+
141+ $('#search-progress').text(_('Preparing search...'));
142+ this.startPulse();
143+
144+ // index already loaded, the browser was quick!
145+ if (this.hasIndex())
146+ this.query(query);
147+ else
148+ this.deferQuery(query);
149+ },
150+
151+ /**
152+ * execute search (requires search index to be loaded)
153+ */
154+ query : function(query) {
155+ var i;
156+
157+ // stem the searchterms and add them to the correct list
158+ var stemmer = new Stemmer();
159+ var searchterms = [];
160+ var excluded = [];
161+ var hlterms = [];
162+ var tmp = splitQuery(query);
163+ var objectterms = [];
164+ for (i = 0; i < tmp.length; i++) {
165+ if (tmp[i] !== "") {
166+ objectterms.push(tmp[i].toLowerCase());
167+ }
168+
169+ if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i].match(/^\d+$/) ||
170+ tmp[i] === "") {
171+ // skip this "word"
172+ continue;
173+ }
174+ // stem the word
175+ var word = stemmer.stemWord(tmp[i].toLowerCase());
176+ // prevent stemmer from cutting word smaller than two chars
177+ if(word.length < 3 && tmp[i].length >= 3) {
178+ word = tmp[i];
179+ }
180+ var toAppend;
181+ // select the correct list
182+ if (word[0] == '-') {
183+ toAppend = excluded;
184+ word = word.substr(1);
185+ }
186+ else {
187+ toAppend = searchterms;
188+ hlterms.push(tmp[i].toLowerCase());
189+ }
190+ // only add if not already in the list
191+ if (!$u.contains(toAppend, word))
192+ toAppend.push(word);
193+ }
194+ var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
195+
196+ // console.debug('SEARCH: searching for:');
197+ // console.info('required: ', searchterms);
198+ // console.info('excluded: ', excluded);
199+
200+ // prepare search
201+ var terms = this._index.terms;
202+ var titleterms = this._index.titleterms;
203+
204+ // array of [filename, title, anchor, descr, score]
205+ var results = [];
206+ $('#search-progress').empty();
207+
208+ // lookup as object
209+ for (i = 0; i < objectterms.length; i++) {
210+ var others = [].concat(objectterms.slice(0, i),
211+ objectterms.slice(i+1, objectterms.length));
212+ results = results.concat(this.performObjectSearch(objectterms[i], others));
213+ }
214+
215+ // lookup as search terms in fulltext
216+ results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));
217+
218+ // let the scorer override scores with a custom scoring function
219+ if (Scorer.score) {
220+ for (i = 0; i < results.length; i++)
221+ results[i][4] = Scorer.score(results[i]);
222+ }
223+
224+ // now sort the results by score (in opposite order of appearance, since the
225+ // display function below uses pop() to retrieve items) and then
226+ // alphabetically
227+ results.sort(function(a, b) {
228+ var left = a[4];
229+ var right = b[4];
230+ if (left > right) {
231+ return 1;
232+ } else if (left < right) {
233+ return -1;
234+ } else {
235+ // same score: sort alphabetically
236+ left = a[1].toLowerCase();
237+ right = b[1].toLowerCase();
238+ return (left > right) ? -1 : ((left < right) ? 1 : 0);
239+ }
240+ });
241+
242+ // for debugging
243+ //Search.lastresults = results.slice(); // a copy
244+ //console.info('search results:', Search.lastresults);
245+
246+ // print the results
247+ var resultCount = results.length;
248+ function displayNextItem() {
249+ // results left, load the summary and display it
250+ if (results.length) {
251+ var item = results.pop();
252+ var listItem = $('<li style="display:none"></li>');
253+ var requestUrl = "";
254+ var linkUrl = "";
255+ if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') {
256+ // dirhtml builder
257+ var dirname = item[0] + '/';
258+ if (dirname.match(/\/index\/$/)) {
259+ dirname = dirname.substring(0, dirname.length-6);
260+ } else if (dirname == 'index/') {
261+ dirname = '';
262+ }
263+ requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + dirname;
264+ linkUrl = requestUrl;
265+
266+ } else {
267+ // normal html builders
268+ requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX;
269+ linkUrl = item[0] + DOCUMENTATION_OPTIONS.LINK_SUFFIX;
270+ }
271+ listItem.append($('<a/>').attr('href',
272+ linkUrl +
273+ highlightstring + item[2]).html(item[1]));
274+ if (item[3]) {
275+ listItem.append($('<span> (' + item[3] + ')</span>'));
276+ Search.output.append(listItem);
277+ listItem.slideDown(5, function() {
278+ displayNextItem();
279+ });
280+ } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
281+ $.ajax({url: requestUrl,
282+ dataType: "text",
283+ complete: function(jqxhr, textstatus) {
284+ var data = jqxhr.responseText;
285+ if (data !== '' && data !== undefined) {
286+ listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
287+ }
288+ Search.output.append(listItem);
289+ listItem.slideDown(5, function() {
290+ displayNextItem();
291+ });
292+ }});
293+ } else {
294+ // no source available, just display title
295+ Search.output.append(listItem);
296+ listItem.slideDown(5, function() {
297+ displayNextItem();
298+ });
299+ }
300+ }
301+ // search finished, update title and status message
302+ else {
303+ Search.stopPulse();
304+ Search.title.text(_('Search Results'));
305+ if (!resultCount)
306+ Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
307+ else
308+ Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
309+ Search.status.fadeIn(500);
310+ }
311+ }
312+ displayNextItem();
313+ },
314+
315+ /**
316+ * search for object names
317+ */
318+ performObjectSearch : function(object, otherterms) {
319+ var filenames = this._index.filenames;
320+ var docnames = this._index.docnames;
321+ var objects = this._index.objects;
322+ var objnames = this._index.objnames;
323+ var titles = this._index.titles;
324+
325+ var i;
326+ var results = [];
327+
328+ for (var prefix in objects) {
329+ for (var name in objects[prefix]) {
330+ var fullname = (prefix ? prefix + '.' : '') + name;
331+ var fullnameLower = fullname.toLowerCase()
332+ if (fullnameLower.indexOf(object) > -1) {
333+ var score = 0;
334+ var parts = fullnameLower.split('.');
335+ // check for different match types: exact matches of full name or
336+ // "last name" (i.e. last dotted part)
337+ if (fullnameLower == object || parts[parts.length - 1] == object) {
338+ score += Scorer.objNameMatch;
339+ // matches in last name
340+ } else if (parts[parts.length - 1].indexOf(object) > -1) {
341+ score += Scorer.objPartialMatch;
342+ }
343+ var match = objects[prefix][name];
344+ var objname = objnames[match[1]][2];
345+ var title = titles[match[0]];
346+ // If more than one term searched for, we require other words to be
347+ // found in the name/title/description
348+ if (otherterms.length > 0) {
349+ var haystack = (prefix + ' ' + name + ' ' +
350+ objname + ' ' + title).toLowerCase();
351+ var allfound = true;
352+ for (i = 0; i < otherterms.length; i++) {
353+ if (haystack.indexOf(otherterms[i]) == -1) {
354+ allfound = false;
355+ break;
356+ }
357+ }
358+ if (!allfound) {
359+ continue;
360+ }
361+ }
362+ var descr = objname + _(', in ') + title;
363+
364+ var anchor = match[3];
365+ if (anchor === '')
366+ anchor = fullname;
367+ else if (anchor == '-')
368+ anchor = objnames[match[1]][1] + '-' + fullname;
369+ // add custom score for some objects according to scorer
370+ if (Scorer.objPrio.hasOwnProperty(match[2])) {
371+ score += Scorer.objPrio[match[2]];
372+ } else {
373+ score += Scorer.objPrioDefault;
374+ }
375+ results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]);
376+ }
377+ }
378+ }
379+
380+ return results;
381+ },
382+
383+ /**
384+ * search for full-text terms in the index
385+ */
386+ performTermsSearch : function(searchterms, excluded, terms, titleterms) {
387+ var docnames = this._index.docnames;
388+ var filenames = this._index.filenames;
389+ var titles = this._index.titles;
390+
391+ var i, j, file;
392+ var fileMap = {};
393+ var scoreMap = {};
394+ var results = [];
395+
396+ // perform the search on the required terms
397+ for (i = 0; i < searchterms.length; i++) {
398+ var word = searchterms[i];
399+ var files = [];
400+ var _o = [
401+ {files: terms[word], score: Scorer.term},
402+ {files: titleterms[word], score: Scorer.title}
403+ ];
404+ // add support for partial matches
405+ if (word.length > 2) {
406+ for (var w in terms) {
407+ if (w.match(word) && !terms[word]) {
408+ _o.push({files: terms[w], score: Scorer.partialTerm})
409+ }
410+ }
411+ for (var w in titleterms) {
412+ if (w.match(word) && !titleterms[word]) {
413+ _o.push({files: titleterms[w], score: Scorer.partialTitle})
414+ }
415+ }
416+ }
417+
418+ // no match but word was a required one
419+ if ($u.every(_o, function(o){return o.files === undefined;})) {
420+ break;
421+ }
422+ // found search word in contents
423+ $u.each(_o, function(o) {
424+ var _files = o.files;
425+ if (_files === undefined)
426+ return
427+
428+ if (_files.length === undefined)
429+ _files = [_files];
430+ files = files.concat(_files);
431+
432+ // set score for the word in each file to Scorer.term
433+ for (j = 0; j < _files.length; j++) {
434+ file = _files[j];
435+ if (!(file in scoreMap))
436+ scoreMap[file] = {};
437+ scoreMap[file][word] = o.score;
438+ }
439+ });
440+
441+ // create the mapping
442+ for (j = 0; j < files.length; j++) {
443+ file = files[j];
444+ if (file in fileMap && fileMap[file].indexOf(word) === -1)
445+ fileMap[file].push(word);
446+ else
447+ fileMap[file] = [word];
448+ }
449+ }
450+
451+ // now check if the files don't contain excluded terms
452+ for (file in fileMap) {
453+ var valid = true;
454+
455+ // check if all requirements are matched
456+ var filteredTermCount = // as search terms with length < 3 are discarded: ignore
457+ searchterms.filter(function(term){return term.length > 2}).length
458+ if (
459+ fileMap[file].length != searchterms.length &&
460+ fileMap[file].length != filteredTermCount
461+ ) continue;
462+
463+ // ensure that none of the excluded terms is in the search result
464+ for (i = 0; i < excluded.length; i++) {
465+ if (terms[excluded[i]] == file ||
466+ titleterms[excluded[i]] == file ||
467+ $u.contains(terms[excluded[i]] || [], file) ||
468+ $u.contains(titleterms[excluded[i]] || [], file)) {
469+ valid = false;
470+ break;
471+ }
472+ }
473+
474+ // if we have still a valid result we can add it to the result list
475+ if (valid) {
476+ // select one (max) score for the file.
477+ // for better ranking, we should calculate ranking by using words statistics like basic tf-idf...
478+ var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));
479+ results.push([docnames[file], titles[file], '', null, score, filenames[file]]);
480+ }
481+ }
482+ return results;
483+ },
484+
485+ /**
486+ * helper function to return a node containing the
487+ * search summary for a given text. keywords is a list
488+ * of stemmed words, hlwords is the list of normal, unstemmed
489+ * words. the first one is used to find the occurrence, the
490+ * latter for highlighting it.
491+ */
492+ makeSearchSummary : function(htmlText, keywords, hlwords) {
493+ var text = Search.htmlToText(htmlText);
494+ var textLower = text.toLowerCase();
495+ var start = 0;
496+ $.each(keywords, function() {
497+ var i = textLower.indexOf(this.toLowerCase());
498+ if (i > -1)
499+ start = i;
500+ });
501+ start = Math.max(start - 120, 0);
502+ var excerpt = ((start > 0) ? '...' : '') +
503+ $.trim(text.substr(start, 240)) +
504+ ((start + 240 - text.length) ? '...' : '');
505+ var rv = $('<div class="context"></div>').text(excerpt);
506+ $.each(hlwords, function() {
507+ rv = rv.highlightText(this, 'highlighted');
508+ });
509+ return rv;
510+ }
511+};
512+
513+$(document).ready(function() {
514+ Search.init();
515+});
docs/_themes/searx/static/searx.css → _static/searx.cssrenamed

The content is the same.

_static/searx_logo_small.pngnew file

Binary file not shown.

_static/sphinx_tabs/semantic-ui-2.4.1/menu.min.cssnew file+1
@@ -0,0 +1 @@
1+.ui.menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin:1rem 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;background:#fff;font-weight:400;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);border-radius:.28571429rem;min-height:2.85714286em}.ui.menu:after{content:'';display:block;height:0;clear:both;visibility:hidden}.ui.menu:first-child{margin-top:0}.ui.menu:last-child{margin-bottom:0}.ui.menu .menu{margin:0}.ui.menu:not(.vertical)>.menu{display:-webkit-box;display:-ms-flexbox;display:flex}.ui.menu:not(.vertical) .item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.menu .item{position:relative;vertical-align:middle;line-height:1;text-decoration:none;-webkit-tap-highlight-color:transparent;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:0 0;padding:.92857143em 1.14285714em;text-transform:none;color:rgba(0,0,0,.87);font-weight:400;-webkit-transition:background .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background .1s ease,box-shadow .1s ease,color .1s ease;transition:background .1s ease,box-shadow .1s ease,color .1s ease,-webkit-box-shadow .1s ease}.ui.menu>.item:first-child{border-radius:.28571429rem 0 0 .28571429rem}.ui.menu .item:before{position:absolute;content:'';top:0;right:0;height:100%;width:1px;background:rgba(34,36,38,.1)}.ui.menu .item>a:not(.ui),.ui.menu .item>p:only-child,.ui.menu .text.item>*{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;line-height:1.3}.ui.menu .item>p:first-child{margin-top:0}.ui.menu .item>p:last-child{margin-bottom:0}.ui.menu .item>i.icon{opacity:.9;float:none;margin:0 .35714286em 0 0}.ui.menu:not(.vertical) .item>.button{position:relative;top:0;margin:-.5em 0;padding-bottom:.78571429em;padding-top:.78571429em;font-size:1em}.ui.menu>.container,.ui.menu>.grid{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:inherit;-ms-flex-align:inherit;align-items:inherit;-webkit-box-orient:inherit;-webkit-box-direction:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.menu .item>.input{width:100%}.ui.menu:not(.vertical) .item>.input{position:relative;top:0;margin:-.5em 0}.ui.menu .item>.input input{font-size:1em;padding-top:.57142857em;padding-bottom:.57142857em}.ui.menu .header.item,.ui.vertical.menu .header.item{margin:0;background:'';text-transform:normal;font-weight:700}.ui.vertical.menu .item>.header:not(.ui){margin:0 0 .5em;font-size:1em;font-weight:700}.ui.menu .item>i.dropdown.icon{padding:0;float:right;margin:0 0 0 1em}.ui.menu .dropdown.item .menu{min-width:calc(100% - 1px);border-radius:0 0 .28571429rem .28571429rem;background:#fff;margin:0 0 0;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.08);box-shadow:0 1px 3px 0 rgba(0,0,0,.08);-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.ui.menu .ui.dropdown .menu>.item{margin:0;text-align:left;font-size:1em!important;padding:.78571429em 1.14285714em!important;background:0 0!important;color:rgba(0,0,0,.87)!important;text-transform:none!important;font-weight:400!important;-webkit-box-shadow:none!important;box-shadow:none!important;-webkit-transition:none!important;transition:none!important}.ui.menu .ui.dropdown .menu>.item:hover{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown .menu>.selected.item{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown .menu>.active.item{background:rgba(0,0,0,.03)!important;font-weight:700!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown.item .menu .item:not(.filtered){display:block}.ui.menu .ui.dropdown .menu>.item .icon:not(.dropdown){display:inline-block;font-size:1em!important;float:none;margin:0 .75em 0 0!important}.ui.secondary.menu .dropdown.item>.menu,.ui.text.menu .dropdown.item>.menu{border-radius:.28571429rem;margin-top:.35714286em}.ui.menu .pointing.dropdown.item .menu{margin-top:.75em}.ui.inverted.menu .search.dropdown.item>.search,.ui.inverted.menu .search.dropdown.item>.text{color:rgba(255,255,255,.9)}.ui.vertical.menu .dropdown.item>.icon{float:right;content:"\f0da";margin-left:1em}.ui.vertical.menu .dropdown.item .menu{left:100%;min-width:0;margin:0;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.08);box-shadow:0 1px 3px 0 rgba(0,0,0,.08);border-radius:0 .28571429rem .28571429rem .28571429rem}.ui.vertical.menu .dropdown.item.upward .menu{bottom:0}.ui.vertical.menu .dropdown.item:not(.upward) .menu{top:0}.ui.vertical.menu .active.dropdown.item{border-top-right-radius:0;border-bottom-right-radius:0}.ui.vertical.menu .dropdown.active.item{-webkit-box-shadow:none;box-shadow:none}.ui.item.menu .dropdown .menu .item{width:100%}.ui.menu .item>.label{background:#999;color:#fff;margin-left:1em;padding:.3em .78571429em}.ui.vertical.menu .item>.label{background:#999;color:#fff;margin-top:-.15em;margin-bottom:-.15em;padding:.3em .78571429em}.ui.menu .item>.floating.label{padding:.3em .78571429em}.ui.menu .item>img:not(.ui){display:inline-block;vertical-align:middle;margin:-.3em 0;width:2.5em}.ui.vertical.menu .item>img:not(.ui):only-child{display:block;max-width:100%;width:auto}.ui.menu .list .item:before{background:0 0!important}.ui.vertical.sidebar.menu>.item:first-child:before{display:block!important}.ui.vertical.sidebar.menu>.item::before{top:auto;bottom:0}@media only screen and (max-width:767px){.ui.menu>.ui.container{width:100%!important;margin-left:0!important;margin-right:0!important}}@media only screen and (min-width:768px){.ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless)>.container>.item:not(.right):not(.borderless):first-child{border-left:1px solid rgba(34,36,38,.1)}}.ui.link.menu .item:hover,.ui.menu .dropdown.item:hover,.ui.menu .link.item:hover,.ui.menu a.item:hover{cursor:pointer;background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.link.menu .item:active,.ui.menu .link.item:active,.ui.menu a.item:active{background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.menu .active.item{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);font-weight:400;-webkit-box-shadow:none;box-shadow:none}.ui.menu .active.item>i.icon{opacity:1}.ui.menu .active.item:hover,.ui.vertical.menu .active.item:hover{background-color:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.menu .item.disabled,.ui.menu .item.disabled:hover{cursor:default!important;background-color:transparent!important;color:rgba(40,40,40,.3)!important}.ui.menu:not(.vertical) .left.item,.ui.menu:not(.vertical) :not(.dropdown)>.left.menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin-right:auto!important}.ui.menu:not(.vertical) .right.item,.ui.menu:not(.vertical) .right.menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin-left:auto!important}.ui.menu .right.item::before,.ui.menu .right.menu>.item::before{right:auto;left:0}.ui.vertical.menu{display:block;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.ui.vertical.menu .item{display:block;background:0 0;border-top:none;border-right:none}.ui.vertical.menu>.item:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.menu>.item:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.menu .item>.label{float:right;text-align:center}.ui.vertical.menu .item>i.icon{width:1.18em;float:right;margin:0 0 0 .5em}.ui.vertical.menu .item>.label+i.icon{float:none;margin:0 .5em 0 0}.ui.vertical.menu .item:before{position:absolute;content:'';top:0;left:0;width:100%;height:1px;background:rgba(34,36,38,.1)}.ui.vertical.menu .item:first-child:before{display:none!important}.ui.vertical.menu .item>.menu{margin:.5em -1.14285714em 0}.ui.vertical.menu .menu .item{background:0 0;padding:.5em 1.33333333em;font-size:.85714286em;color:rgba(0,0,0,.5)}.ui.vertical.menu .item .menu .link.item:hover,.ui.vertical.menu .item .menu a.item:hover{color:rgba(0,0,0,.85)}.ui.vertical.menu .menu .item:before{display:none}.ui.vertical.menu .active.item{background:rgba(0,0,0,.05);border-radius:0;-webkit-box-shadow:none;box-shadow:none}.ui.vertical.menu>.active.item:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.menu>.active.item:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.menu>.active.item:only-child{border-radius:.28571429rem}.ui.vertical.menu .active.item .menu .active.item{border-left:none}.ui.vertical.menu .item .menu .active.item{background-color:transparent;font-weight:700;color:rgba(0,0,0,.95)}.ui.tabular.menu{border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border:none;background:none transparent;border-bottom:1px solid #d4d4d5}.ui.tabular.fluid.menu{width:calc(100% + (1px * 2))!important}.ui.tabular.menu .item{background:0 0;border-bottom:none;border-left:1px solid transparent;border-right:1px solid transparent;border-top:2px solid transparent;padding:.92857143em 1.42857143em;color:rgba(0,0,0,.87)}.ui.tabular.menu .item:before{display:none}.ui.tabular.menu .item:hover{background-color:transparent;color:rgba(0,0,0,.8)}.ui.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-top-width:1px;border-color:#d4d4d5;font-weight:700;margin-bottom:-1px;-webkit-box-shadow:none;box-shadow:none;border-radius:.28571429rem .28571429rem 0 0!important}.ui.tabular.menu+.attached:not(.top).segment,.ui.tabular.menu+.attached:not(.top).segment+.attached:not(.top).segment{border-top:none;margin-left:0;margin-top:0;margin-right:0;width:100%}.top.attached.segment+.ui.bottom.tabular.menu{position:relative;width:calc(100% + (1px * 2));left:-1px}.ui.bottom.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:none;border-top:1px solid #d4d4d5}.ui.bottom.tabular.menu .item{background:0 0;border-left:1px solid transparent;border-right:1px solid transparent;border-bottom:1px solid transparent;border-top:none}.ui.bottom.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:-1px 0 0 0;border-radius:0 0 .28571429rem .28571429rem!important}.ui.vertical.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:none;border-right:1px solid #d4d4d5}.ui.vertical.tabular.menu .item{background:0 0;border-left:1px solid transparent;border-bottom:1px solid transparent;border-top:1px solid transparent;border-right:none}.ui.vertical.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:0 -1px 0 0;border-radius:.28571429rem 0 0 .28571429rem!important}.ui.vertical.right.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:none;border-right:none;border-left:1px solid #d4d4d5}.ui.vertical.right.tabular.menu .item{background:0 0;border-right:1px solid transparent;border-bottom:1px solid transparent;border-top:1px solid transparent;border-left:none}.ui.vertical.right.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:0 0 0 -1px;border-radius:0 .28571429rem .28571429rem 0!important}.ui.tabular.menu .active.dropdown.item{margin-bottom:0;border-left:1px solid transparent;border-right:1px solid transparent;border-top:2px solid transparent;border-bottom:none}.ui.pagination.menu{margin:0;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.ui.pagination.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.compact.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.pagination.menu .item:last-child:before{display:none}.ui.pagination.menu .item{min-width:3em;text-align:center}.ui.pagination.menu .icon.item i.icon{vertical-align:top}.ui.pagination.menu .active.item{border-top:none;padding-top:.92857143em;background-color:rgba(0,0,0,.05);color:rgba(0,0,0,.95);-webkit-box-shadow:none;box-shadow:none}.ui.secondary.menu{background:0 0;margin-left:-.35714286em;margin-right:-.35714286em;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none}.ui.secondary.menu .item{-ms-flex-item-align:center;align-self:center;-webkit-box-shadow:none;box-shadow:none;border:none;padding:.78571429em .92857143em;margin:0 .35714286em;background:0 0;-webkit-transition:color .1s ease;transition:color .1s ease;border-radius:.28571429rem}.ui.secondary.menu .item:before{display:none!important}.ui.secondary.menu .header.item{border-radius:0;border-right:none;background:none transparent}.ui.secondary.menu .item>img:not(.ui){margin:0}.ui.secondary.menu .dropdown.item:hover,.ui.secondary.menu .link.item:hover,.ui.secondary.menu a.item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.secondary.menu .active.item{-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);border-radius:.28571429rem}.ui.secondary.menu .active.item:hover{-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.secondary.inverted.menu .link.item,.ui.secondary.inverted.menu a.item{color:rgba(255,255,255,.7)!important}.ui.secondary.inverted.menu .dropdown.item:hover,.ui.secondary.inverted.menu .link.item:hover,.ui.secondary.inverted.menu a.item:hover{background:rgba(255,255,255,.08);color:#fff!important}.ui.secondary.inverted.menu .active.item{background:rgba(255,255,255,.15);color:#fff!important}.ui.secondary.item.menu{margin-left:0;margin-right:0}.ui.secondary.item.menu .item:last-child{margin-right:0}.ui.secondary.attached.menu{-webkit-box-shadow:none;box-shadow:none}.ui.vertical.secondary.menu .item:not(.dropdown)>.menu{margin:0 -.92857143em}.ui.vertical.secondary.menu .item:not(.dropdown)>.menu>.item{margin:0;padding:.5em 1.33333333em}.ui.secondary.vertical.menu>.item{border:none;margin:0 0 .35714286em;border-radius:.28571429rem!important}.ui.secondary.vertical.menu>.header.item{border-radius:0}.ui.vertical.secondary.menu .item>.menu .item{background-color:transparent}.ui.secondary.inverted.menu{background-color:transparent}.ui.secondary.pointing.menu{margin-left:0;margin-right:0;border-bottom:2px solid rgba(34,36,38,.15)}.ui.secondary.pointing.menu .item{border-bottom-color:transparent;border-bottom-style:solid;border-radius:0;-ms-flex-item-align:end;align-self:flex-end;margin:0 0 -2px;padding:.85714286em 1.14285714em;border-bottom-width:2px;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.secondary.pointing.menu .header.item{color:rgba(0,0,0,.85)!important}.ui.secondary.pointing.menu .text.item{-webkit-box-shadow:none!important;box-shadow:none!important}.ui.secondary.pointing.menu .item:after{display:none}.ui.secondary.pointing.menu .dropdown.item:hover,.ui.secondary.pointing.menu .link.item:hover,.ui.secondary.pointing.menu a.item:hover{background-color:transparent;color:rgba(0,0,0,.87)}.ui.secondary.pointing.menu .dropdown.item:active,.ui.secondary.pointing.menu .link.item:active,.ui.secondary.pointing.menu a.item:active{background-color:transparent;border-color:rgba(34,36,38,.15)}.ui.secondary.pointing.menu .active.item{background-color:transparent;-webkit-box-shadow:none;box-shadow:none;border-color:#1b1c1d;font-weight:700;color:rgba(0,0,0,.95)}.ui.secondary.pointing.menu .active.item:hover{border-color:#1b1c1d;color:rgba(0,0,0,.95)}.ui.secondary.pointing.menu .active.dropdown.item{border-color:transparent}.ui.secondary.vertical.pointing.menu{border-bottom-width:0;border-right-width:2px;border-right-style:solid;border-right-color:rgba(34,36,38,.15)}.ui.secondary.vertical.pointing.menu .item{border-bottom:none;border-right-style:solid;border-right-color:transparent;border-radius:0!important;margin:0 -2px 0 0;border-right-width:2px}.ui.secondary.vertical.pointing.menu .active.item{border-color:#1b1c1d}.ui.secondary.inverted.pointing.menu{border-color:rgba(255,255,255,.1)}.ui.secondary.inverted.pointing.menu{border-width:2px;border-color:rgba(34,36,38,.15)}.ui.secondary.inverted.pointing.menu .item{color:rgba(255,255,255,.9)}.ui.secondary.inverted.pointing.menu .header.item{color:#fff!important}.ui.secondary.inverted.pointing.menu .link.item:hover,.ui.secondary.inverted.pointing.menu a.item:hover{color:rgba(0,0,0,.95)}.ui.secondary.inverted.pointing.menu .active.item{border-color:#fff;color:#fff}.ui.text.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none;box-shadow:none;border:none;margin:1em -.5em}.ui.text.menu .item{border-radius:0;-webkit-box-shadow:none;box-shadow:none;-ms-flex-item-align:center;align-self:center;margin:0 0;padding:.35714286em .5em;font-weight:400;color:rgba(0,0,0,.6);-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.text.menu .item:before,.ui.text.menu .menu .item:before{display:none!important}.ui.text.menu .header.item{background-color:transparent;opacity:1;color:rgba(0,0,0,.85);font-size:.92857143em;text-transform:uppercase;font-weight:700}.ui.text.menu .item>img:not(.ui){margin:0}.ui.text.item.menu .item{margin:0}.ui.vertical.text.menu{margin:1em 0}.ui.vertical.text.menu:first-child{margin-top:0}.ui.vertical.text.menu:last-child{margin-bottom:0}.ui.vertical.text.menu .item{margin:.57142857em 0;padding-left:0;padding-right:0}.ui.vertical.text.menu .item>i.icon{float:none;margin:0 .35714286em 0 0}.ui.vertical.text.menu .header.item{margin:.57142857em 0 .71428571em}.ui.vertical.text.menu .item:not(.dropdown)>.menu{margin:0}.ui.vertical.text.menu .item:not(.dropdown)>.menu>.item{margin:0;padding:.5em 0}.ui.text.menu .item:hover{opacity:1;background-color:transparent}.ui.text.menu .active.item{background-color:transparent;border:none;-webkit-box-shadow:none;box-shadow:none;font-weight:400;color:rgba(0,0,0,.95)}.ui.text.menu .active.item:hover{background-color:transparent}.ui.text.pointing.menu .active.item:after{-webkit-box-shadow:none;box-shadow:none}.ui.text.attached.menu{-webkit-box-shadow:none;box-shadow:none}.ui.inverted.text.menu,.ui.inverted.text.menu .active.item,.ui.inverted.text.menu .item,.ui.inverted.text.menu .item:hover{background-color:transparent!important}.ui.fluid.text.menu{margin-left:0;margin-right:0}.ui.vertical.icon.menu{display:inline-block;width:auto}.ui.icon.menu .item{height:auto;text-align:center;color:#1b1c1d}.ui.icon.menu .item>.icon:not(.dropdown){margin:0;opacity:1}.ui.icon.menu .icon:before{opacity:1}.ui.menu .icon.item>.icon{width:auto;margin:0 auto}.ui.vertical.icon.menu .item>.icon:not(.dropdown){display:block;opacity:1;margin:0 auto;float:none}.ui.inverted.icon.menu .item{color:#fff}.ui.labeled.icon.menu{text-align:center}.ui.labeled.icon.menu .item{min-width:6em;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.labeled.icon.menu .item>.icon:not(.dropdown){height:1em;display:block;font-size:1.71428571em!important;margin:0 auto .5rem!important}.ui.fluid.labeled.icon.menu>.item{min-width:0}@media only screen and (max-width:767px){.ui.stackable.menu{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.stackable.menu .item{width:100%!important}.ui.stackable.menu .item:before{position:absolute;content:'';top:auto;bottom:0;left:0;width:100%;height:1px;background:rgba(34,36,38,.1)}.ui.stackable.menu .left.item,.ui.stackable.menu .left.menu{margin-right:0!important}.ui.stackable.menu .right.item,.ui.stackable.menu .right.menu{margin-left:0!important}.ui.stackable.menu .left.menu,.ui.stackable.menu .right.menu{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.ui.menu .red.active.item,.ui.red.menu .active.item{border-color:#db2828!important;color:#db2828!important}.ui.menu .orange.active.item,.ui.orange.menu .active.item{border-color:#f2711c!important;color:#f2711c!important}.ui.menu .yellow.active.item,.ui.yellow.menu .active.item{border-color:#fbbd08!important;color:#fbbd08!important}.ui.menu .olive.active.item,.ui.olive.menu .active.item{border-color:#b5cc18!important;color:#b5cc18!important}.ui.green.menu .active.item,.ui.menu .green.active.item{border-color:#21ba45!important;color:#21ba45!important}.ui.menu .teal.active.item,.ui.teal.menu .active.item{border-color:#00b5ad!important;color:#00b5ad!important}.ui.blue.menu .active.item,.ui.menu .blue.active.item{border-color:#2185d0!important;color:#2185d0!important}.ui.menu .violet.active.item,.ui.violet.menu .active.item{border-color:#6435c9!important;color:#6435c9!important}.ui.menu .purple.active.item,.ui.purple.menu .active.item{border-color:#a333c8!important;color:#a333c8!important}.ui.menu .pink.active.item,.ui.pink.menu .active.item{border-color:#e03997!important;color:#e03997!important}.ui.brown.menu .active.item,.ui.menu .brown.active.item{border-color:#a5673f!important;color:#a5673f!important}.ui.grey.menu .active.item,.ui.menu .grey.active.item{border-color:#767676!important;color:#767676!important}.ui.inverted.menu{border:0 solid transparent;background:#1b1c1d;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.menu .item,.ui.inverted.menu .item>a:not(.ui){background:0 0;color:rgba(255,255,255,.9)}.ui.inverted.menu .item.menu{background:0 0}.ui.inverted.menu .item:before{background:rgba(255,255,255,.08)}.ui.vertical.inverted.menu .item:before{background:rgba(255,255,255,.08)}.ui.vertical.inverted.menu .menu .item,.ui.vertical.inverted.menu .menu .item a:not(.ui){color:rgba(255,255,255,.5)}.ui.inverted.menu .header.item{margin:0;background:0 0;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.menu .item.disabled,.ui.inverted.menu .item.disabled:hover{color:rgba(225,225,225,.3)}.ui.inverted.menu .dropdown.item:hover,.ui.inverted.menu .link.item:hover,.ui.inverted.menu a.item:hover,.ui.link.inverted.menu .item:hover{background:rgba(255,255,255,.08);color:#fff}.ui.vertical.inverted.menu .item .menu .link.item:hover,.ui.vertical.inverted.menu .item .menu a.item:hover{background:0 0;color:#fff}.ui.inverted.menu .link.item:active,.ui.inverted.menu a.item:active{background:rgba(255,255,255,.08);color:#fff}.ui.inverted.menu .active.item{background:rgba(255,255,255,.15);color:#fff!important}.ui.inverted.vertical.menu .item .menu .active.item{background:0 0;color:#fff}.ui.inverted.pointing.menu .active.item:after{background:#3d3e3f!important;margin:0!important;-webkit-box-shadow:none!important;box-shadow:none!important;border:none!important}.ui.inverted.menu .active.item:hover{background:rgba(255,255,255,.15);color:#fff!important}.ui.inverted.pointing.menu .active.item:hover:after{background:#3d3e3f!important}.ui.floated.menu{float:left;margin:0 .5rem 0 0}.ui.floated.menu .item:last-child:before{display:none}.ui.right.floated.menu{float:right;margin:0 0 0 .5rem}.ui.inverted.menu .red.active.item,.ui.inverted.red.menu{background-color:#db2828}.ui.inverted.red.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.red.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .orange.active.item,.ui.inverted.orange.menu{background-color:#f2711c}.ui.inverted.orange.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.orange.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .yellow.active.item,.ui.inverted.yellow.menu{background-color:#fbbd08}.ui.inverted.yellow.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.yellow.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .olive.active.item,.ui.inverted.olive.menu{background-color:#b5cc18}.ui.inverted.olive.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.olive.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.green.menu,.ui.inverted.menu .green.active.item{background-color:#21ba45}.ui.inverted.green.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.green.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .teal.active.item,.ui.inverted.teal.menu{background-color:#00b5ad}.ui.inverted.teal.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.teal.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.blue.menu,.ui.inverted.menu .blue.active.item{background-color:#2185d0}.ui.inverted.blue.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.blue.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .violet.active.item,.ui.inverted.violet.menu{background-color:#6435c9}.ui.inverted.violet.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.violet.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .purple.active.item,.ui.inverted.purple.menu{background-color:#a333c8}.ui.inverted.purple.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.purple.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .pink.active.item,.ui.inverted.pink.menu{background-color:#e03997}.ui.inverted.pink.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.pink.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.brown.menu,.ui.inverted.menu .brown.active.item{background-color:#a5673f}.ui.inverted.brown.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.brown.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.grey.menu,.ui.inverted.menu .grey.active.item{background-color:#767676}.ui.inverted.grey.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.grey.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.fitted.menu .item,.ui.fitted.menu .item .menu .item,.ui.menu .fitted.item{padding:0}.ui.horizontally.fitted.menu .item,.ui.horizontally.fitted.menu .item .menu .item,.ui.menu .horizontally.fitted.item{padding-top:.92857143em;padding-bottom:.92857143em}.ui.menu .vertically.fitted.item,.ui.vertically.fitted.menu .item,.ui.vertically.fitted.menu .item .menu .item{padding-left:1.14285714em;padding-right:1.14285714em}.ui.borderless.menu .item .menu .item:before,.ui.borderless.menu .item:before,.ui.menu .borderless.item:before{background:0 0!important}.ui.compact.menu{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin:0;vertical-align:middle}.ui.compact.vertical.menu{display:inline-block}.ui.compact.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.compact.menu .item:last-child:before{display:none}.ui.compact.vertical.menu{width:auto!important}.ui.compact.vertical.menu .item:last-child::before{display:block}.ui.menu.fluid,.ui.vertical.menu.fluid{width:100%!important}.ui.item.menu,.ui.item.menu .item{width:100%;padding-left:0!important;padding-right:0!important;margin-left:0!important;margin-right:0!important;text-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.attached.item.menu{margin:0 -1px!important}.ui.item.menu .item:last-child:before{display:none}.ui.menu.two.item .item{width:50%}.ui.menu.three.item .item{width:33.333%}.ui.menu.four.item .item{width:25%}.ui.menu.five.item .item{width:20%}.ui.menu.six.item .item{width:16.666%}.ui.menu.seven.item .item{width:14.285%}.ui.menu.eight.item .item{width:12.5%}.ui.menu.nine.item .item{width:11.11%}.ui.menu.ten.item .item{width:10%}.ui.menu.eleven.item .item{width:9.09%}.ui.menu.twelve.item .item{width:8.333%}.ui.menu.fixed{position:fixed;z-index:101;margin:0;width:100%}.ui.menu.fixed,.ui.menu.fixed .item:first-child,.ui.menu.fixed .item:last-child{border-radius:0!important}.ui.fixed.menu,.ui[class*="top fixed"].menu{top:0;left:0;right:auto;bottom:auto}.ui[class*="top fixed"].menu{border-top:none;border-left:none;border-right:none}.ui[class*="right fixed"].menu{border-top:none;border-bottom:none;border-right:none;top:0;right:0;left:auto;bottom:auto;width:auto;height:100%}.ui[class*="bottom fixed"].menu{border-bottom:none;border-left:none;border-right:none;bottom:0;left:0;top:auto;right:auto}.ui[class*="left fixed"].menu{border-top:none;border-bottom:none;border-left:none;top:0;left:0;right:auto;bottom:auto;width:auto;height:100%}.ui.fixed.menu+.ui.grid{padding-top:2.75rem}.ui.pointing.menu .item:after{visibility:hidden;position:absolute;content:'';top:100%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);background:0 0;margin:.5px 0 0;width:.57142857em;height:.57142857em;border:none;border-bottom:1px solid #d4d4d5;border-right:1px solid #d4d4d5;z-index:2;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.vertical.pointing.menu .item:after{position:absolute;top:50%;right:0;bottom:auto;left:auto;-webkit-transform:translateX(50%) translateY(-50%) rotate(45deg);transform:translateX(50%) translateY(-50%) rotate(45deg);margin:0 -.5px 0 0;border:none;border-top:1px solid #d4d4d5;border-right:1px solid #d4d4d5}.ui.pointing.menu .active.item:after{visibility:visible}.ui.pointing.menu .active.dropdown.item:after{visibility:hidden}.ui.pointing.menu .active.item .menu .active.item:after,.ui.pointing.menu .dropdown.active.item:after{display:none}.ui.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.pointing.menu .active.item:after{background-color:#f2f2f2}.ui.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .active.item:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .menu .active.item:after{background-color:#fff}.ui.attached.menu{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% - (-1px * 2));max-width:calc(100% - (-1px * 2));-webkit-box-shadow:none;box-shadow:none}.ui.attached+.ui.attached.menu:not(.top){border-top:none}.ui[class*="top attached"].menu{bottom:0;margin-bottom:0;top:0;margin-top:1rem;border-radius:.28571429rem .28571429rem 0 0}.ui.menu[class*="top attached"]:first-child{margin-top:0}.ui[class*="bottom attached"].menu{bottom:0;margin-top:0;top:0;margin-bottom:1rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui[class*="bottom attached"].menu:last-child{margin-bottom:0}.ui.top.attached.menu>.item:first-child{border-radius:.28571429rem 0 0 0}.ui.bottom.attached.menu>.item:first-child{border-radius:0 0 0 .28571429rem}.ui.attached.menu:not(.tabular){border:1px solid #d4d4d5}.ui.attached.inverted.menu{border:none}.ui.attached.tabular.menu{margin-left:0;margin-right:0;width:100%}.ui.mini.menu{font-size:.78571429rem}.ui.mini.vertical.menu{width:9rem}.ui.tiny.menu{font-size:.85714286rem}.ui.tiny.vertical.menu{width:11rem}.ui.small.menu{font-size:.92857143rem}.ui.small.vertical.menu{width:13rem}.ui.menu{font-size:1rem}.ui.vertical.menu{width:15rem}.ui.large.menu{font-size:1.07142857rem}.ui.large.vertical.menu{width:18rem}.ui.huge.menu{font-size:1.21428571rem}.ui.huge.vertical.menu{width:22rem}.ui.big.menu{font-size:1.14285714rem}.ui.big.vertical.menu{width:20rem}.ui.massive.menu{font-size:1.28571429rem}.ui.massive.vertical.menu{width:25rem}
_static/sphinx_tabs/semantic-ui-2.4.1/segment.min.cssnew file+9
@@ -0,0 +1,9 @@
1+/*!
2+ * # Semantic UI 2.4.1 - Segment
3+ * http://github.com/semantic-org/semantic-ui/
4+ *
5+ *
6+ * Released under the MIT license
7+ * http://opensource.org/licenses/MIT
8+ *
9+ */.ui.segment{position:relative;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);margin:1rem 0;padding:1em 1em;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.segment:first-child{margin-top:0}.ui.segment:last-child{margin-bottom:0}.ui.vertical.segment{margin:0;padding-left:0;padding-right:0;background:none transparent;border-radius:0;-webkit-box-shadow:none;box-shadow:none;border:none;border-bottom:1px solid rgba(34,36,38,.15)}.ui.vertical.segment:last-child{border-bottom:none}.ui.inverted.segment>.ui.header{color:#fff}.ui[class*="bottom attached"].segment>[class*="top attached"].label{border-top-left-radius:0;border-top-right-radius:0}.ui[class*="top attached"].segment>[class*="bottom attached"].label{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.attached.segment:not(.top):not(.bottom)>[class*="top attached"].label{border-top-left-radius:0;border-top-right-radius:0}.ui.attached.segment:not(.top):not(.bottom)>[class*="bottom attached"].label{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.grid>.row>.ui.segment.column,.ui.grid>.ui.segment.column,.ui.page.grid.segment{padding-top:2em;padding-bottom:2em}.ui.grid.segment{margin:1rem 0;border-radius:.28571429rem}.ui.basic.table.segment{background:#fff;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.ui[class*="very basic"].table.segment{padding:1em 1em}.ui.placeholder.segment{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;max-width:initial;-webkit-animation:none;animation:none;overflow:visible;padding:1em 1em;min-height:18rem;background:#f9fafb;border-color:rgba(34,36,38,.15);-webkit-box-shadow:0 2px 25px 0 rgba(34,36,38,.05) inset;box-shadow:0 2px 25px 0 rgba(34,36,38,.05) inset}.ui.placeholder.segment .button,.ui.placeholder.segment textarea{display:block}.ui.placeholder.segment .button,.ui.placeholder.segment .field,.ui.placeholder.segment textarea,.ui.placeholder.segment>.ui.input{max-width:15rem;margin-left:auto;margin-right:auto}.ui.placeholder.segment .column .button,.ui.placeholder.segment .column .field,.ui.placeholder.segment .column textarea,.ui.placeholder.segment .column>.ui.input{max-width:15rem;margin-left:auto;margin-right:auto}.ui.placeholder.segment>.inline{-ms-flex-item-align:center;align-self:center}.ui.placeholder.segment>.inline>.button{display:inline-block;width:auto;margin:0 .35714286rem 0 0}.ui.placeholder.segment>.inline>.button:last-child{margin-right:0}.ui.piled.segment,.ui.piled.segments{margin:3em 0;-webkit-box-shadow:'';box-shadow:'';z-index:auto}.ui.piled.segment:first-child{margin-top:0}.ui.piled.segment:last-child{margin-bottom:0}.ui.piled.segment:after,.ui.piled.segment:before,.ui.piled.segments:after,.ui.piled.segments:before{background-color:#fff;visibility:visible;content:'';display:block;height:100%;left:0;position:absolute;width:100%;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:'';box-shadow:''}.ui.piled.segment:before,.ui.piled.segments:before{-webkit-transform:rotate(-1.2deg);transform:rotate(-1.2deg);top:0;z-index:-2}.ui.piled.segment:after,.ui.piled.segments:after{-webkit-transform:rotate(1.2deg);transform:rotate(1.2deg);top:0;z-index:-1}.ui[class*="top attached"].piled.segment{margin-top:3em;margin-bottom:0}.ui.piled.segment[class*="top attached"]:first-child{margin-top:0}.ui.piled.segment[class*="bottom attached"]{margin-top:0;margin-bottom:3em}.ui.piled.segment[class*="bottom attached"]:last-child{margin-bottom:0}.ui.stacked.segment{padding-bottom:1.4em}.ui.stacked.segment:after,.ui.stacked.segment:before,.ui.stacked.segments:after,.ui.stacked.segments:before{content:'';position:absolute;bottom:-3px;left:0;border-top:1px solid rgba(34,36,38,.15);background:rgba(0,0,0,.03);width:100%;height:6px;visibility:visible}.ui.stacked.segment:before,.ui.stacked.segments:before{display:none}.ui.tall.stacked.segment:before,.ui.tall.stacked.segments:before{display:block;bottom:0}.ui.stacked.inverted.segment:after,.ui.stacked.inverted.segment:before,.ui.stacked.inverted.segments:after,.ui.stacked.inverted.segments:before{background-color:rgba(0,0,0,.03);border-top:1px solid rgba(34,36,38,.35)}.ui.padded.segment{padding:1.5em}.ui[class*="very padded"].segment{padding:3em}.ui.padded.segment.vertical.segment,.ui[class*="very padded"].vertical.segment{padding-left:0;padding-right:0}.ui.compact.segment{display:table}.ui.compact.segments{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.ui.compact.segments .segment,.ui.segments .compact.segment{display:block;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.ui.circular.segment{display:table-cell;padding:2em;text-align:center;vertical-align:middle;border-radius:500em}.ui.raised.segment,.ui.raised.segments{-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.segments{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;position:relative;margin:1rem 0;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);border-radius:.28571429rem}.ui.segments:first-child{margin-top:0}.ui.segments:last-child{margin-bottom:0}.ui.segments>.segment{top:0;bottom:0;border-radius:0;margin:0;width:auto;-webkit-box-shadow:none;box-shadow:none;border:none;border-top:1px solid rgba(34,36,38,.15)}.ui.segments:not(.horizontal)>.segment:first-child{border-top:none;margin-top:0;bottom:0;margin-bottom:0;top:0;border-radius:.28571429rem .28571429rem 0 0}.ui.segments:not(.horizontal)>.segment:last-child{top:0;bottom:0;margin-top:0;margin-bottom:0;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui.segments:not(.horizontal)>.segment:only-child{border-radius:.28571429rem}.ui.segments>.ui.segments{border-top:1px solid rgba(34,36,38,.15);margin:1rem 1rem}.ui.segments>.segments:first-child{border-top:none}.ui.segments>.segment+.segments:not(.horizontal){margin-top:0}.ui.horizontal.segments{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;background-color:transparent;border-radius:0;padding:0;background-color:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);margin:1rem 0;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.segments>.horizontal.segments{margin:0;background-color:transparent;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none;border-top:1px solid rgba(34,36,38,.15)}.ui.horizontal.segments>.segment{-webkit-box-flex:1;flex:1 1 auto;-ms-flex:1 1 0px;margin:0;min-width:0;background-color:transparent;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none;border-left:1px solid rgba(34,36,38,.15)}.ui.segments>.horizontal.segments:first-child{border-top:none}.ui.horizontal.segments>.segment:first-child{border-left:none}.ui.disabled.segment{opacity:.45;color:rgba(40,40,40,.3)}.ui.loading.segment{position:relative;cursor:default;pointer-events:none;text-shadow:none!important;color:transparent!important;-webkit-transition:all 0s linear;transition:all 0s linear}.ui.loading.segment:before{position:absolute;content:'';top:0;left:0;background:rgba(255,255,255,.8);width:100%;height:100%;border-radius:.28571429rem;z-index:100}.ui.loading.segment:after{position:absolute;content:'';top:50%;left:50%;margin:-1.5em 0 0 -1.5em;width:3em;height:3em;-webkit-animation:segment-spin .6s linear;animation:segment-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.1);border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent;visibility:visible;z-index:101}@-webkit-keyframes segment-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes segment-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui.basic.segment{background:none transparent;-webkit-box-shadow:none;box-shadow:none;border:none;border-radius:0}.ui.clearing.segment:after{content:".";display:block;height:0;clear:both;visibility:hidden}.ui.red.segment:not(.inverted){border-top:2px solid #db2828!important}.ui.inverted.red.segment{background-color:#db2828!important;color:#fff!important}.ui.orange.segment:not(.inverted){border-top:2px solid #f2711c!important}.ui.inverted.orange.segment{background-color:#f2711c!important;color:#fff!important}.ui.yellow.segment:not(.inverted){border-top:2px solid #fbbd08!important}.ui.inverted.yellow.segment{background-color:#fbbd08!important;color:#fff!important}.ui.olive.segment:not(.inverted){border-top:2px solid #b5cc18!important}.ui.inverted.olive.segment{background-color:#b5cc18!important;color:#fff!important}.ui.green.segment:not(.inverted){border-top:2px solid #21ba45!important}.ui.inverted.green.segment{background-color:#21ba45!important;color:#fff!important}.ui.teal.segment:not(.inverted){border-top:2px solid #00b5ad!important}.ui.inverted.teal.segment{background-color:#00b5ad!important;color:#fff!important}.ui.blue.segment:not(.inverted){border-top:2px solid #2185d0!important}.ui.inverted.blue.segment{background-color:#2185d0!important;color:#fff!important}.ui.violet.segment:not(.inverted){border-top:2px solid #6435c9!important}.ui.inverted.violet.segment{background-color:#6435c9!important;color:#fff!important}.ui.purple.segment:not(.inverted){border-top:2px solid #a333c8!important}.ui.inverted.purple.segment{background-color:#a333c8!important;color:#fff!important}.ui.pink.segment:not(.inverted){border-top:2px solid #e03997!important}.ui.inverted.pink.segment{background-color:#e03997!important;color:#fff!important}.ui.brown.segment:not(.inverted){border-top:2px solid #a5673f!important}.ui.inverted.brown.segment{background-color:#a5673f!important;color:#fff!important}.ui.grey.segment:not(.inverted){border-top:2px solid #767676!important}.ui.inverted.grey.segment{background-color:#767676!important;color:#fff!important}.ui.black.segment:not(.inverted){border-top:2px solid #1b1c1d!important}.ui.inverted.black.segment{background-color:#1b1c1d!important;color:#fff!important}.ui[class*="left aligned"].segment{text-align:left}.ui[class*="right aligned"].segment{text-align:right}.ui[class*="center aligned"].segment{text-align:center}.ui.floated.segment,.ui[class*="left floated"].segment{float:left;margin-right:1em}.ui[class*="right floated"].segment{float:right;margin-left:1em}.ui.inverted.segment{border:none;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.segment,.ui.primary.inverted.segment{background:#1b1c1d;color:rgba(255,255,255,.9)}.ui.inverted.segment .segment{color:rgba(0,0,0,.87)}.ui.inverted.segment .inverted.segment{color:rgba(255,255,255,.9)}.ui.inverted.attached.segment{border-color:#555}.ui.secondary.segment{background:#f3f4f5;color:rgba(0,0,0,.6)}.ui.secondary.inverted.segment{background:#4c4f52 -webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,.2)),to(rgba(255,255,255,.2)));background:#4c4f52 -webkit-linear-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.2) 100%);background:#4c4f52 linear-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.2) 100%);color:rgba(255,255,255,.8)}.ui.tertiary.segment{background:#dcddde;color:rgba(0,0,0,.6)}.ui.tertiary.inverted.segment{background:#717579 -webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,.35)),to(rgba(255,255,255,.35)));background:#717579 -webkit-linear-gradient(rgba(255,255,255,.35) 0,rgba(255,255,255,.35) 100%);background:#717579 linear-gradient(rgba(255,255,255,.35) 0,rgba(255,255,255,.35) 100%);color:rgba(255,255,255,.8)}.ui.attached.segment{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% - (-1px * 2));max-width:calc(100% - (-1px * 2));-webkit-box-shadow:none;box-shadow:none;border:1px solid #d4d4d5}.ui.attached:not(.message)+.ui.attached.segment:not(.top){border-top:none}.ui[class*="top attached"].segment{bottom:0;margin-bottom:0;top:0;margin-top:1rem;border-radius:.28571429rem .28571429rem 0 0}.ui.segment[class*="top attached"]:first-child{margin-top:0}.ui.segment[class*="bottom attached"]{bottom:0;margin-top:0;top:0;margin-bottom:1rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui.segment[class*="bottom attached"]:last-child{margin-bottom:0}.ui.mini.segment,.ui.mini.segments .segment{font-size:.78571429rem}.ui.tiny.segment,.ui.tiny.segments .segment{font-size:.85714286rem}.ui.small.segment,.ui.small.segments .segment{font-size:.92857143rem}.ui.segment,.ui.segments .segment{font-size:1rem}.ui.large.segment,.ui.large.segments .segment{font-size:1.14285714rem}.ui.big.segment,.ui.big.segments .segment{font-size:1.28571429rem}.ui.huge.segment,.ui.huge.segments .segment{font-size:1.42857143rem}.ui.massive.segment,.ui.massive.segments .segment{font-size:1.71428571rem}
_static/sphinx_tabs/semantic-ui-2.4.1/tab.min.cssnew file+9
@@ -0,0 +1,9 @@
1+/*!
2+ * # Semantic UI 2.4.0 - Tab
3+ * http://github.com/semantic-org/semantic-ui/
4+ *
5+ *
6+ * Released under the MIT license
7+ * http://opensource.org/licenses/MIT
8+ *
9+ */.ui.tab{display:none}.ui.tab.active,.ui.tab.open{display:block}.ui.tab.loading{position:relative;overflow:hidden;display:block;min-height:250px}.ui.tab.loading *{position:relative!important;left:-10000px!important}.ui.tab.loading.segment:before,.ui.tab.loading:before{position:absolute;content:'';top:100px;left:50%;margin:-1.25em 0 0 -1.25em;width:2.5em;height:2.5em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.tab.loading.segment:after,.ui.tab.loading:after{position:absolute;content:'';top:100px;left:50%;margin:-1.25em 0 0 -1.25em;width:2.5em;height:2.5em;-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}
_static/sphinx_tabs/semantic-ui-2.4.1/tab.min.jsnew file+1
@@ -0,0 +1 @@
1+!function(E,O,w,k){"use strict";O=void 0!==O&&O.Math==Math?O:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),E.fn.tab=function(r){var l,d=E.isFunction(this)?E(O):E(this),u=d.selector||"",b=(new Date).getTime(),g=[],f=r,F="string"==typeof f,S=[].slice.call(arguments,1),j=!1;return d.each(function(){var h,o,p,m,v,y,T=E.isPlainObject(r)?E.extend(!0,{},E.fn.tab.settings,r):E.extend({},E.fn.tab.settings),L=T.className,x=T.metadata,t=T.selector,A=T.error,e="."+T.namespace,a="module-"+T.namespace,P=E(this),n={},C=!0,i=0,s=this,c=P.data(a);v={initialize:function(){v.debug("Initializing tab menu item",P),v.fix.callbacks(),v.determineTabs(),v.debug("Determining tabs",T.context,o),T.auto&&v.set.auto(),v.bind.events(),T.history&&!j&&(v.initializeHistory(),j=!0),v.instantiate()},instantiate:function(){v.verbose("Storing instance of module",v),c=v,P.data(a,v)},destroy:function(){v.debug("Destroying tabs",P),P.removeData(a).off(e)},bind:{events:function(){E.isWindow(s)||(v.debug("Attaching tab activation events to element",P),P.on("click"+e,v.event.click))}},determineTabs:function(){var e;"parent"===T.context?(0<P.closest(t.ui).length?(e=P.closest(t.ui),v.verbose("Using closest UI element as parent",e)):e=P,h=e.parent(),v.verbose("Determined parent element for creating context",h)):T.context?(h=E(T.context),v.verbose("Using selector for tab context",T.context,h)):h=E("body"),T.childrenOnly?(o=h.children(t.tabs),v.debug("Searching tab context children for tabs",h,o)):(o=h.find(t.tabs),v.debug("Searching tab context for tabs",h,o))},fix:{callbacks:function(){E.isPlainObject(r)&&(r.onTabLoad||r.onTabInit)&&(r.onTabLoad&&(r.onLoad=r.onTabLoad,delete r.onTabLoad,v.error(A.legacyLoad,r.onLoad)),r.onTabInit&&(r.onFirstLoad=r.onTabInit,delete r.onTabInit,v.error(A.legacyInit,r.onFirstLoad)),T=E.extend(!0,{},E.fn.tab.settings,r))}},initializeHistory:function(){if(v.debug("Initializing page state"),E.address===k)return v.error(A.state),!1;if("state"==T.historyType){if(v.debug("Using HTML5 to manage state"),!1===T.path)return v.error(A.path),!1;E.address.history(!0).state(T.path)}E.address.bind("change",v.event.history.change)},event:{click:function(e){var t=E(this).data(x.tab);t!==k?(T.history?(v.verbose("Updating page state",e),E.address.value(t)):(v.verbose("Changing tab",e),v.changeTab(t)),e.preventDefault()):v.debug("No tab specified")},history:{change:function(e){var t=e.pathNames.join("/")||v.get.initialPath(),a=T.templates.determineTitle(t)||!1;v.performance.display(),v.debug("History change event",t,e),y=e,t!==k&&v.changeTab(t),a&&E.address.title(a)}}},refresh:function(){p&&(v.debug("Refreshing tab",p),v.changeTab(p))},cache:{read:function(e){return e!==k&&n[e]},add:function(e,t){e=e||p,v.debug("Adding cached content for",e),n[e]=t},remove:function(e){e=e||p,v.debug("Removing cached content for",e),delete n[e]}},set:{auto:function(){var e="string"==typeof T.path?T.path.replace(/\/$/,"")+"/{$tab}":"/{$tab}";v.verbose("Setting up automatic tab retrieval from server",e),E.isPlainObject(T.apiSettings)?T.apiSettings.url=e:T.apiSettings={url:e}},loading:function(e){var t=v.get.tabElement(e);t.hasClass(L.loading)||(v.verbose("Setting loading state for",t),t.addClass(L.loading).siblings(o).removeClass(L.active+" "+L.loading),0<t.length&&T.onRequest.call(t[0],e))},state:function(e){E.address.value(e)}},changeTab:function(u){var b=O.history&&O.history.pushState&&T.ignoreFirstLoad&&C,g=T.auto||E.isPlainObject(T.apiSettings),f=g&&!b?v.utilities.pathToArray(u):v.get.defaultPathArray(u);u=v.utilities.arrayToPath(f),E.each(f,function(e,t){var a,n,i,o,r=f.slice(0,e+1),s=v.utilities.arrayToPath(r),c=v.is.tab(s),l=e+1==f.length,d=v.get.tabElement(s);if(v.verbose("Looking for tab",t),c){if(v.verbose("Tab was found",t),p=s,m=v.utilities.filterArray(f,r),l?o=!0:(n=f.slice(0,e+2),i=v.utilities.arrayToPath(n),(o=!v.is.tab(i))&&v.verbose("Tab parameters found",n)),o&&g)return b?(v.debug("Ignoring remote content on first tab load",s),C=!1,v.cache.add(u,d.html()),v.activate.all(s),T.onFirstLoad.call(d[0],s,m,y),T.onLoad.call(d[0],s,m,y)):(v.activate.navigation(s),v.fetch.content(s,u)),!1;v.debug("Opened local tab",s),v.activate.all(s),v.cache.read(s)||(v.cache.add(s,!0),v.debug("First time tab loaded calling tab init"),T.onFirstLoad.call(d[0],s,m,y)),T.onLoad.call(d[0],s,m,y)}else{if(-1!=u.search("/")||""===u)return v.error(A.missingTab,P,h,s),!1;if(s=(a=E("#"+u+', a[name="'+u+'"]')).closest("[data-tab]").data(x.tab),d=v.get.tabElement(s),a&&0<a.length&&s)return v.debug("Anchor link used, opening parent tab",d,a),d.hasClass(L.active)||setTimeout(function(){v.scrollTo(a)},0),v.activate.all(s),v.cache.read(s)||(v.cache.add(s,!0),v.debug("First time tab loaded calling tab init"),T.onFirstLoad.call(d[0],s,m,y)),T.onLoad.call(d[0],s,m,y),!1}})},scrollTo:function(e){var t=!!(e&&0<e.length)&&e.offset().top;!1!==t&&(v.debug("Forcing scroll to an in-page link in a hidden tab",t,e),E(w).scrollTop(t))},update:{content:function(e,t,a){var n=v.get.tabElement(e),i=n[0];a=a!==k?a:T.evaluateScripts,"string"==typeof T.cacheType&&"dom"==T.cacheType.toLowerCase()&&"string"!=typeof t?n.empty().append(E(t).clone(!0)):a?(v.debug("Updating HTML and evaluating inline scripts",e,t),n.html(t)):(v.debug("Updating HTML",e,t),i.innerHTML=t)}},fetch:{content:function(t,a){var e,n,i=v.get.tabElement(t),o={dataType:"html",encodeParameters:!1,on:"now",cache:T.alwaysRefresh,headers:{"X-Remote":!0},onSuccess:function(e){"response"==T.cacheType&&v.cache.add(a,e),v.update.content(t,e),t==p?(v.debug("Content loaded",t),v.activate.tab(t)):v.debug("Content loaded in background",t),T.onFirstLoad.call(i[0],t,m,y),T.onLoad.call(i[0],t,m,y),T.loadOnce?v.cache.add(a,!0):"string"==typeof T.cacheType&&"dom"==T.cacheType.toLowerCase()&&0<i.children().length?setTimeout(function(){var e=i.children().clone(!0);e=e.not("script"),v.cache.add(a,e)},0):v.cache.add(a,i.html())},urlData:{tab:a}},r=i.api("get request")||!1,s=r&&"pending"===r.state();a=a||t,n=v.cache.read(a),T.cache&&n?(v.activate.tab(t),v.debug("Adding cached content",a),T.loadOnce||("once"==T.evaluateScripts?v.update.content(t,n,!1):v.update.content(t,n)),T.onLoad.call(i[0],t,m,y)):s?(v.set.loading(t),v.debug("Content is already loading",a)):E.api!==k?(e=E.extend(!0,{},T.apiSettings,o),v.debug("Retrieving remote content",a,e),v.set.loading(t),i.api(e)):v.error(A.api)}},activate:{all:function(e){v.activate.tab(e),v.activate.navigation(e)},tab:function(e){var t=v.get.tabElement(e),a="siblings"==T.deactivate?t.siblings(o):o.not(t),n=t.hasClass(L.active);v.verbose("Showing tab content for",t),n||(t.addClass(L.active),a.removeClass(L.active+" "+L.loading),0<t.length&&T.onVisible.call(t[0],e))},navigation:function(e){var t=v.get.navElement(e),a="siblings"==T.deactivate?t.siblings(d):d.not(t),n=t.hasClass(L.active);v.verbose("Activating tab navigation for",t,e),n||(t.addClass(L.active),a.removeClass(L.active+" "+L.loading))}},deactivate:{all:function(){v.deactivate.navigation(),v.deactivate.tabs()},navigation:function(){d.removeClass(L.active)},tabs:function(){o.removeClass(L.active+" "+L.loading)}},is:{tab:function(e){return e!==k&&0<v.get.tabElement(e).length}},get:{initialPath:function(){return d.eq(0).data(x.tab)||o.eq(0).data(x.tab)},path:function(){return E.address.value()},defaultPathArray:function(e){return v.utilities.pathToArray(v.get.defaultPath(e))},defaultPath:function(e){var t=d.filter("[data-"+x.tab+'^="'+e+'/"]').eq(0).data(x.tab)||!1;if(t){if(v.debug("Found default tab",t),i<T.maxDepth)return i++,v.get.defaultPath(t);v.error(A.recursion)}else v.debug("No default tabs found for",e,o);return i=0,e},navElement:function(e){return e=e||p,d.filter("[data-"+x.tab+'="'+e+'"]')},tabElement:function(e){var t,a,n,i;return e=e||p,n=v.utilities.pathToArray(e),i=v.utilities.last(n),t=o.filter("[data-"+x.tab+'="'+e+'"]'),a=o.filter("[data-"+x.tab+'="'+i+'"]'),0<t.length?t:a},tab:function(){return p}},utilities:{filterArray:function(e,t){return E.grep(e,function(e){return-1==E.inArray(e,t)})},last:function(e){return!!E.isArray(e)&&e[e.length-1]},pathToArray:function(e){return e===k&&(e=p),"string"==typeof e?e.split("/"):[e]},arrayToPath:function(e){return!!E.isArray(e)&&e.join("/")}},setting:function(e,t){if(v.debug("Changing setting",e,t),E.isPlainObject(e))E.extend(!0,T,e);else{if(t===k)return T[e];E.isPlainObject(T[e])?E.extend(!0,T[e],t):T[e]=t}},internal:function(e,t){if(E.isPlainObject(e))E.extend(!0,v,e);else{if(t===k)return v[e];v[e]=t}},debug:function(){!T.silent&&T.debug&&(T.performance?v.performance.log(arguments):(v.debug=Function.prototype.bind.call(console.info,console,T.name+":"),v.debug.apply(console,arguments)))},verbose:function(){!T.silent&&T.verbose&&T.debug&&(T.performance?v.performance.log(arguments):(v.verbose=Function.prototype.bind.call(console.info,console,T.name+":"),v.verbose.apply(console,arguments)))},error:function(){T.silent||(v.error=Function.prototype.bind.call(console.error,console,T.name+":"),v.error.apply(console,arguments))},performance:{log:function(e){var t,a;T.performance&&(a=(t=(new Date).getTime())-(b||t),b=t,g.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:s,"Execution Time":a})),clearTimeout(v.performance.timer),v.performance.timer=setTimeout(v.performance.display,500)},display:function(){var e=T.name+":",a=0;b=!1,clearTimeout(v.performance.timer),E.each(g,function(e,t){a+=t["Execution Time"]}),e+=" "+a+"ms",u&&(e+=" '"+u+"'"),(console.group!==k||console.table!==k)&&0<g.length&&(console.groupCollapsed(e),console.table?console.table(g):E.each(g,function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")}),console.groupEnd()),g=[]}},invoke:function(n,e,t){var i,o,a,r=c;return e=e||S,t=s||t,"string"==typeof n&&r!==k&&(n=n.split(/[\. ]/),i=n.length-1,E.each(n,function(e,t){var a=e!=i?t+n[e+1].charAt(0).toUpperCase()+n[e+1].slice(1):n;if(E.isPlainObject(r[a])&&e!=i)r=r[a];else{if(r[a]!==k)return o=r[a],!1;if(!E.isPlainObject(r[t])||e==i)return r[t]!==k?o=r[t]:v.error(A.method,n),!1;r=r[t]}})),E.isFunction(o)?a=o.apply(t,e):o!==k&&(a=o),E.isArray(l)?l.push(a):l!==k?l=[l,a]:a!==k&&(l=a),o}},F?(c===k&&v.initialize(),v.invoke(f)):(c!==k&&c.invoke("destroy"),v.initialize())}),l!==k?l:this},E.tab=function(){E(O).tab.apply(this,arguments)},E.fn.tab.settings={name:"Tab",namespace:"tab",silent:!1,debug:!1,verbose:!1,performance:!0,auto:!1,history:!1,historyType:"hash",path:!1,context:!1,childrenOnly:!1,maxDepth:25,deactivate:"siblings",alwaysRefresh:!1,cache:!0,loadOnce:!1,cacheType:"response",ignoreFirstLoad:!1,apiSettings:!1,evaluateScripts:"once",onFirstLoad:function(e,t,a){},onLoad:function(e,t,a){},onVisible:function(e,t,a){},onRequest:function(e,t,a){},templates:{determineTitle:function(e){}},error:{api:"You attempted to load content without API module",method:"The method you called is not defined",missingTab:"Activated tab cannot be found. Tabs are case-sensitive.",noContent:"The tab you specified is missing a content url.",path:"History enabled, but no path was specified",recursion:"Max recursive depth reached",legacyInit:"onTabInit has been renamed to onFirstLoad in 2.0, please adjust your code.",legacyLoad:"onTabLoad has been renamed to onLoad in 2.0. Please adjust your code",state:"History requires Asual's Address library <https://github.com/asual/jquery-address>"},metadata:{tab:"tab",loaded:"loaded",promise:"promise"},className:{loading:"loading",active:"active"},selector:{tabs:".ui.tab",ui:".ui"}}}(jQuery,window,document);
_static/sphinx_tabs/tabs.cssnew file+44
@@ -0,0 +1,44 @@
1+.sphinx-tabs {
2+ margin-bottom: 2em;
3+}
4+
5+.sphinx-tabs:last-child {
6+ margin-bottom: 1em;
7+}
8+
9+.sphinx-tabs .sphinx-menu .item p {
10+ margin: 0;
11+}
12+
13+.sphinx-tabs .sphinx-menu a.item {
14+ color: #2980b9 !important;
15+}
16+
17+.sphinx-tabs .sphinx-menu {
18+ border-bottom-color: #a0b3bf !important;
19+ display: flex;
20+ flex-direction: row;
21+ flex-wrap: wrap;
22+}
23+
24+.sphinx-tabs .sphinx-menu a.active.item {
25+ border-color: #a0b3bf !important;
26+}
27+
28+.sphinx-tab {
29+ border-color: #a0b3bf !important;
30+ box-sizing: border-box;
31+}
32+
33+.sphinx-tab.tab.active {
34+ margin-bottom: 0;
35+}
36+
37+/* Code tabs don't need the code-block border */
38+.code-tab.tab {
39+ padding: 0.4em !important;
40+}
41+
42+.code-tab.tab div[class^='highlight'] {
43+ border: none;
44+}
_static/sphinx_tabs/tabs.jsnew file+94
@@ -0,0 +1,94 @@
1+if (!String.prototype.startsWith) {
2+ Object.defineProperty(String.prototype, 'startsWith', {
3+ value: function(search, pos) {
4+ pos = !pos || pos < 0 ? 0 : +pos;
5+ return this.substring(pos, pos + search.length) === search;
6+ }
7+ });
8+}
9+
10+// From http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport
11+function elementIsInView (el) {
12+ if (typeof jQuery === "function" && el instanceof jQuery) {
13+ el = el[0];
14+ }
15+
16+ const rect = el.getBoundingClientRect();
17+
18+ return (
19+ rect.top >= 0 &&
20+ rect.left >= 0 &&
21+ rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
22+ rect.right <= (window.innerWidth || document.documentElement.clientWidth)
23+ );
24+}
25+
26+$(function() {
27+ // Change container tags <div> -> <a>
28+ $('.sphinx-menu.menu .item').each(function() {
29+ var this_ = $(this);
30+ var a_this = $('<a>');
31+
32+ a_this.html(this_.html());
33+ $.each(this_.prop('attributes'), function() {
34+ a_this.attr(this.name, this.value);
35+ });
36+
37+ this_.replaceWith(a_this);
38+ });
39+
40+ // We store the data-tab values as sphinx-data-<data-tab value>
41+ // Add data-tab attribute with the extracted value
42+ $('.sphinx-menu.menu .item, .sphinx-tab.tab').each(function() {
43+ var this_ = $(this);
44+ const prefix = 'sphinx-data-';
45+ const classes = this_.attr('class').split(/\s+/);
46+ $.each(classes, function(idx, clazz) {
47+ if (clazz.startsWith(prefix)) {
48+ this_.attr('data-tab',
49+ clazz.substring(prefix.length));
50+ }
51+ });
52+ });
53+
54+ // Mimic the Semantic UI behaviour
55+ $('.sphinx-menu.menu .item').each(function() {
56+ var this1 = $(this);
57+ var data_tab = this1.attr('data-tab');
58+
59+ this1.on('click', function() {
60+ // Find offset in view
61+ const offset = (this1.offset().top - $(window).scrollTop());
62+
63+ // Enable all tabs with this id
64+
65+ // For each tab group
66+ $('.sphinx-tabs').each(function() {
67+ var this2 = $(this);
68+
69+ // Check if tab group has a tab matching the clicked tab
70+ var has_tab = false;
71+ this2.children().eq(0).children().each(function() {
72+ has_tab |= $(this).attr('data-tab') === data_tab;
73+ });
74+
75+ if (has_tab) {
76+ // Enable just the matching tab
77+ var toggle = function() {
78+ var this3 = $(this);
79+ if (this3.attr('data-tab') === data_tab) {
80+ this3.addClass('active');
81+ } else {
82+ this3.removeClass('active');
83+ }
84+ };
85+ this2.children().eq(0).children('[data-tab]').each(toggle);
86+ this2.children('[data-tab]').each(toggle);
87+ }
88+ });
89+
90+ // Keep tab with the original view offset
91+ $(window).scrollTop(this1.offset().top - offset);
92+ });
93+ });
94+});
_static/underscore-1.3.1.jsnew file+999

This diff is too big to show here.

_static/underscore.jsnew file+31

This diff is too big to show here.

_static/version_warning_offset.jsnew file+40

This diff is too big to show here.

admin/api.htmlnew file+192

This diff is too big to show here.

admin/architecture.htmlnew file+124

This diff is too big to show here.

admin/buildhosts.htmlnew file+364

This diff is too big to show here.

admin/engines.htmlnew file+198

This diff is too big to show here.

admin/filtron.htmlnew file+285

This diff is too big to show here.

admin/index.htmlnew file+167

This diff is too big to show here.

admin/installation-apache.htmlnew file+648

This diff is too big to show here.

admin/installation-docker.htmlnew file+119

This diff is too big to show here.

admin/installation-nginx.htmlnew file+505

This diff is too big to show here.

admin/installation-searx.htmlnew file+358

This diff is too big to show here.

admin/installation-uwsgi.htmlnew file+525

This diff is too big to show here.

admin/installation.htmlnew file+148

This diff is too big to show here.

admin/morty.htmlnew file+128

This diff is too big to show here.

admin/plugins.htmlnew file+186

This diff is too big to show here.

admin/settings.htmlnew file+265

This diff is too big to show here.

admin/update-searx.htmlnew file+134

This diff is too big to show here.

babel.cfgdeleted−3

This diff is too big to show here.

blog/admin.htmlnew file+139

This diff is too big to show here.

blog/index.htmlnew file+131

This diff is too big to show here.

blog/intro-offline.htmlnew file+166

This diff is too big to show here.

blog/private-engines.htmlnew file+149

This diff is too big to show here.

blog/python3.htmlnew file+152

This diff is too big to show here.

dev/contribution_guide.htmlnew file+263

This diff is too big to show here.

dev/engine_overview.htmlnew file+638

This diff is too big to show here.

dev/index.htmlnew file+172

This diff is too big to show here.

dev/makefile.htmlnew file+310

This diff is too big to show here.

dev/plugins.htmlnew file+151

This diff is too big to show here.

dev/quickstart.htmlnew file+210

This diff is too big to show here.

dev/reST.htmlnew file+1597

This diff is too big to show here.

dev/search_api.htmlnew file+200

This diff is too big to show here.

dev/translation.htmlnew file+154

This diff is too big to show here.

dockerfiles/docker-entrypoint.shdeleted−145

This diff is too big to show here.

dockerfiles/uwsgi.inideleted−47

This diff is too big to show here.

docs/_themes/searx/theme.confdeleted−6

This diff is too big to show here.

docs/admin/engines/recoll.rstdeleted−50

This diff is too big to show here.

docs/admin/filtron.rstdeleted−191

This diff is too big to show here.

docs/admin/installation-docker.rstdeleted−60

This diff is too big to show here.

docs/admin/settings.rstdeleted−394

This diff is too big to show here.

docs/admin/update-searx.rstdeleted−59

This diff is too big to show here.

docs/blog/command-line-engines.rstdeleted−65

This diff is too big to show here.

docs/blog/index.rstdeleted−17

This diff is too big to show here.

docs/blog/lxcdev-202006.rstdeleted−413

This diff is too big to show here.

docs/blog/search-database-engines.rstdeleted−95

This diff is too big to show here.

docs/blog/search-indexer-engines.rstdeleted−114

This diff is too big to show here.

docs/blog/sql-engines.rstdeleted−117

This diff is too big to show here.

docs/build-templates/filtron.rstdeleted−52

This diff is too big to show here.

docs/build-templates/morty.rstdeleted−52

This diff is too big to show here.

docs/build-templates/searx.rstdeleted−210

This diff is too big to show here.

docs/conf.pydeleted−131

This diff is too big to show here.

docs/dev/csv_table.txtdeleted−6

This diff is too big to show here.

docs/dev/makefile.rstdeleted−222

This diff is too big to show here.

docs/dev/quickstart.rstdeleted−55

This diff is too big to show here.

docs/searx_extra/index.rstdeleted−14

This diff is too big to show here.

docs/searx_extra/standalone_searx.py.rstdeleted−9

This diff is too big to show here.

examples/basic_engine.pydeleted−25

This diff is too big to show here.

genindex.htmlnew file+129

This diff is too big to show here.

index.htmlnew file+175

This diff is too big to show here.

managedeleted−504

This diff is too big to show here.

objects.invnew file

Binary file not shown.

requirements-dev.txtdeleted−20

This diff is too big to show here.

requirements.txtdeleted−16

This diff is too big to show here.

search.htmlnew file+109

This diff is too big to show here.

searchindex.jsnew file+1

This diff is too big to show here.

searx/__init__.pydeleted−108

This diff is too big to show here.

searx/answerers/__init__.pydeleted−46

This diff is too big to show here.

searx/answerers/random/answerer.pydeleted−67

This diff is too big to show here.

searx/answerers/statistics/answerer.pydeleted−52

This diff is too big to show here.

searx/autocomplete.pydeleted−158

This diff is too big to show here.

searx/data/__init__.pydeleted−50

This diff is too big to show here.

searx/data/ahmia_blacklist.txtdeleted−35730

This diff is too big to show here.

searx/data/currencies.jsondeleted−14691

This diff is too big to show here.

searx/data/engines_languages.jsondeleted−28588

This diff is too big to show here.

searx/data/external_bangs.jsondeleted−19068

This diff is too big to show here.

searx/data/external_urls.jsondeleted−156

This diff is too big to show here.

searx/data/osm_keys_tags.jsondeleted−15416

This diff is too big to show here.

searx/data/useragents.jsondeleted−13

This diff is too big to show here.

searx/data/wikidata_units.jsondeleted−1223

This diff is too big to show here.

searx/engines/1337x.pydeleted−53

This diff is too big to show here.

searx/engines/__init__.pydeleted−308

This diff is too big to show here.

searx/engines/ahmia.pydeleted−85

This diff is too big to show here.

searx/engines/apkmirror.pydeleted−68

This diff is too big to show here.

searx/engines/archlinux.pydeleted−145

This diff is too big to show here.

searx/engines/arxiv.pydeleted−75

This diff is too big to show here.

searx/engines/bandcamp.pydeleted−73

This diff is too big to show here.

searx/engines/base.pydeleted−117

This diff is too big to show here.

searx/engines/bing.pydeleted−124

This diff is too big to show here.

searx/engines/bing_images.pydeleted−106

This diff is too big to show here.

searx/engines/bing_news.pydeleted−131

This diff is too big to show here.

searx/engines/bing_videos.pydeleted−101

This diff is too big to show here.

searx/engines/btdigg.pydeleted−89

This diff is too big to show here.

searx/engines/ccengine.pydeleted−53

This diff is too big to show here.

searx/engines/command.pydeleted−172

This diff is too big to show here.

searx/engines/core.pydeleted−82

This diff is too big to show here.

searx/engines/currency_convert.pydeleted−54

This diff is too big to show here.

searx/engines/dailymotion.pydeleted−98

This diff is too big to show here.

searx/engines/deezer.pydeleted−70

This diff is too big to show here.

searx/engines/deviantart.pydeleted−77

This diff is too big to show here.

searx/engines/dictzone.pydeleted−60

This diff is too big to show here.

searx/engines/digbt.pydeleted−60

This diff is too big to show here.

searx/engines/digg.pydeleted−69

This diff is too big to show here.

searx/engines/doku.pydeleted−87

This diff is too big to show here.

searx/engines/duckduckgo.pydeleted−186

This diff is too big to show here.

searx/engines/duckduckgo_definitions.pydeleted−261

This diff is too big to show here.

searx/engines/duckduckgo_images.pydeleted−94

This diff is too big to show here.

searx/engines/duden.pydeleted−77

This diff is too big to show here.

searx/engines/dummy-offline.pydeleted−20

This diff is too big to show here.

searx/engines/dummy.pydeleted−24

This diff is too big to show here.

searx/engines/ebay.pydeleted−73

This diff is too big to show here.

searx/engines/elasticsearch.pydeleted−144

This diff is too big to show here.

searx/engines/etools.pydeleted−56

This diff is too big to show here.

searx/engines/fdroid.pydeleted−54

This diff is too big to show here.

searx/engines/flickr.pydeleted−92

This diff is too big to show here.

searx/engines/flickr_noapi.pydeleted−127

This diff is too big to show here.

searx/engines/framalibre.pydeleted−72

This diff is too big to show here.

searx/engines/freesound.pydeleted−69

This diff is too big to show here.

searx/engines/frinkiac.pydeleted−51

This diff is too big to show here.

searx/engines/genius.pydeleted−90

This diff is too big to show here.

searx/engines/gentoo.pydeleted−129

This diff is too big to show here.

searx/engines/gigablast.pydeleted−138

This diff is too big to show here.

searx/engines/github.pydeleted−63

This diff is too big to show here.

searx/engines/google.pydeleted−341

This diff is too big to show here.

searx/engines/google_images.pydeleted−209

This diff is too big to show here.

searx/engines/google_news.pydeleted−196

This diff is too big to show here.

searx/engines/google_scholar.pydeleted−156

This diff is too big to show here.

searx/engines/google_videos.pydeleted−201

This diff is too big to show here.

searx/engines/imdb.pydeleted−55

This diff is too big to show here.

searx/engines/ina.pydeleted−85

This diff is too big to show here.

searx/engines/invidious.pydeleted−122

This diff is too big to show here.

searx/engines/json_engine.pydeleted−143

This diff is too big to show here.

searx/engines/kickass.pydeleted−94

This diff is too big to show here.

searx/engines/loc.pydeleted−68

This diff is too big to show here.

searx/engines/mediathekviewweb.pydeleted−68

This diff is too big to show here.

searx/engines/mediawiki.pydeleted−90

This diff is too big to show here.

searx/engines/meilisearch.pydeleted−59

This diff is too big to show here.

searx/engines/microsoft_academic.pydeleted−73

This diff is too big to show here.

searx/engines/mixcloud.pydeleted−64

This diff is too big to show here.

searx/engines/mongodb.pydeleted−61

This diff is too big to show here.

searx/engines/mysql_server.pydeleted−62

This diff is too big to show here.

searx/engines/nyaa.pydeleted−111

This diff is too big to show here.

searx/engines/onesearch.pydeleted−57

This diff is too big to show here.

searx/engines/opensemantic.pydeleted−46

This diff is too big to show here.

searx/engines/openstreetmap.pydeleted−441

This diff is too big to show here.

searx/engines/pdbe.pydeleted−115

This diff is too big to show here.

searx/engines/peertube.pydeleted−96

This diff is too big to show here.

searx/engines/photon.pydeleted−133

This diff is too big to show here.

searx/engines/piratebay.pydeleted−101

This diff is too big to show here.

searx/engines/postgresql.pydeleted−69

This diff is too big to show here.

searx/engines/prowlarr.pydeleted−80

This diff is too big to show here.

searx/engines/pubmed.pydeleted−105

This diff is too big to show here.

searx/engines/qwant.pydeleted−245

This diff is too big to show here.

searx/engines/recoll.pydeleted−111

This diff is too big to show here.

searx/engines/reddit.pydeleted−79

This diff is too big to show here.

searx/engines/redis_server.pydeleted−69

This diff is too big to show here.

searx/engines/rumble.pydeleted−81

This diff is too big to show here.

searx/engines/scanr_structures.pydeleted−79

This diff is too big to show here.

searx/engines/searchcode_code.pydeleted−71

This diff is too big to show here.

searx/engines/searx_engine.pydeleted−59

This diff is too big to show here.

searx/engines/semantic_scholar.pydeleted−42

This diff is too big to show here.

searx/engines/sepiasearch.pydeleted−102

This diff is too big to show here.

searx/engines/seznam.pydeleted−66

This diff is too big to show here.

searx/engines/sjp.pydeleted−92

This diff is too big to show here.

searx/engines/solidtorrents.pydeleted−53

This diff is too big to show here.

searx/engines/solr.pydeleted−74

This diff is too big to show here.

searx/engines/soundcloud.pydeleted−109

This diff is too big to show here.

searx/engines/spotify.pydeleted−80

This diff is too big to show here.

searx/engines/springer.pydeleted−74

This diff is too big to show here.

searx/engines/sqlite.pydeleted−51

This diff is too big to show here.

searx/engines/stackexchange.pydeleted−67

This diff is too big to show here.

searx/engines/startpage.pydeleted−269

This diff is too big to show here.

searx/engines/tineye.pydeleted−86

This diff is too big to show here.

searx/engines/tokyotoshokan.pydeleted−101

This diff is too big to show here.

searx/engines/torrentz.pydeleted−99

This diff is too big to show here.

searx/engines/translated.pydeleted−51

This diff is too big to show here.

searx/engines/unsplash.pydeleted−55

This diff is too big to show here.

searx/engines/vimeo.pydeleted−68

This diff is too big to show here.

searx/engines/wikidata.pydeleted−694

This diff is too big to show here.

searx/engines/wikipedia.pydeleted−111

This diff is too big to show here.

searx/engines/wolframalpha_api.pydeleted−134

This diff is too big to show here.

searx/engines/wolframalpha_noapi.pydeleted−126

This diff is too big to show here.

searx/engines/wordnik.pydeleted−77

This diff is too big to show here.

searx/engines/www1x.pydeleted−57

This diff is too big to show here.

searx/engines/xpath.pydeleted−93

This diff is too big to show here.

searx/engines/xpath_flex.pydeleted−121

This diff is too big to show here.

searx/engines/yacy.pydeleted−114

This diff is too big to show here.

searx/engines/yahoo.pydeleted−162

This diff is too big to show here.

searx/engines/yahoo_news.pydeleted−111

This diff is too big to show here.

searx/engines/yggtorrent.pydeleted−128

This diff is too big to show here.

searx/engines/youtube_api.pydeleted−91

This diff is too big to show here.

searx/engines/youtube_noapi.pydeleted−160

This diff is too big to show here.

searx/exceptions.pydeleted−103

This diff is too big to show here.

searx/external_bang.pydeleted−89

This diff is too big to show here.

searx/external_urls.pydeleted−89

This diff is too big to show here.

searx/languages.pydeleted−71

This diff is too big to show here.

searx/metrology/error_recorder.pydeleted−144

This diff is too big to show here.

searx/network/__init__.pydeleted−188

This diff is too big to show here.

searx/network/client.pydeleted−219

This diff is too big to show here.

searx/network/network.pydeleted−358

This diff is too big to show here.

searx/network/raise_for_httperror.pydeleted−66

This diff is too big to show here.

searx/plugins/__init__.pydeleted−189

This diff is too big to show here.

searx/plugins/ahmia_filter.pydeleted−33

This diff is too big to show here.

searx/plugins/hash_plugin.pydeleted−54

This diff is too big to show here.

searx/plugins/hostname_replace.pydeleted−28

This diff is too big to show here.

searx/plugins/https_rewrite.pydeleted−233

This diff is too big to show here.

searx/plugins/https_rules/00READMEdeleted−17

This diff is too big to show here.

searx/plugins/https_rules/Bing.xmldeleted−56

This diff is too big to show here.

searx/plugins/https_rules/Dailymotion.xmldeleted−69

This diff is too big to show here.

searx/plugins/https_rules/Deviantart.xmldeleted−53

This diff is too big to show here.

searx/plugins/https_rules/DuckDuckGo.xmldeleted−38

This diff is too big to show here.

searx/plugins/https_rules/Flickr.xmldeleted−44

This diff is too big to show here.

searx/plugins/https_rules/Github-Pages.xmldeleted−11

This diff is too big to show here.

searx/plugins/https_rules/Github.xmldeleted−94

This diff is too big to show here.

searx/plugins/https_rules/Google-mismatches.xmldeleted−26

This diff is too big to show here.

searx/plugins/https_rules/Google.org.xmldeleted−14

This diff is too big to show here.

searx/plugins/https_rules/GoogleAPIs.xmldeleted−143

This diff is too big to show here.

searx/plugins/https_rules/GoogleCanada.xmldeleted−6

This diff is too big to show here.

searx/plugins/https_rules/GoogleImages.xmldeleted−65

This diff is too big to show here.

searx/plugins/https_rules/GoogleMainSearch.xmldeleted−78

This diff is too big to show here.

searx/plugins/https_rules/GoogleMaps.xmldeleted−67

This diff is too big to show here.

searx/plugins/https_rules/GoogleMelange.xmldeleted−6

This diff is too big to show here.

searx/plugins/https_rules/GoogleSearch.xmldeleted−135

This diff is too big to show here.

searx/plugins/https_rules/GoogleServices.xmldeleted−345

This diff is too big to show here.

searx/plugins/https_rules/GoogleShopping.xmldeleted−28

This diff is too big to show here.

searx/plugins/https_rules/GoogleSorry.xmldeleted−7

This diff is too big to show here.

searx/plugins/https_rules/GoogleTranslate.xmldeleted−8

This diff is too big to show here.

searx/plugins/https_rules/GoogleVideos.xmldeleted−83

This diff is too big to show here.

searx/plugins/https_rules/GoogleWatchBlog.xmldeleted−17

This diff is too big to show here.

searx/plugins/https_rules/Google_App_Engine.xmldeleted−21

This diff is too big to show here.

searx/plugins/https_rules/Googleplex.com.xmldeleted−16

This diff is too big to show here.

searx/plugins/https_rules/OpenStreetMap.xmldeleted−15

This diff is too big to show here.

searx/plugins/https_rules/Rawgithub.com.xmldeleted−14

This diff is too big to show here.

searx/plugins/https_rules/Soundcloud.xmldeleted−101

This diff is too big to show here.

searx/plugins/https_rules/ThePirateBay.xmldeleted−36

This diff is too big to show here.

searx/plugins/https_rules/Torproject.xmldeleted−18

This diff is too big to show here.

searx/plugins/https_rules/Twitter.xmldeleted−169

This diff is too big to show here.

searx/plugins/https_rules/Vimeo.xmldeleted−75

This diff is too big to show here.

searx/plugins/https_rules/WikiLeaks.xmldeleted−13

This diff is too big to show here.

searx/plugins/https_rules/Wikimedia.xmldeleted−107

This diff is too big to show here.

searx/plugins/https_rules/Yahoo.xmldeleted−2450

This diff is too big to show here.

searx/plugins/https_rules/YouTube.xmldeleted−46

This diff is too big to show here.

searx/plugins/infinite_scroll.pydeleted−9

This diff is too big to show here.

searx/plugins/oa_doi_rewrite.pydeleted−48

This diff is too big to show here.

searx/plugins/search_on_category_select.pydeleted−24

This diff is too big to show here.

searx/plugins/self_info.pydeleted−44

This diff is too big to show here.

searx/plugins/tracker_url_remover.pydeleted−53

This diff is too big to show here.

searx/plugins/vim_hotkeys.pydeleted−11

This diff is too big to show here.

searx/preferences.pydeleted−534

This diff is too big to show here.

searx/query.pydeleted−330

This diff is too big to show here.

searx/results.pydeleted−398

This diff is too big to show here.

searx/search/__init__.pydeleted−216

This diff is too big to show here.

searx/search/checker/__init__.pydeleted−4

This diff is too big to show here.

searx/search/checker/__main__.pydeleted−95

This diff is too big to show here.

searx/search/checker/background.pydeleted−125

This diff is too big to show here.

searx/search/checker/impl.pydeleted−416

This diff is too big to show here.

searx/search/models.pydeleted−71

This diff is too big to show here.

searx/search/processors/__init__.pydeleted−41

This diff is too big to show here.

searx/search/processors/abstract.pydeleted−52

This diff is too big to show here.

searx/search/processors/offline.pydeleted−51

This diff is too big to show here.

searx/search/processors/online.pydeleted−262

This diff is too big to show here.

searx/search/processors/online_currency.pydeleted−69

This diff is too big to show here.

searx/search/processors/online_dictionary.pydeleted−55

This diff is too big to show here.

searx/settings.ymldeleted−1803

This diff is too big to show here.

searx/settings_loader.pydeleted−132

This diff is too big to show here.

searx/settings_robot.ymldeleted−54

This diff is too big to show here.

searx/shared/__init__.pydeleted−31

This diff is too big to show here.

searx/shared/shared_abstract.pydeleted−21

This diff is too big to show here.

searx/shared/shared_simple.pydeleted−39

This diff is too big to show here.

searx/shared/shared_uwsgi.pydeleted−64

This diff is too big to show here.

searx/static/plugins/css/infinite_scroll.cssdeleted−19

This diff is too big to show here.

searx/static/plugins/css/vim_hotkeys.cssdeleted−26

This diff is too big to show here.

searx/static/plugins/external_plugins/.gitignoredeleted−3

This diff is too big to show here.

searx/static/plugins/js/infinite_scroll.jsdeleted−40

This diff is too big to show here.

searx/static/plugins/js/search_on_category_select.jsdeleted−42

This diff is too big to show here.

searx/static/plugins/js/vim_hotkeys.jsdeleted−345

This diff is too big to show here.

searx/static/themes/__common__/js/image_layout.jsdeleted−163

This diff is too big to show here.

searx/static/themes/oscar/.gitignoredeleted−1

This diff is too big to show here.

searx/static/themes/oscar/README.rstdeleted−56

This diff is too big to show here.

searx/static/themes/oscar/css/bootstrap-theme.cssdeleted−587

This diff is too big to show here.

searx/static/themes/oscar/css/bootstrap-theme.min.cssdeleted−6

This diff is too big to show here.

searx/static/themes/oscar/css/bootstrap-theme.min.css.mapdeleted−1

This diff is too big to show here.

searx/static/themes/oscar/css/bootstrap.cssdeleted−6990

This diff is too big to show here.

searx/static/themes/oscar/css/bootstrap.min.cssdeleted−5

This diff is too big to show here.

searx/static/themes/oscar/css/bootstrap.min.css.mapdeleted−1

This diff is too big to show here.

searx/static/themes/oscar/css/images/layers-2x.pngdeleted

Binary file not shown.

searx/static/themes/oscar/css/images/layers.pngdeleted

Binary file not shown.

searx/static/themes/oscar/css/images/marker-icon-2x.pngdeleted

Binary file not shown.

searx/static/themes/oscar/css/images/marker-icon.pngdeleted

Binary file not shown.

searx/static/themes/oscar/css/images/marker-shadow.pngdeleted

Binary file not shown.

searx/static/themes/oscar/css/leaflet.cssdeleted−640

This diff is too big to show here.

searx/static/themes/oscar/css/leaflet.min.cssdeleted−1

This diff is too big to show here.

searx/static/themes/oscar/css/leaflet.min.css.mapdeleted−1

This diff is too big to show here.

searx/static/themes/oscar/css/logicodev-dark.cssdeleted−936

This diff is too big to show here.

searx/static/themes/oscar/css/logicodev-dark.min.cssdeleted−1

This diff is too big to show here.

searx/static/themes/oscar/css/logicodev-dark.min.css.mapdeleted−1

This diff is too big to show here.

searx/static/themes/oscar/css/logicodev.cssdeleted−1145

This diff is too big to show here.

searx/static/themes/oscar/css/logicodev.min.cssdeleted−1

This diff is too big to show here.

searx/static/themes/oscar/css/logicodev.min.css.mapdeleted−1

This diff is too big to show here.

searx/static/themes/oscar/css/pointhi.cssdeleted−693

This diff is too big to show here.

searx/static/themes/oscar/css/pointhi.min.cssdeleted−1

This diff is too big to show here.

searx/static/themes/oscar/css/pointhi.min.css.mapdeleted−1

This diff is too big to show here.

searx/static/themes/oscar/fonts/glyphicons-halflings-regular.eotdeleted

Binary file not shown.

searx/static/themes/oscar/fonts/glyphicons-halflings-regular.svgdeleted−288

This diff is too big to show here.

searx/static/themes/oscar/fonts/glyphicons-halflings-regular.ttfdeleted

Binary file not shown.

searx/static/themes/oscar/fonts/glyphicons-halflings-regular.woffdeleted

Binary file not shown.

searx/static/themes/oscar/fonts/glyphicons-halflings-regular.woff2deleted

Binary file not shown.

searx/static/themes/oscar/gruntfile.jsdeleted−152

This diff is too big to show here.

searx/static/themes/oscar/img/favicon.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/1337x.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/README.mddeleted−2

This diff is too big to show here.

searx/static/themes/oscar/img/icons/amazon.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/bandcamp.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/dailymotion.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/deviantart.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/facebook.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/flickr.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/github.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/invidious.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/kickass.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/openstreetmap.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/photon.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/searchcode code.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/searchcode doc.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/soundcloud.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/stackoverflow.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/twitter.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/vimeo.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/wikipedia.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/icons/youtube.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/loader.gifdeleted

Binary file not shown.

searx/static/themes/oscar/img/logo_searx_a.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/logo_searx_a_n.pngdeleted

Binary file not shown.

searx/static/themes/oscar/img/searx_logo.pngdeleted

Binary file not shown.

searx/static/themes/oscar/js/bootstrap.bundle.min.jsdeleted−7

This diff is too big to show here.

searx/static/themes/oscar/js/bootstrap.min.jsdeleted−6

This diff is too big to show here.

searx/static/themes/oscar/js/jquery.min.jsdeleted−2

This diff is too big to show here.

searx/static/themes/oscar/js/leaflet.jsdeleted−6

This diff is too big to show here.

searx/static/themes/oscar/js/searx.jsdeleted−474

This diff is too big to show here.

searx/static/themes/oscar/js/searx.min.jsdeleted−4

This diff is too big to show here.

searx/static/themes/oscar/js/searx.min.js.mapdeleted−1

This diff is too big to show here.

searx/static/themes/oscar/js/typeahead.bundle.min.jsdeleted−9

This diff is too big to show here.

searx/static/themes/oscar/package.jsondeleted−23

This diff is too big to show here.

searx/static/themes/oscar/src/js/01_init.jsdeleted−34

This diff is too big to show here.

searx/static/themes/oscar/src/js/autocompleter.jsdeleted−60

This diff is too big to show here.

searx/static/themes/oscar/src/js/element_modifiers.jsdeleted−117

This diff is too big to show here.

searx/static/themes/oscar/src/js/infobox.jsdeleted−11

This diff is too big to show here.

searx/static/themes/oscar/src/js/leaflet_map.jsdeleted−79

This diff is too big to show here.

searx/static/themes/oscar/src/js/toggleall.jsdeleted−10

This diff is too big to show here.

searx/static/themes/oscar/src/less/bootstrap/bootstrap.lessdeleted−3

This diff is too big to show here.

searx/static/themes/oscar/src/less/bootstrap/typeahead.lessdeleted−154

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev-dark/oscar.lessdeleted−257

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/advanced.lessdeleted−49

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/checkbox.lessdeleted−9

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/code.lessdeleted−14

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/cursor.lessdeleted−8

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/footer.lessdeleted−30

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/infobox.lessdeleted−92

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/navbar.lessdeleted−30

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/onoff.lessdeleted−74

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/oscar.lessdeleted−23

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/preferences.lessdeleted−31

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/pygments.lessdeleted−99

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/results.lessdeleted−267

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/search.lessdeleted−98

This diff is too big to show here.

searx/static/themes/oscar/src/less/logicodev/variables.lessdeleted−16

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/advanced.lessdeleted−49

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/checkbox.lessdeleted−9

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/code.lessdeleted−2

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/cursor.lessdeleted−8

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/footer.lessdeleted−19

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/infobox.lessdeleted−62

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/navbar.lessdeleted−20

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/onoff.lessdeleted−57

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/oscar.lessdeleted−23

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/preferences.lessdeleted−19

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/pygments.lessdeleted−99

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/results.lessdeleted−113

This diff is too big to show here.

searx/static/themes/oscar/src/less/pointhi/search.lessdeleted−43

This diff is too big to show here.

searx/static/themes/simple/.gitignoredeleted−1

This diff is too big to show here.

searx/static/themes/simple/.jshintignoredeleted−1

This diff is too big to show here.

searx/static/themes/simple/css/searx-rtl.cssdeleted−2261

This diff is too big to show here.

searx/static/themes/simple/css/searx-rtl.min.cssdeleted−1

This diff is too big to show here.

searx/static/themes/simple/css/searx.cssdeleted−2257

This diff is too big to show here.

searx/static/themes/simple/css/searx.min.cssdeleted−1

This diff is too big to show here.

searx/static/themes/simple/fonts/ion.cssdeleted−139

This diff is too big to show here.

searx/static/themes/simple/fonts/ion.eotdeleted

Binary file not shown.

searx/static/themes/simple/fonts/ion.htmldeleted−268

This diff is too big to show here.

searx/static/themes/simple/fonts/ion.svgdeleted−105

This diff is too big to show here.

searx/static/themes/simple/fonts/ion.ttfdeleted

Binary file not shown.

searx/static/themes/simple/fonts/ion.woffdeleted

Binary file not shown.

searx/static/themes/simple/fonts/ion.woff2deleted

Binary file not shown.

searx/static/themes/simple/gruntfile.jsdeleted−161

This diff is too big to show here.

searx/static/themes/simple/img/favicon.pngdeleted

Binary file not shown.

searx/static/themes/simple/img/logo_searx_a.pngdeleted

Binary file not shown.

searx/static/themes/simple/img/searx.pngdeleted

Binary file not shown.

searx/static/themes/simple/img/searx_logo.svgdeleted−203

This diff is too big to show here.

searx/static/themes/simple/js/searx.head.jsdeleted−40

This diff is too big to show here.

searx/static/themes/simple/js/searx.head.min.jsdeleted−4

This diff is too big to show here.

searx/static/themes/simple/js/searx.head.min.js.mapdeleted−1

This diff is too big to show here.

searx/static/themes/simple/js/searx.jsdeleted−1502

This diff is too big to show here.

searx/static/themes/simple/js/searx.min.jsdeleted−26

This diff is too big to show here.

searx/static/themes/simple/js/searx.min.js.mapdeleted−1

This diff is too big to show here.

searx/static/themes/simple/js/searx_head/00_init.jsdeleted−40

This diff is too big to show here.

searx/static/themes/simple/js/searx_src/00_searx_toolkit.jsdeleted−164

This diff is too big to show here.

searx/static/themes/simple/js/searx_src/autocomplete.jsdeleted−536

This diff is too big to show here.

searx/static/themes/simple/js/searx_src/searx_keyboard.jsdeleted−366

This diff is too big to show here.

searx/static/themes/simple/js/searx_src/searx_mapresult.jsdeleted−89

This diff is too big to show here.

searx/static/themes/simple/js/searx_src/searx_results.jsdeleted−63

This diff is too big to show here.

searx/static/themes/simple/js/searx_src/searx_search.jsdeleted−121

This diff is too big to show here.

searx/static/themes/simple/leaflet/images/layers-2x.pngdeleted

Binary file not shown.

searx/static/themes/simple/leaflet/images/layers.pngdeleted

Binary file not shown.

searx/static/themes/simple/leaflet/images/marker-icon-2x-green.pngdeleted

Binary file not shown.

searx/static/themes/simple/leaflet/images/marker-icon-2x-orange.pngdeleted

Binary file not shown.

searx/static/themes/simple/leaflet/images/marker-icon-2x-red.pngdeleted

Binary file not shown.

searx/static/themes/simple/leaflet/images/marker-icon-2x.pngdeleted

Binary file not shown.

searx/static/themes/simple/leaflet/images/marker-icon-green.pngdeleted

Binary file not shown.

searx/static/themes/simple/leaflet/images/marker-icon-orange.pngdeleted

Binary file not shown.

searx/static/themes/simple/leaflet/images/marker-icon-red.pngdeleted

Binary file not shown.

searx/static/themes/simple/leaflet/images/marker-icon.pngdeleted

Binary file not shown.

searx/static/themes/simple/leaflet/images/marker-shadow.pngdeleted

Binary file not shown.

searx/static/themes/simple/leaflet/leaflet.cssdeleted−636

This diff is too big to show here.

searx/static/themes/simple/leaflet/leaflet.jsdeleted−5

This diff is too big to show here.

searx/static/themes/simple/less/autocomplete.lessdeleted−69

This diff is too big to show here.

searx/static/themes/simple/less/code.lessdeleted−8

This diff is too big to show here.

searx/static/themes/simple/less/definitions.lessdeleted−135

This diff is too big to show here.

searx/static/themes/simple/less/index.lessdeleted−43

This diff is too big to show here.

searx/static/themes/simple/less/ion.lessdeleted−181

This diff is too big to show here.

searx/static/themes/simple/less/mixins.lessdeleted−62

This diff is too big to show here.

searx/static/themes/simple/less/normalize.lessdeleted−341

This diff is too big to show here.

searx/static/themes/simple/less/preferences.lessdeleted−120

This diff is too big to show here.

searx/static/themes/simple/less/pygments.lessdeleted−99

This diff is too big to show here.

searx/static/themes/simple/less/search.lessdeleted−264

This diff is too big to show here.

searx/static/themes/simple/less/stats.lessdeleted−8

This diff is too big to show here.

searx/static/themes/simple/less/style-rtl.lessdeleted−6

This diff is too big to show here.

searx/static/themes/simple/less/style.lessdeleted−757

This diff is too big to show here.

searx/static/themes/simple/less/toolkit.lessdeleted−468

This diff is too big to show here.

searx/static/themes/simple/less/toolkit_loader.lessdeleted−41

This diff is too big to show here.

searx/static/themes/simple/magnet.svgdeleted−1

This diff is too big to show here.

searx/static/themes/simple/package.jsondeleted−20

This diff is too big to show here.

searx/templates/__common__/about.htmldeleted−102

This diff is too big to show here.

searx/templates/__common__/opensearch.xmldeleted−22

This diff is too big to show here.

searx/templates/__common__/opensearch_response_rss.xmldeleted−53

This diff is too big to show here.

searx/templates/oscar/404.htmldeleted−9

This diff is too big to show here.

searx/templates/oscar/about.htmldeleted−5

This diff is too big to show here.

searx/templates/oscar/advanced.htmldeleted−17

This diff is too big to show here.

searx/templates/oscar/base.htmldeleted−112

This diff is too big to show here.

searx/templates/oscar/categories.htmldeleted−13

This diff is too big to show here.

searx/templates/oscar/index.htmldeleted−21

This diff is too big to show here.

searx/templates/oscar/infobox.htmldeleted−49

This diff is too big to show here.

searx/templates/oscar/languages.htmldeleted−10

This diff is too big to show here.

searx/templates/oscar/macros.htmldeleted−146

This diff is too big to show here.

searx/templates/oscar/messages/first_time.htmldeleted−8

This diff is too big to show here.

searx/templates/oscar/messages/no_cookies.htmldeleted−5

This diff is too big to show here.

searx/templates/oscar/messages/no_data_available.htmldeleted−5

This diff is too big to show here.

searx/templates/oscar/messages/no_results.htmldeleted−17

This diff is too big to show here.

searx/templates/oscar/messages/save_settings_successfull.htmldeleted−9

This diff is too big to show here.

searx/templates/oscar/messages/unknow_error.htmldeleted−9

This diff is too big to show here.

searx/templates/oscar/navbar.htmldeleted−9

This diff is too big to show here.

searx/templates/oscar/preferences.html−378

This diff is too big to show here.

searx/templates/oscar/result_templates/code.html−18

This diff is too big to show here.

searx/templates/oscar/result_templates/default.html−31

This diff is too big to show here.

searx/templates/oscar/result_templates/files.html−55

This diff is too big to show here.

searx/templates/oscar/result_templates/images.html−36

This diff is too big to show here.

searx/templates/oscar/result_templates/key-value.html−19

This diff is too big to show here.

searx/templates/oscar/result_templates/map.html−76

This diff is too big to show here.

searx/templates/oscar/result_templates/products.html−23

This diff is too big to show here.

searx/templates/oscar/result_templates/torrent.html−25

This diff is too big to show here.

searx/templates/oscar/result_templates/videos.html−29

This diff is too big to show here.

searx/templates/oscar/results.html−187

This diff is too big to show here.

searx/templates/oscar/search.html−25

This diff is too big to show here.

searx/templates/oscar/search_full.html−19

This diff is too big to show here.

searx/templates/oscar/stats.html−33

This diff is too big to show here.

searx/templates/oscar/time-range.html−19

This diff is too big to show here.

searx/templates/simple/404.html−9

This diff is too big to show here.

searx/templates/simple/about.html−4

This diff is too big to show here.

searx/templates/simple/base.html−64

This diff is too big to show here.

searx/templates/simple/categories.html−8

This diff is too big to show here.

searx/templates/simple/index.html−12

This diff is too big to show here.

searx/templates/simple/infobox.html−50

This diff is too big to show here.

searx/templates/simple/languages.html−8

This diff is too big to show here.

searx/templates/simple/macros.html−85

This diff is too big to show here.

searx/templates/simple/messages/no_results.html−17

This diff is too big to show here.

searx/templates/simple/preferences.html−267

This diff is too big to show here.

searx/templates/simple/result_templates/code.html−13

This diff is too big to show here.

searx/templates/simple/result_templates/default.html−17

This diff is too big to show here.

searx/templates/simple/result_templates/images.html−4

This diff is too big to show here.

searx/templates/simple/result_templates/key-value.html−11

This diff is too big to show here.

searx/templates/simple/result_templates/map.html−51

This diff is too big to show here.

searx/templates/simple/result_templates/torrent.html−24

This diff is too big to show here.

searx/templates/simple/result_templates/videos.html−15

This diff is too big to show here.

searx/templates/simple/results.html−179

This diff is too big to show here.

searx/templates/simple/search.html−18

This diff is too big to show here.

searx/templates/simple/simple.spec.txt−40

This diff is too big to show here.

searx/templates/simple/stats.html−25

This diff is too big to show here.

searx/templates/simple/time-range.html−17

This diff is too big to show here.

searx/testing.py−119

This diff is too big to show here.

searx/translations/ar/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/ar/LC_MESSAGES/messages.po−1084

This diff is too big to show here.

searx/translations/bg/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/bg/LC_MESSAGES/messages.po−1084

This diff is too big to show here.

searx/translations/bo/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/bo/LC_MESSAGES/messages.po−1083

This diff is too big to show here.

searx/translations/ca/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/ca/LC_MESSAGES/messages.po−1084

This diff is too big to show here.

searx/translations/cs/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/cs/LC_MESSAGES/messages.po−1086

This diff is too big to show here.

searx/translations/cy/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/cy/LC_MESSAGES/messages.po−1082

This diff is too big to show here.

searx/translations/da/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/da/LC_MESSAGES/messages.po−1083

This diff is too big to show here.

searx/translations/de/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/de/LC_MESSAGES/messages.po−1099

This diff is too big to show here.

searx/translations/el_GR/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/el_GR/LC_MESSAGES/messages.po−1083

This diff is too big to show here.

searx/translations/en/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/en/LC_MESSAGES/messages.po−695

This diff is too big to show here.

searx/translations/eo/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/eo/LC_MESSAGES/messages.po−1085

This diff is too big to show here.

searx/translations/es/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/es/LC_MESSAGES/messages.po−1093

This diff is too big to show here.

searx/translations/et/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/et/LC_MESSAGES/messages.po−1083

This diff is too big to show here.

searx/translations/eu/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/eu/LC_MESSAGES/messages.po−1085

This diff is too big to show here.

searx/translations/fa_IR/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/fa_IR/LC_MESSAGES/messages.po−1087

This diff is too big to show here.

searx/translations/fi/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/fi/LC_MESSAGES/messages.po−1082

This diff is too big to show here.

searx/translations/fil/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/fil/LC_MESSAGES/messages.po−1083

This diff is too big to show here.

searx/translations/fr/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/fr/LC_MESSAGES/messages.po−1090

This diff is too big to show here.

searx/translations/gl/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/gl/LC_MESSAGES/messages.po−1083

This diff is too big to show here.

searx/translations/he/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/he/LC_MESSAGES/messages.po−1087

This diff is too big to show here.

searx/translations/hr/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/hr/LC_MESSAGES/messages.po−1083

This diff is too big to show here.

searx/translations/hu/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/hu/LC_MESSAGES/messages.po−1085

This diff is too big to show here.

searx/translations/ia/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/ia/LC_MESSAGES/messages.po−1082

This diff is too big to show here.

searx/translations/it/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/it/LC_MESSAGES/messages.po−1090

This diff is too big to show here.

searx/translations/ja/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/ja/LC_MESSAGES/messages.po−1090

This diff is too big to show here.

searx/translations/lt/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/lt/LC_MESSAGES/messages.po−1082

This diff is too big to show here.

searx/translations/nl/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/nl/LC_MESSAGES/messages.po−1085

This diff is too big to show here.

searx/translations/nl_BE/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/nl_BE/LC_MESSAGES/messages.po−1083

This diff is too big to show here.

searx/translations/oc/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/oc/LC_MESSAGES/messages.po−1083

This diff is too big to show here.

searx/translations/pl/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/pl/LC_MESSAGES/messages.po−1014

This diff is too big to show here.

searx/translations/pt/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/pt/LC_MESSAGES/messages.po−1083

This diff is too big to show here.

searx/translations/pt_BR/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/pt_BR/LC_MESSAGES/messages.po−1089

This diff is too big to show here.

searx/translations/ro/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/ro/LC_MESSAGES/messages.po−1085

This diff is too big to show here.

searx/translations/ru/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/ru/LC_MESSAGES/messages.po−1088

This diff is too big to show here.

searx/translations/sk/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/sk/LC_MESSAGES/messages.po−1082

This diff is too big to show here.

searx/translations/sl/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/sl/LC_MESSAGES/messages.po−1082

This diff is too big to show here.

searx/translations/sr/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/sr/LC_MESSAGES/messages.po−1084

This diff is too big to show here.

searx/translations/sv/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/sv/LC_MESSAGES/messages.po−1084

This diff is too big to show here.

searx/translations/ta/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/ta/LC_MESSAGES/messages.po−1087

This diff is too big to show here.

searx/translations/te/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/te/LC_MESSAGES/messages.po−1082

This diff is too big to show here.

searx/translations/tr/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/tr/LC_MESSAGES/messages.po−1085

This diff is too big to show here.

searx/translations/uk/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/uk/LC_MESSAGES/messages.po−1085

This diff is too big to show here.

searx/translations/vi/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/vi/LC_MESSAGES/messages.po−1082

This diff is too big to show here.

searx/translations/zh_CN/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/zh_CN/LC_MESSAGES/messages.po−1089

This diff is too big to show here.

searx/translations/zh_Hant_TW/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/zh_Hant_TW/LC_MESSAGES/messages.po−1014

This diff is too big to show here.

searx/translations/zh_TW/LC_MESSAGES/messages.mo

This diff is too big to show here.

searx/translations/zh_TW/LC_MESSAGES/messages.po−1086

This diff is too big to show here.

searx/utils.py−615

This diff is too big to show here.

searx/version.py−26

This diff is too big to show here.

searx/webadapter.py−250

This diff is too big to show here.

searx/webapp.py−1243

This diff is too big to show here.

searx/webutils.py−148

This diff is too big to show here.

searx_extra/__init__.py

This diff is too big to show here.

searx_extra/google_search.py−35

This diff is too big to show here.

searx_extra/standalone_searx.py−217

This diff is too big to show here.

searx_extra/update/__init__.py

This diff is too big to show here.

searx_extra/update/update_ahmia_blacklist.py−30

This diff is too big to show here.

searx_extra/update/update_currencies.py−150

This diff is too big to show here.

searx_extra/update/update_engine_descriptions.py−202

This diff is too big to show here.

searx_extra/update/update_external_bangs.py−157

This diff is too big to show here.

searx_extra/update/update_firefox_version.py−68

This diff is too big to show here.

searx_extra/update/update_languages.py−205

This diff is too big to show here.

searx_extra/update/update_osm_keys_tags.py−209

This diff is too big to show here.

searx_extra/update/update_pygments.py−138

This diff is too big to show here.

searx_extra/update/update_translations.sh−15

This diff is too big to show here.

searx_extra/update/update_wikidata_units.py−54

This diff is too big to show here.

setup.py−78

This diff is too big to show here.

tests/__init__.py−2

This diff is too big to show here.

tests/robot/__init__.py−75

This diff is too big to show here.

tests/unit/__init__.py

This diff is too big to show here.

tests/unit/engines/test_command.py−240

This diff is too big to show here.

tests/unit/engines/test_xpath.py−121

This diff is too big to show here.

tests/unit/network/__init__.py

This diff is too big to show here.

tests/unit/network/test_network.py−239

This diff is too big to show here.

tests/unit/settings/empty_settings.yml

This diff is too big to show here.

tests/unit/settings/syntaxerror_settings.yml−2

This diff is too big to show here.

tests/unit/settings/user_settings.yml−111

This diff is too big to show here.

tests/unit/settings/user_settings_keep_only.yml−14

This diff is too big to show here.

tests/unit/settings/user_settings_remove.yml−10

This diff is too big to show here.

tests/unit/settings/user_settings_remove2.yml−15

This diff is too big to show here.

tests/unit/settings/user_settings_simple.yml−9

This diff is too big to show here.

tests/unit/test_answerers.py−16

This diff is too big to show here.

tests/unit/test_engines_init.py−44

This diff is too big to show here.

tests/unit/test_external_bangs.py−117

This diff is too big to show here.

tests/unit/test_plugins.py−139

This diff is too big to show here.

tests/unit/test_preferences.py−140

This diff is too big to show here.

tests/unit/test_query.py−290

This diff is too big to show here.

tests/unit/test_results.py−41

This diff is too big to show here.

tests/unit/test_search.py−100

This diff is too big to show here.

tests/unit/test_settings_loader.py−122

This diff is too big to show here.

tests/unit/test_standalone_searx.py−111

This diff is too big to show here.

tests/unit/test_utils.py−228

This diff is too big to show here.

tests/unit/test_webadapter.py−54

This diff is too big to show here.

tests/unit/test_webapp.py−248

This diff is too big to show here.

tests/unit/test_webutils.py−87

This diff is too big to show here.

tox.ini−2

This diff is too big to show here.

user/index.html+116

This diff is too big to show here.

user/own-instance.html+172

This diff is too big to show here.

user/search_syntax.html+137

This diff is too big to show here.

utils/brand.env−9

This diff is too big to show here.

utils/build_env.py−38

This diff is too big to show here.

utils/filtron.sh−561

This diff is too big to show here.

utils/filtron.sh.html+301

This diff is too big to show here.

utils/index.html+217

This diff is too big to show here.

utils/lib.sh−1845

This diff is too big to show here.

utils/lxc-searx.env−97

This diff is too big to show here.

utils/lxc.sh−560

This diff is too big to show here.

utils/lxc.sh.html+361

This diff is too big to show here.

utils/makefile.include−103

This diff is too big to show here.

utils/makefile.lxc−32

This diff is too big to show here.

utils/morty.sh−546

This diff is too big to show here.

utils/morty.sh.html+304

This diff is too big to show here.

utils/searx.sh−914

This diff is too big to show here.

utils/searx.sh.html+177

This diff is too big to show here.

utils/templates/etc/apache2−1

This diff is too big to show here.

utils/templates/etc/filtron/rules.json−129

This diff is too big to show here.

utils/templates/etc/httpd/sites-available/morty.conf−28

This diff is too big to show here.

utils/templates/etc/httpd/sites-available/searx.conf:filtron−33

This diff is too big to show here.

utils/templates/etc/httpd/sites-available/searx.conf:uwsgi−27

This diff is too big to show here.

utils/templates/etc/nginx/default.apps-available/morty.conf−11

This diff is too big to show here.

utils/templates/etc/nginx/default.apps-available/searx.conf:filtron−16

This diff is too big to show here.

utils/templates/etc/searx/use_default_settings.yml−22

This diff is too big to show here.

utils/templates/etc/uwsgi/apps-archlinux/searx.ini−88

This diff is too big to show here.

utils/templates/etc/uwsgi/apps-archlinux/searx.ini:socket−85

This diff is too big to show here.

utils/templates/etc/uwsgi/apps-available/searx.ini−87

This diff is too big to show here.

utils/templates/etc/uwsgi/apps-available/searx.ini:socket−84

This diff is too big to show here.

utils/templates/lib/systemd/system/filtron.service−29

This diff is too big to show here.

utils/templates/lib/systemd/system/morty.service−29

This diff is too big to show here.