+<span class="w"> </span><span class="sd">"""Function that returns a list of answers to the question/query."""</span></div>
+<span class="w"> </span><span class="sd">"""Informations about the *answerer*, see :py:obj:`AnswererInfo`."""</span></div>
+<span class="w"> </span><span class="sd">"""Register a :py:obj:`Answerer` via its fully qualified class namen(FQN)."""</span>
+ <span class="n">_log_error_only_once</span><span class="p">(</span><span class="s2">"X-Forwarded-For header is not set!"</span><span class="p">)</span>
+ <span class="n">_log_error_only_once</span><span class="p">(</span><span class="s2">"X-Real-IP header is not set!"</span><span class="p">)</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">"IP from X-Real-IP (</span><span class="si">%s</span><span class="s2">) is not equal to IP from X-Forwarded-For (</span><span class="si">%s</span><span class="s2">)"</span><span class="p">,</span> <span class="n">real_ip</span><span class="p">,</span> <span class="n">forwarded_for</span><span class="p">)</span>
+ <span class="s2">"IP from WSGI environment (</span><span class="si">%s</span><span class="s2">) is not equal to IP from X-Forwarded-For (</span><span class="si">%s</span><span class="s2">)"</span><span class="p">,</span> <span class="n">remote_addr</span><span class="p">,</span> <span class="n">forwarded_for</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">"IP from WSGI environment (</span><span class="si">%s</span><span class="s2">) is not equal to IP from X-Real-IP (</span><span class="si">%s</span><span class="s2">)"</span><span class="p">,</span> <span class="n">remote_addr</span><span class="p">,</span> <span class="n">real_ip</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"argument 'base_dict' is not a ditionary type"</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"argument 'upd_dict' is not a ditionary type"</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"type mismatch </span><span class="si">{</span><span class="s1">'.'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">names</span><span class="p">)</span><span class="si">}</span><span class="s2">: is not a list type in base_dict"</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"type mismatch </span><span class="si">{</span><span class="s1">'.'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">names</span><span class="p">)</span><span class="si">}</span><span class="s2">: is not a set type in base_dict"</span><span class="p">)</span>
+ <span class="n">msg</span> <span class="o">+=</span> <span class="s2">" To remove IP from list, please contact the maintainer of the service."</span>
+ <span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="sa">f</span><span class="s2">"IP is not a member of an item in the f</span><span class="si">{</span><span class="n">list_name</span><span class="si">}</span><span class="s2"> list"</span>
+<span class="w"> </span><span class="sd">"""Specifies to which :ref:`engine categories` the engine should be added."""</span>
+<span class="w"> </span><span class="sd">"""Weighting of the results of this engine (:ref:`weight <settings engines>`)."""</span></div>
+<span class="w"> </span><span class="sd">"""To which locale value SearXNG's ``all`` language is mapped (shown a "Default</span>
+<span class="w"> </span><span class="sd">"""Store EngineTraitsMap in in file :py:obj:`self.ENGINE_TRAITS_FILE`"""</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">'An engine does not have a "name" field'</span><span class="p">)</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">'The "engine" field is missing for the engine named "</span><span class="si">{}</span><span class="s1">"'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">engine_name</span><span class="p">))</span>
+<span class="w"> </span><span class="sd">"""Fetch languages and other search arguments from Anna's search form."""</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">"Response from Anna's search page is not OK."</span><span class="p">)</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">"ERROR: response from wiki.archlinux.org is not OK."</span><span class="p">)</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">"ERROR: response from bing is not OK."</span><span class="p">)</span>
+ <span class="s1">'zh-hk'</span><span class="p">:</span> <span class="s1">'en-hk'</span><span class="p">,</span> <span class="c1"># not sure why, but at M$ this is the market code for Hongkong</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">"ERROR: response from Brave is not OK."</span><span class="p">)</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">"ERROR: response from Brave is not OK."</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'requested path is outside of configured working directory'</span><span class="p">)</span>
+<span class="w"> </span><span class="sd">"""Checks if delimiter based parsing or regex parsing is configured correctly"""</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'failed to init settings for parsing lines: too many settings'</span><span class="p">)</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">"ERROR: response from dailymotion/locales is not OK."</span><span class="p">)</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">"ERROR: response from dailymotion/languages is not OK."</span><span class="p">)</span>
+<span class="n">safesearch</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1"># user can't select but the results are filtered</span>
+ <span class="n">params</span><span class="p">[</span><span class="s1">'headers'</span><span class="p">][</span><span class="s1">'Sec-Fetch-Mode'</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"navigate"</span> <span class="c1"># at least this one is used by ddg's bot detection</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">"ERROR: response from DuckDuckGo is not OK."</span><span class="p">)</span>
+<span class="w"> </span><span class="sd">"""duckduckgo may return something like ``<a href="xxxx">http://somewhere Related website<a/>``</span>
+
+<span class="sd"> The href URL is broken, the "Related website" may contains some HTML.</span>
+
+<span class="sd"> The best solution seems to ignore these results.</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">"Response from Google's preferences is not OK."</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">"Response from https://www.google.com/supported_domains is not OK."</span><span class="p">)</span>
+ <span class="n">google_info</span><span class="p">[</span><span class="s1">'subdomain'</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'news.google.com'</span> <span class="c1"># google news has only one domain</span>
+<span class="sd">'''JSON query of result's ``url``. For the query string documentation see :py:obj:`results_query`'''</span>
+<span class="sd">'''JSON query of result's ``title``. For the query string documentation see :py:obj:`results_query`'''</span>
+<span class="sd">'''JSON query of result's ``content``. For the query string documentation see :py:obj:`results_query`'''</span>
+<span class="sd">'''JSON query of result's ``thumbnail``. For the query string documentation see :py:obj:`results_query`'''</span>
+<span class="sd">'''JSON query of result's ``suggestion``. For the query string documentation see :py:obj:`results_query`'''</span>
+ <span class="s2">"wikidata_id"</span><span class="p">:</span> <span class="s1">'Q47008412'</span><span class="p">,</span> <span class="c1"># the Mullvad id - not leta, but related</span>
+ <span class="nb">next</span><span class="p">:</span> <span class="nb">int</span> <span class="c1"># if -1, there no more results are available</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">"ERROR: failed to get response from mullvad-leta. Are you connected to the VPN?"</span><span class="p">)</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">"ERROR: response from mullvad-leta is not OK. Are you connected to the VPN?"</span><span class="p">)</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">"ERROR: could not find any tables. Was the page updated?"</span><span class="p">)</span>
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"ERROR: Mullvad-Leta country '</span><span class="si">{</span><span class="n">code</span><span class="si">}</span><span class="s2">' (</span><span class="si">{</span><span class="n">country</span><span class="si">}</span><span class="s2">) could not be mapped as expected."</span><span class="p">)</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">"ERROR: response from peertube is not OK."</span><span class="p">)</span>
+ <span class="s1">'Accept-Language'</span><span class="p">:</span> <span class="s2">"en-US,en;q=0.5"</span><span class="p">,</span> <span class="c1"># bing needs to set the English language</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">"ERROR: response from Startpage is not OK."</span><span class="p">)</span>
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"ERROR: language name of startpage's language </span><span class="si">{</span><span class="n">lang_code</span><span class="si">}</span><span class="s2"> is unknown by babel"</span><span class="p">)</span>
+<span class="n">DOWNLOAD_ERROR</span> <span class="o">=</span> <span class="n">gettext</span><span class="p">(</span><span class="s2">"The image could not be downloaded."</span><span class="p">)</span>
+<span class="w"> </span><span class="sd">"""Build TinEye HTTP request using ``search_urls`` of a :py:obj:`engine_type`."""</span>
+ <span class="nb">print</span><span class="p">(</span><span class="s2">"ERROR: response from Wikipedia is not OK."</span><span class="p">)</span>
+<span class="w"> </span><span class="sd">"""Fetch languages and other search arguments from zlibrary's search form."""</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">"Response from zlibrary's search page is not OK."</span><span class="p">)</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">"Favicons are cached in memory, don't use this in production!"</span><span class="p">)</span>
+<span class="w"> </span><span class="sd">"""Hold time (default in sec.), after which a BLOB is removed from the cache."""</span>
+<span class="w"> </span><span class="sd">"""An instance of the favicon cache is build up from the configuration."""</span>
+<span class="w"> </span><span class="sd">"""An instance of the favicon cache is build up from the configuration."""</span> <span class="c1">#</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">critical</span><span class="p">(</span><span class="s2">"don't use SQLite DB in :memory: in production!!"</span><span class="p">)</span>
+ <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">"no maintenance required yet, next maintenance interval is in the future"</span><span class="p">)</span>
+ <span class="k">return</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">properties</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s2">"LAST_MAINTENANCE"</span><span class="p">,</span> <span class="s2">""</span><span class="p">)</span> <span class="c1"># hint: this (also) sets the m_time of the property!</span>
+ <span class="sa">f</span><span class="s2">"config schema version </span><span class="si">{</span><span class="n">CONFIG_SCHEMA</span><span class="si">}</span><span class="s2"> is needed, version </span><span class="si">{</span><span class="n">schema</span><span class="si">}</span><span class="s2"> is given in </span><span class="si">{</span><span class="n">cfg_file</span><span class="si">}</span><span class="s2">"</span>
+ <span class="c1"># "dummy.old.foo": "config 'dummy.old.foo' exists only for tests. Don't use it in your real project config."</span>
+<span class="w"> </span><span class="sd">"""Returns ``True`` if limiter is active and a redis DB is available."""</span>
+<span class="w"> </span><span class="sd">"""Returns SearXNG's region tag from the locale (e.g. zh-TW , en-US)."""</span>
+<span class="w"> </span><span class="sd">"""Plugin is enabled/disabled by default (:py:obj:`PluginCfg.active`)."""</span>
+<span class="w"> </span><span class="sd">"""Plugin is active by default and the user can *opt-out* in the preferences."""</span></div>
+ <span class="n">description</span><span class="o">=</span><span class="n">gettext</span><span class="p">(</span><span class="s2">"Converts strings to different hash digests."</span><span class="p">),</span>
+ <span class="n">examples</span><span class="o">=</span><span class="p">[</span><span class="s2">"sha512 The quick brown fox jumps over the lazy dog"</span><span class="p">],</span>
+ <span class="n">description</span><span class="o">=</span><span class="n">gettext</span><span class="p">(</span><span class="s2">"Rewrite hostnames, remove results or prioritize them based on the hostname"</span><span class="p">),</span>
+<span class="w"> </span><span class="sd">"""Displays your IP if the query is "ip" and your user agent if the query is "user-agent"."""</span>
+ <span class="c1"># No answer, return error</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="n">gettext</span><span class="p">(</span><span class="s2">"Could not download the list of Tor exit-nodes from"</span><span class="p">)</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="n">gettext</span><span class="p">(</span><span class="s2">"You are using Tor and it looks like you have the external IP address"</span><span class="p">)</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="n">gettext</span><span class="p">(</span><span class="s2">"You are not using Tor and you have the external IP address"</span><span class="p">)</span>
+<span class="w"> </span><span class="sd">"""The collection of result types (which have already been implemented)."""</span>
+ <span class="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">publishedDate</span><span class="p">:</span> <span class="c1"># do not try to get a date from an empty string or a None type</span>
+ <span class="k">try</span><span class="p">:</span> <span class="c1"># test if publishedDate >= 1900 (datetime module bug)</span>
+<span class="w"> </span><span class="sd">"""Base class of all result types displayed in :ref:`area main results`."""</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"missing a value in field 'parsed_url': </span><span class="si">{</span><span class="bp">self</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"missing a value in field 'parsed_url': </span><span class="si">{</span><span class="bp">self</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Translation does not have an item in the list translations"</span><span class="p">)</span>
+<span class="w"> </span><span class="sd">"""Dictionary with keys and values. To sort keys, use :py:obj:`OrderedDict`."""</span>
+ <span class="n">SQLITE_CONNECT_ARGS</span><span class="p">[</span><span class="s2">"autocommit"</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1"># This option has no effect before Python 3.12</span>
+<span class="w"> </span><span class="sd">"""Normalize URL: add protocol, join URL with base_url, add trailing slash if there is no path</span>
+<span class="w"> </span><span class="sd">"""Determine the *human readable* value of bytes on 1024 base (1KB=1024B)."""</span>
+<span class="w"> </span><span class="sd">"""Return engine configuration from settings.yml of a given engine name"""</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'xpath_spec must be either a str or a lxml.etree.XPath'</span><span class="p">)</span></div>
+ <span class="k">raise</span> <span class="n">SearxEngineXPathException</span><span class="p">(</span><span class="n">xpath_spec</span><span class="p">,</span> <span class="s1">'the result is not a list'</span><span class="p">)</span>
+<span class="w"> </span><span class="sd">"""Parse a time string in format MM:SS or HH:MM:SS and convert it to a `timedelta` object.</span>
+
+<span class="sd"> Returns None if the provided string doesn't match any of the formats.</span>